Introduction : « Votre logo ne fonctionne pas, et la base de données pleure »
\n\nSi vous avez déjà écrit un script PHP qui interagit avec MySQL, vous avez forcément croisé cette phrase effrayante :
\nWarning: mysql_fetch_array() expects parameter 1 to be resource, boolean given.
Commençons par une bonne nouvelle : ce n'est pas la fin du monde. C'est simplement un signal de PHP : « Hé, je ne peux pas extraire des données de ce que tu m'as passé ! ».
\n\nDans ce tutoriel, nous allons voir pourquoi l'erreur mysql_fetch_array() expects parameter 1 to be resource se produit, comment la corriger, et surtout comment ne plus jamais la voir (spoiler : en passant à PDO ou MySQLi).
Cet article est spécialement rédigé pour pythonlib.ru — un portail éducatif où nous apprenons à coder sans douleur. C'est parti !
\n\nPourquoi PHP crie-t-il sur le paramètre ? (les causes)
\n\nPour comprendre la racine du problème, rappelons comment fonctionnent les anciennes fonctions mysql_* (oui, celles qui sont obsolètes depuis PHP 5.5).
Un code typique de débutant ressemble à ceci :
\n// Connexion\n$link = mysql_connect('localhost', 'user', 'password');\nmysql_select_db('test');\n\n// Requête (avec une erreur)\n$result = mysql_query("SELECT * FROM users WHERE id = '1");\n\n// Tentative de lecture\nwhile($row = mysql_fetch_array($result)) { // Erreur !\n echo $row['name'];\n}\n\nQu'est-ce qui cloche ici ? Tout ! Mais le principal : mysql_query() a retourné false, et non une ressource. Pourquoi ?
- \n
- Erreur de syntaxe SQL — un guillemet n'est pas fermé. \n
- Pas de connexion à la BDD —
mysql_connect()a retourné false. \n - Base de données non sélectionnée —
mysql_select_db()a échoué. \n - La table n'existe pas. \n
Quand mysql_query() échoue, il retourne false (un booléen), et non une ressource. Vous essayez ensuite de passer false à mysql_fetch_array(), qui attend une ressource. Conflit ! D'où l'erreur.
Quelles fonctions sont concernées ?
\n- \n
mysql_fetch_array()\n mysql_fetch_assoc()\n mysql_fetch_row()\n mysql_num_rows()\n mysql_data_seek()\n
Toutes crient la même chose : « expects parameter 1 to be resource ».
\n\nCorrection étape par étape (pour l'ancien code)
\n\nSi vous avez un projet legacy et que vous ne pouvez pas encore mettre à jour PHP (bien que je le recommande vivement), voici comment détecter et corriger l'erreur.
\n\nÉtape 1. Vérifier la connexion
\n$link = mysql_connect('localhost', 'user', 'password');\nif (!$link) {\n die('Erreur de connexion : ' . mysql_error());\n}\n\nÉtape 2. Vérifier la sélection de la base
\nif (!mysql_select_db('ma_base')) {\n die('Impossible de sélectionner la BDD : ' . mysql_error());\n}\n\nÉtape 3. Exécuter la requête avec vérification
\n$sql = "SELECT * FROM users WHERE id = 1";\n$result = mysql_query($sql);\n\nif (!$result) {\n die('Erreur de requête : ' . mysql_error());\n}\n\n// Maintenant, on peut utiliser en toute sécurité\nwhile($row = mysql_fetch_assoc($result)) {\n echo $row['name'];\n}\n\nVous voyez la différence ? Nous vérifions chaque étape. Si mysql_query() retourne false — on s'arrête avec un message d'erreur, au lieu de passer false plus loin.
Pourquoi ça fonctionne encore ? (contexte historique)
\n\nSur Stack Overflow, cette question cumule des milliers de vues. Et ce n'est pas surprenant : de nombreux hébergeurs font encore tourner du PHP 5.x, et des tonnes de tutoriels (même sur YouTube) enseignent encore avec mysql_*.
Mais retenez-le une fois pour toutes : l'extension mysql est obsolète et a été supprimée dans PHP 7.0. Si vous écrivez du nouveau code, utilisez mysqli ou PDO.