web-dev-qa-db-ja.com

SELECT句に2つの列がある場合、クエリは単一の値を返します

スクリプトの前半にデータベース接続があります。

$db = JFactory::getDbo();

クエリコードは次のとおりです。

$albumartistidquery = $db->getQuery(true);

$albumartistidquery->select($db->quoteName(array('artist_id', 'artist_name')));
$albumartistidquery->from($db->quoteName('#__vinylvault_artists'));
$albumartistidquery->lookup($db->quoteName('artist_name'));
$albumartistidquery->where($db->quoteName('artist_id') . ' LIKE '. $db->quote($releaseartistid));

$db->setQuery($albumartistidquery);

// Load the results
$dbalbumartist = $db->loadResult();

$dbalbumartistには関連する'artist_name'フィールドの内容が含まれているはずですが、$dbalbumartistをエコーすると、artist_id列の値が表示されます。

誰かが私がどこが間違っているのか、そしてどのように修正するのかアドバイスできますか?

1
Rich Starkie

ほとんどの場合、コードはかなり正しいです。コメントされているように、あなたは->lookup()-現在前例のないメソッドを使用しています。

通常、LIKE演算子は、___または_%_ワイルドカード記号も使用する場合にのみ使用します。 LIKE条件が_$releaseartistid_文字列全体と一致しているため、LIKEを_=_で置き換える方がより論理的に思われます。

loadResult() メソッドは、結果セットに単一の値のみが必要な場合に使用します。クエリは2列のデータを返すため、1行のデータが必要な場合は、loadRow()loadAssoc()、またはloadObject()を使用できます。結果セットに複数のデータ行が含まれている可能性がある場合は、 Mult-Row Methods を参照し、プロジェクトに最適な方法を決定します。

_$releaseartistid_値が整数であると想定すると、値を_(int)_としてキャストすることにより、値を引用符で囲むことを避け、セキュリティを維持できます。

個人的な好みの問題として、私は純粋にコードを簡潔にするためにqn()quoteName()を使用しています。

推奨されるコード:

_$db = JFactory::getDBO();
try {
    $albumartistidquery = $db->getQuery(true)
                             ->select($db->qn(array('artist_id', 'artist_name')))
                             ->from($db->qn('#__vinylvault_artists'))
                             ->where($db->qn('artist_id') . ' = ' . (int)$releaseartistid);
    echo $albumartistidquery->dump();    // never expose this on your live/public site
    $db->setQuery($albumartistidquery);
    echo "<pre>";
        var_export($db->loadAssoc());  // display the resultset
    echo "</pre>";
} catch (Exception $e) {
    echo "<div>", $e->getMessage(), "</div>";  // never expose this on your live/public site
}
_

最後に、ワイルドカードでLIKEを使用したい場合は、この投稿を参照して説明します クエリのセキュリティを維持するために、適切なJoomlaエスケープ構文でLIKEを使用する方法

1
mickmackusa