web-dev-qa-db-fra.com

Erreur de syntaxe SQL lors de la tentative de filtrage de la vue liste - Comment construire la clause WHERE?

J'ai construit un composant Joomla pour une école en utilisant composant-creator.com et maintenant j'essaie de modifier les fichiers source.

Ma vue actuelle répertorie tous les parents et les élèves de ma base de données, visibles pour tous les utilisateurs enregistrés. J'essaie de modifier la requête SQL dans models/students.php pour afficher uniquement les étudiants associés à l'utilisateur actuellement connecté. J'ai essayé de le faire en modifiant la clause where, mais je continue à avoir une erreur de syntaxe.

Voici le code original de models/students.php , qui affiche tous les étudiants et les parents à quiconque ayant la permission de consulter le formulaire.

public function getItems()
    {
        $items = parent::getItems();

        foreach ($items as $item)
        {
            if (isset($item->parent) && $item->parent != '')
            {
                if (is_object($item->parent))
                {
                    $item->parent = \Joomla\Utilities\ArrayHelper::fromObject($item->parent);
                }

                $values = (is_array($item->parent)) ? $item->parent : explode(',', $item->parent);
                $textValue = array();

                foreach ($values as $value)
                {
                    $db = JFactory::getDbo();
                    $query = $db->getQuery(true);
                    $query
                            ->select('`#__users_2679886`.`name`')
                            ->from($db->quoteName('#__users', '#__users_2679886'))
                        ->where($db->quoteName('id') . ' = ' . $db->quote($db->escape($value)));
                    $db->setQuery($query);
                    $results = $db->loadObject();

                    if ($results)
                    {
                        $textValue[] = $results->name;
                    }
                }

                $item->parent = !empty($textValue) ? implode(', ', $textValue) : $item->parent;
            }

        }

        return $items;
    }

Et voici la section du code que j'ai modifiée, générant une erreur de syntaxe:

            $db = JFactory::getDbo();
            $user = JFactory::getUser();
            $query = $db->getQuery(true);
            $query
                    ->select('`#__users_2679886`.`name`')
                    ->from($db->quoteName('#__users', '#__users_2679886'))
                ->where($db->quoteName('id') . ' = ' . $db->quote($db->escape($value)) AND parent.id = $user->id);
            $db->setQuery($query);
            $results = $db->loadObject();

J'ai simplement essayé de modifier la cause WHERE en ajoutant AND parent.id = $user->id, mais l'erreur de syntaxe renvoyée est la suivante: erreur de syntaxe, '=' inattendu, attente de ',' ou ')'

Je cherche de l'aide pour modifier mon code spécifique ainsi qu'une explication de la clause WHERE, car la syntaxe SQL chaînée de Joomla est déroutante pour moi et j'aurai besoin d'effectuer plusieurs opérations WHERE dans la conception de mon site. J'ai consulté ici et ici , mais je n'arrive pas à trouver un guide clair montrant comment construire et enchaîner la déclaration WHERE.

Toute idée est appréciée. Merci.

3
Nathanael

Essayez de modifier votre requête comme suit:

$query->select('#__users_2679886', 'name')
      ->from($db->qN('#__users', '#__users_2679886'))
      ->where($db->qN('id') . ' = ' . $db->q($value)
      ->where($db->qN('parent.id') . ' = ' . $user->id);

Le problème venait de $db->q(parent.id = $user->id).

Autre que cela, j'ai fait quelques ajustements à la requête pour vous.

Notez simplement que vous n'avez pas besoin de faire $db->quote($db->escape('XXX')), juste $db->quote('XXX') tout va bien.

4
Lodder