web-dev-qa-db-fra.com

Clause WHERE SQL avec une variable (ID d'article actuel)

J'essaie de faire un calcul simple sur deux champs personnalisés Joomla dans un module. J'obtiens l'ID d'article sous forme de variable et je souhaite l'insérer dans la clause WHERE pour obtenir la valeur de champ personnalisée appropriée. J'ai essayé beaucoup de choses, mais je n'y arrive pas. Field_id correspond à 4 du champ dont j'ai besoin et lorsque je renseigne l'ID d'article sous forme de numéro, cela fonctionne, mais je ne parviens pas à faire fonctionner la variable (ce dont j'ai besoin, le module utilise donc l'ID d'article). J'espère que quelqu'un pourra m'aider?

$article_id = JFactory::getApplication()->input->get('id');

   $db = JFactory::getDbo();
   $query = $db->getQuery(true);
   $query->select('value', 'item_id', 'field_id')
         ->from ($db->quoteName('#__fields_values'))
         ->where($db->quoteName('#__fields_values.field_id=4'))
         ->where($db->quoteName('#__fields_values.item_id')=$article_id);
   $db->setQuery($query);


     $result = $db->loadResult();
     return $result;

Merci!

1
Wil-It

Votre code contient plusieurs erreurs, y compris une erreur de syntaxe. Vous devez utiliser un IDE avec des indications de complétion de code et de signature correctes (tout IDE moderne devrait pouvoir le faire).

  1. $query->select('value', 'item_id', 'field_id'):

    JDatabaseQuery::select() prend exactement le paramètre n. S'il ne s'agit que d'un seul champ, vous pouvez directement fournir le nom sous forme de chaîne. sinon, il doit s'agir d'un tableau de noms de champs. Dans tous les cas, les noms de champs doivent être échappés. Votre code ne cède que lorsque vous sélectionnez value.

  2. ->where($db->quoteName('#__fields_values.field_id=4')):

    JDatabaseDriver::quoteName() prend un nom de champ et éventuellement un alias comme paramètre, pas une expression. Votre code produit `#__fields_values`.`field_id=4`, Entraînant une erreur SQL. De plus, comme vous travaillez avec une seule table, il n'est pas nécessaire de posséder des noms de colonne complets.

  3. ->where($db->quoteName('#__fields_values.item_id')=$article_id):

    Vous essayez d'affecter une valeur à une fonction, ce qui entraîne une erreur de syntaxe. En outre, vous ne désinfectez pas les entrées utilisateur, ce qui rend votre code vulnérable aux injections SQL.

  4. $result = $db->loadResult():

    Puisque vous n'obtenez qu'un seul champ, pourquoi essayez-vous de sélectionner trois champs?

Si vous corrigez les problèmes, votre code ressemble à ceci:

$article_id = JFactory::getApplication()->input->get('id');

$db    = JFactory::getDbo();
$query = $db->getQuery(true);

$query
    ->select($db->quoteName('value'))
    ->from($db->quoteName('#__fields_values'))
    ->where($db->quoteName('field_id') . '=4')
    ->where($db->quoteName('item_id') . '=' . (int) $article_id)
;
$db->setQuery($query);

return $db->loadResult();

et devrait fonctionner comme prévu.

3
nibra