Erreur mysql_fetch_array() : paramètre 1 doit être une ressource — correction

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : « Votre logo ne fonctionne pas, et la base de données pleure »

\n\n

Si 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.

\n\n

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\n

Dans 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).

\n\n

Cet article est spécialement rédigé pour pythonlib.ru — un portail éducatif où nous apprenons à coder sans douleur. C'est parti !

\n\n

Pourquoi PHP crie-t-il sur le paramètre ? (les causes)

\n\n

Pour comprendre la racine du problème, rappelons comment fonctionnent les anciennes fonctions mysql_* (oui, celles qui sont obsolètes depuis PHP 5.5).

\n\n

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\n

Qu'est-ce qui cloche ici ? Tout ! Mais le principal : mysql_query() a retourné false, et non une ressource. Pourquoi ?

\n\n
    \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
\n\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.

\n\n

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
\n\n

Toutes crient la même chose : « expects parameter 1 to be resource ».

\n\n

Correction étape par étape (pour l'ancien code)

\n\n

Si 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

\n
if (!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\n

Vous 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.

\n\n

Pourquoi ça fonctionne encore ? (contexte historique)

\n\n

Sur 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_*.

\n\n

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.

Blogs

Book Recommendations