web-dev-qa-db-fra.com

Une requête donne une valeur unique lorsque deux colonnes de la clause SELECT

J'ai une connexion de base de données plus tôt dans le script.

$db = JFactory::getDbo();

Voici le code de requête:

$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();

Je m'attends à ce que $dbalbumartist Contienne le contenu du champ 'artist_name' Pertinent, mais lorsque j'échoise $dbalbumartist, Il affiche la valeur de la colonne artist_id.

Quelqu'un peut-il conseiller où je me suis trompé et comment y remédier?

1
Rich Starkie

Pour la plupart, votre code est plutôt correct. Comme commenté, vous utilisez ->lookup() - une méthode inconnue à l’heure actuelle.

En règle générale, vous utiliseriez uniquement l'opérateur LIKE si vous utilisiez également les symboles génériques _ Ou %. Parce que votre condition LIKE correspond à la chaîne entière $releaseartistid, Il semble plus logique de remplacer LIKE par =.

La méthode loadResult () doit être utilisée lorsque vous attendez une seule valeur dans le jeu de résultats. Votre requête renvoie deux colonnes de données. Par conséquent, si vous attendez une seule ligne de données, vous préférerez peut-être loadRow(), loadAssoc() ou loadObject(). Si votre jeu de résultats peut contenir plusieurs lignes de données, reportez-vous à la section Méthodes à plusieurs lignes et déterminez la méthode la mieux adaptée à votre projet.

En supposant que votre valeur $releaseartistid Soit un entier, vous pouvez éviter de mettre la valeur entre guillemets et maintenir la sécurité en convertissant la valeur sous la forme (int).

Par préférence personnelle, j'utilise qn() contre quoteName() uniquement pour la brièveté du code.

Code suggéré:

$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
}

Enfin, si vous voulez utiliser LIKE avec des caractères génériques, je vous renverrai à ce message où j'explique comment utiliser LIKE avec la syntaxe d'échappement correcte de Joomla pour maintenir la sécurité des requêtes .

1
mickmackusa