web-dev-qa-db-fra.com

L'utilisation de JDatabaseQuery :: union () provoque des erreurs

Je reçois des erreurs lorsque j'utilise JDatabaseQuery :: union () pour créer une requête de base de données.

Lorsque Debug est désactivé, je reçois ceci au bas de la page, probablement lorsque j'essaie de me déconnecter:

Avertissement: mysqli :: stat (): Impossible de récupérer mysqli dans ... /libraries/joomla/database/driver/mysqli.php à la ligne 219

Avertissement: mysqli_close (): impossible d'extraire mysqli dans ... /libraries/joomla/database/driver/mysqli.php à la ligne 226

Lorsque Debug est activé, je reçois un message supplémentaire lorsque la requête est en cours:

Avis: unserialize (): erreur au décalage ... dans ... /libraries/joomla/database/query.php à la ligne 1472

Cette erreur fait référence à cette ligne de JDatabaseQuery :: __ clone ():

$this->{$k} = unserialize(serialize($v));

Ce problème se répète sur différentes versions de MySQL, PHP 5.x et les versions de Joomla sur XAMPP et Ubuntu Server. Je l’avais découvert lors du développement d’un composant, mais il apparaît sur une nouvelle installation de Joomla avec un Nettoyer la base de données sur un serveur propre. La mise en cache est désactivée, la session étant à 120 minutes. Pour répéter le problème, remplacez ContentModelArticles :: getListQuery () dans /administrator/components/com_content/models/articles.php par:

protected function getListQuery()
    {
        // Create a new query object.
        $db = $this->getDbo();
        $query = $db->getQuery(true);
        $sub = $db->getQuery(true);

        // Select the required fields from the first table.
        $query->select('id')
            ->from('#__content');

        // Select the required fields from the second table.
        $sub->select('content_id')
            ->from('#__content_rating');

        $query->union($sub);

        return $query;
    }

Si je fais de la sous-requête une chaîne plutôt qu'un objet JDatabaseQueryMysqli, cependant, il n'y a pas de problèmes:

protected function getListQuery()
    {
        // Create a new query object.
        $db = $this->getDbo();
        $query = $db->getQuery(true);

        // Select the required fields from the first table.
        $query->select('id')
            ->from('#__content');

        $query->union('SELECT content_id FROM #__content_rating');

        return $query;
    }

Si je fais quelque chose de mal, c'est avec les objets de requête. J'ai jeté un coup d'œil au message pertinent docs , trouvé this forum, et j'ai suivi le conseil de copier l'exemple depuis/administrator/components/com_Finder/helpers/indexer/query.php, qui clone et modifie le premier objet de requête plutôt que d'en créer un nouveau. Tout en rien. Il y a quelques indications dans ce fil de discussion et dans d'autres endroits en ligne qu'il s'agisse d'un bogue, mais tout ce que j'ai trouvé est assez ancien et ce bogue était apparemment adressé.

Est-ce un problème avec Joomla ou moi?

3
chrBrd

J'ai eu des expériences étranges avec les requêtes Jdatabase et Union. Parfois, si je n'arrive pas à obtenir la syntaxe correcte pour cela, ce que je fais est juste quelque chose comme $ query = "[écrivez votre requête manuellement ici]" puis $ db-> setQuery ($ query), etc. Probablement pas beaucoup d'aide, mais j'ai pensé que j'ajouterais que ...

1
Jim Dee