web-dev-qa-db-fra.com

Administrateur com_plugins issue / bug (?) - Colonne d'erreur 'type' dans la clause where est ambiguë

Sur un site sur lequel je travaille depuis longtemps, j'ai soudainement rencontré ce problème. Lorsque je suis allé sur com_plugins pour modifier les paramètres de mes plugins, j'ai eu l'erreur ci-dessous et la liste des plugins ne s'affichait pas.

Erreur

La colonne 'type' dans la clause où est ambiguë

SQL = SELECT COUNT (*) FROM `#__ extensions` EN TANT QUE JOINT GAUCHE #__utilisateurs SOUS uc ON uc.id = a.checked_out LEFT JOIN #__viewlevels AS ag.id = a.access WHERE` type` = 'plugin' AND (a.enabled IN (0, 1)) AND a.state> = 0

La colonne 'type' dans la clause où est ambiguë

SQL = SELECT id.extension.id, a.name, a.element, a.folder, a.checked_out, a.checked_out_time, a.enabled, a.access, a.ordering, uc.name AS éditeur, ag.title AS access_level FROM `#__ extensions` EN TANT QUE JOINDRE GAUCHE #__utilisateurs AS uc ON uc.id = a.checked_out LEFT JOIN #__viewlevels AS ag.id = a.access WHERE` type` = 'plugin' AND (a.enabled IN ( 0, 1)) AND a.state> = 0 ORDER BY `folder` asc, a.ordering ASC LIMIT 0, 20

La colonne 'type' dans la clause où est ambiguë

SQL = SELECT COUNT (*) FROM `#__ extensions` EN TANT QUE JOINT GAUCHE #__utilisateurs SOUS uc ON uc.id = a.checked_out LEFT JOIN #__viewlevels AS ag.id = a.access WHERE` type` = 'plugin' AND (a.enabled IN (0, 1)) AND a.state> = 0

La clause where type= 'plugin' Est ambiguë. J'ai vérifié le modèle de plug-ins de com_plugins dans une nouvelle installation de joomla, ainsi que dans quelques versions plus anciennes de J3. La partie du code en question se trouve à peu près à la ligne 211, dans la méthode getListQuery().

// Select the required fields from the table.
    $query->select(
        $this->getState(
            'list.select',
            'a.extension_id , a.name, a.element, a.folder, a.checked_out, a.checked_out_time,' .
                ' a.enabled, a.access, a.ordering'
        )
    )
        ->from($db->quoteName('#__extensions') . ' AS a')
        ->where($db->quoteName('type') . ' = ' . $db->quote('plugin'));

Toutes les installations viennent comme ça et ce qui est étrange, c’est que cela fonctionnait toujours dans tous les sites Joomla, mais du coup, pas sur celui-ci.

Exécutant la même requête directement dans les bases de données Joomla, cela fonctionne pour les autres installations de base de données Joomla, mais pas pour celle-ci, où il génère également la même erreur à propos de la colonne "type" ambiguë dans où.

Changer la requête dans la méthode de where type = 'plugin' À where a.type = 'plugin', Ce qui est logique dans la mesure où il s'agit d'une liste jointe, et de cette manière le champ type fait référence à sa table, le problème a disparu.

Quelqu'un at-il remarqué ce genre de problème avec les com_plugins?

4
FFrewin

Pour aliaser une table, vous remplacez votre code actuel:

->from($db->quoteName('#__extensions') . ' AS a')

avec:

->from($db->quoteName('#__extensions', 'a'))

Cela générera automatiquement AS a.

Maintenant que vous utilisez un alias, vous devez remplacer:

->where($db->quoteName('type')

avec:

->where($db->quoteName('a.type')
1
Lodder

Avez-vous vérifié que ce site DID N'A PAS de colonne type dans la colonne #__users et/ou #__viewlevels les tables?

La seule cause possible que je puisse comprendre est que l’un (ou les deux, mais j'en doute) de ces tables a gagné une colonne type comme un coup du développement involontaire. Y a-t-il une chance que vous chargiez une extension qui a modifié une de ces tables principales?

Le erreur de colonne ambiguë ne peut être généré qu'à la suite de plusieurs tables contenant la même colonne.

Comme Lodder l'a indiqué, le moyen de réduire l'erreur sans modifier la base de données consiste à déclarer explicitement le nom de la table (ou son alias) à partir de la colonne cible.

Cela dit, comme les fichiers de base de Joomla ne sont pas écrits pour nommer un nom de table avant la colonne type, il est conseillé de rechercher la table avec la colonne supplémentaire type (enregistrer une sauvegarde de la table). ), supprimez la colonne non conforme type de la table, puis exécutez tout et voyez ce qui se passe lorsque la colonne inattendue est manquante. Ce processus médico-légal fera partie intégrante de la découverte de la source du problème. Là encore, si rien ne se casse après la suppression de la colonne, la cause en sera un mystère, mais l'erreur doit être définitivement supprimée.

0
mickmackusa