Introduction : cette fameuse erreur qui donne envie de fermer le navigateur
Si vous avez déjà écrit une requête PHP vers MySQL et soudainement vu dans le navigateur quelque chose comme :
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/site/index.php on line 15...alors vous connaissez ce sentiment. Tout semble correct : connexion établie, requête écrite, mais PHP vous crie dessus en rouge. C'est particulièrement frustrant quand le code fonctionne sur le serveur local, mais pas sur l'hébergement. Ou l'inverse.
Cette erreur est l'une des plus populaires sur Stack Overflow. Des milliers de développeurs (et nous en faisons partie) se sont cogné la tête contre le clavier en essayant de comprendre : « Pourquoi le paramètre 1 attend une ressource, mais reçoit un booléen ? »
Dans cet article, nous n'allons pas simplement analyser la cause, mais parcourir le chemin complet : de la reproduction de l'erreur à sa correction. Et en profiter pour voir pourquoi les anciennes fonctions mysql_* devraient depuis longtemps être remplacées par les modernes PDO ou MySQLi. C'est parti !
À quoi ressemble le problème en pratique
Simulons une situation. Vous avez une table users, et vous voulez afficher tous les utilisateurs. Le code est écrit à l'ancienne :
$link = mysql_connect('localhost', 'user', 'password');mysql_select_db('test');
$result = mysql_query("SELECT * FROM users");
while ($row = mysql_fetch_array($result)) { echo $row['name'] . '<br>';}C'est un classique. Mais si la table users n'existe pas, ou s'il y a une erreur de syntaxe SQL, alors mysql_query() ne retournera pas une ressource, mais false. Et donc mysql_fetch_array() reçoit un booléen au lieu d'une ressource — d'où l'erreur.
Le plus souvent, le problème réside dans l'échec de l'exécution de la requête. Mais examinons toutes les causes possibles dans l'ordre.
Cause n°1 : La requête SQL a retourné false
C'est la situation la plus courante. mysql_query() retourne false si la requête a échoué. Par exemple :
- La table n'existe pas
- Nom de champ incorrect
- Erreur de syntaxe dans le SQL
- Problèmes de droits d'accès
Comment vérifier ? Ajoutez simplement une vérification après la requête :
$result = mysql_query("SELECT * FROM non_existent_table");
if (!$result) { die('Erreur de requête : ' . mysql_error());}
while ($row = mysql_fetch_array($result)) { // ...}Cela montrera immédiatement le problème. mysql_error() affichera le texte de l'erreur, par exemple : "Table 'test.non_existent_table' doesn't exist".
Cause n°2 : Perte de connexion à la base de données
Parfois, la connexion est interrompue (par exemple, à cause d'un timeout ou d'un redémarrage de MySQL). Alors mysql_query() retournera aussi false. La solution est de toujours vérifier la connexion :
$link = mysql_connect('localhost', 'user', 'password');if (!$link) { die('Échec de la connexion : ' . mysql_error());}Mais même cela n'est pas une panacée. Il est préférable d'utiliser des fonctions capables de se reconnecter automatiquement — par exemple, MySQLi.
Cause n°3 : Vous mélangez les fonctions mysql_* et mysqli_*
Un autre cas fréquent. Vous pouvez accidentellement mélanger deux bibliothèques différentes. Par exemple, vous connecter via mysqli_connect(), mais faire la requête avec mysql_query(). Cela ne fonctionnera pas : mysql_query() attend une ressource de mysql_connect(), pas de mysqli_connect().
Voici un exemple de confusion :
// Connexion via MySQLi$link = mysqli_connect('localhost', 'user', 'password', 'test');
// Mais requête via l'ancienne mysql_*$result = mysql_query("SELECT * FROM users"); // Erreur !
while ($row = mysql_fetch_array($result)) { echo $row['name'];}La solution est de s'en tenir à une seule bibliothèque. So