Je fais tourner un serveur mediawiki depuis de nombreuses années dans mon entreprise. Récemment, pour résoudre un problème de téléchargement de PDF contenant des métadonnées, je suis passé à la dernière révision de tous les logiciels sur ma boîte Gentoo (Mediawiki 1.18.1, PHP 5.4.0, PostgreSQL 9.1.3).
Désormais, certaines pages (deux pages de catégories très utilisées) renvoient la même erreur PHP.
Avertissement : Illegal string offset 'LIMIT' in /var/www/localhost/htdocs/includes/db/Database.php on line 1377
Il y a ensuite 5 ou 6 plaintes concernant cette erreur. Puis vient la ligne :
Avertissement : Invalid argument supplied for foreach() in /var/www/localhost/htdocs/includes/resourceloader/ResourceLoaderWikiModule.php on line 177
Il dit ensuite qu'il s'agit d'une erreur interne de mediawiki.
Il m'indique ensuite que l'exception d'origine :
Exception originale : exception 'DBQueryError' avec le message 'Une erreur de base de données s'est produite. Avez-vous oublié d'exécuter maintenance/update.php après la mise à jour ? Voir : http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script Requête : SELECT COUNT(*) AS pages,COUNT( (CASE WHEN page_namespace=14 THEN 1 ELSE NULL END) ) AS subcats,COUNT( (CASE WHEN page_namespace=6 THEN 1 ELSE NULL END) ) AS files FROM "categorylinks", "page" WHERE cl_to = 'Item_Groups' AND (page_id = cl_from) LOCK IN SHARE MODE
Fonction : Category::refreshCounts
Erreur : 1 ERREUR : erreur de syntaxe à ou près de "LOCK"
LIGNE 1 : ...E cl_to = 'Item_Groups' AND (page_id = cl_from) LOCK IN SH...
Je suis allé dans la base de données et j'ai constaté que lorsque j'exécute cette même requête à partir de la base de données elle-même, j'obtiens la même erreur et le même résultat.
Et OUI, j'ai exécuté la fonction update.php.
J'ai essayé de supprimer de manière détournée les pages concernées (en appliquant manuellement l'URL directement au formulaire de suppression). J'ai ensuite purgé la base de données de toutes les pages archivées (AKA, pages supprimées) en utilisant le script de maintenance script. En vain. La base de données a un problème bizarre avec ces pages, et je n'arrive pas à comprendre comment les purger pour pouvoir les recréer !