par
ouckileou » 10 juin 2006, 15:06
Si vous obtenez ce genre d'erreurs PHP :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in à la ligne n
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in à la ligne n
ou tout autre message identique avec n'importe quelle fonction PHP nécessitant une
ressource de type
mysql result...
Il y a de fortes chances que l'exécution de votre requête SQL ait échoué
Même chose si vous attendiez un tableau rempli de données à l'affichage, et qu'il est tout vide...
Bref, dès que vous exécutez une requête SQL via PHP et qu'elle ne fonctionne pas, ou produit des résultats surprenants, avant toute autre chose, voici les étapes à suivre pour tenter de trouver l'erreur :
- Faites afficher les messages d'erreur MySQL dans votre script PHP (valable pour toutes les méthodes d'accès à un SGBD: connexion au serveur, sélection de la base, requête etc) :
mysql_query($requeteSQL) or die (mysql_error());
et lisez ces messages 
- Faites afficher le SQL généré, c'est à dire la chaîne contenant votre requête et qui résultera d'une concaténation avec des variables par exemple.
C'est ce code SQL qui est important et que vous devrez fournir lors d'une question sur ce forum.
// cette ligne ne sera pas utile pour vous aider, car on ne sait pas ce que contient $variable
$requeteSQL = "SELECT * FROM table1 WHERE colonne2 = '".$variable."'";
// par contre le résultat de ceci est utile, car on connaîtra ainsi le SQL réellement exécuté par le serveur de base de données
echo $requeteSQL;
- Regardez si rien ne cloche dans ce SQL, certaines erreurs de syntaxe se remarquent tout de suite.
- Faites des essais, et testez-les directement dans MySQL, via phpMyAdmin ou une autre interface de MySQL.
Au passage, une bonne habitude est de créer un modèle de requête qui marche puis d'insérer ce code SQL dans le script PHP pour le rendre dynamique. Autant ne pas multiplier les risques d'erreur en testant à la fois le PHP et le SQL.
- Si vous essayer de sélectionner et d'afficher des données, que la requête est bonne (c'est à dire que le SQL généré et testé directement sur le serveur de base de données renvoie les bons résultats, affichez le tableau directement, en dehors d'une éventuelle boucle, et vous ciblerez peut-être mieux le problème. Exemple:
$req = 'SELECT col1, col2 FROM table';
$resultats = mysql_query($req) or die mysql_error();
echo '<pre>';
var_dump($resultats); // affiche le contenu de la variable
echo '</pre>';
Ceci est valable pour tous les
SGBD bien évidemment.
Pour avoir de l'aide sur une fonction ou la syntaxe d'instructions SQL, n'hésitez pas à aller faire un tour dans la documentation du SGBD que vous utilisez :
MySQL :
http://dev.mysql.com/doc/refman/5.0/fr/
PostgreSQL :
http://www.postgresql.org/docs/8.1/inte ... index.html
Bien sûr sélectionnez le manuel qui correspond à la version que vous utilisez...
Et puis,
Rechercher ou
Google peuvent parfois être utiles...
Et là, si VRAIMENT vous ne trouvez pas... alors vous pouvez venir demander de l'aide sur le forum.
Avec ces trois informations indispensables :
SGBD utilisé et en quelle version,
code SQL exécuté et
message d'erreur obtenu
Merci d'avance.

Pour information, cet article de PHPDebutant recense toutes les petites choses bêtes (mais qui arrivent à tous) et récurrentes qui peuvent planter un script :
ça marche pas ?
Si vous obtenez ce genre d'erreurs PHP :
[quote="PHP"]Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in à la ligne n[/quote]
[quote="PHP"]Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in à la ligne n[/quote]
ou tout autre message identique avec n'importe quelle fonction PHP nécessitant une [url=http://fr.php.net/manual/fr/language.types.resource.php]ressource[/url] de type [i]mysql result[/i]...
Il y a de fortes chances que l'exécution de votre requête SQL ait échoué :(
Même chose si vous attendiez un tableau rempli de données à l'affichage, et qu'il est tout vide...
[size=134][b]Bref, dès que vous exécutez une requête SQL via PHP et qu'elle ne fonctionne pas, ou produit des résultats surprenants, avant toute autre chose, voici les étapes à suivre pour tenter de trouver l'erreur :[/b][/size]
[list=1]
[*]Faites afficher les messages d'erreur MySQL dans votre script PHP (valable pour toutes les méthodes d'accès à un SGBD: connexion au serveur, sélection de la base, requête etc) :
[php]
mysql_query($requeteSQL) or die (mysql_error());
[/php]
[b][color=red]et lisez ces messages[/color][/b] :!:
[*]Faites afficher le SQL [b]généré[/b], c'est à dire la chaîne contenant votre requête et qui résultera d'une concaténation avec des variables par exemple.
[u]C'est ce code SQL qui est important et que vous devrez fournir lors d'une question sur ce forum.[/u]
[php]
// cette ligne ne sera pas utile pour vous aider, car on ne sait pas ce que contient $variable
$requeteSQL = "SELECT * FROM table1 WHERE colonne2 = '".$variable."'";
// par contre le résultat de ceci est utile, car on connaîtra ainsi le SQL réellement exécuté par le serveur de base de données
echo $requeteSQL;
[/php]
[*]Regardez si rien ne cloche dans ce SQL, certaines erreurs de syntaxe se remarquent tout de suite.
[*]Faites des essais, et testez-les [b]directement[/b] dans MySQL, via phpMyAdmin ou une autre interface de MySQL.
:idea: Au passage, une bonne habitude est de créer un modèle de requête [b]qui marche[/b] puis d'insérer ce code SQL dans le script PHP pour le rendre dynamique. Autant ne pas multiplier les risques d'erreur en testant à la fois le PHP et le SQL.
[*]Si vous essayer de sélectionner et d'afficher des données, que la requête est bonne (c'est à dire que le SQL généré et testé directement sur le serveur de base de données renvoie les bons résultats, affichez le tableau directement, en dehors d'une éventuelle boucle, et vous ciblerez peut-être mieux le problème. Exemple:
[php]
$req = 'SELECT col1, col2 FROM table';
$resultats = mysql_query($req) or die mysql_error();
echo '<pre>';
var_dump($resultats); // affiche le contenu de la variable
echo '</pre>';
[/php][/list]
Ceci est valable pour tous les [url=http://fr.wikipedia.org/wiki/SGBD]SGBD[/url] bien évidemment.
Pour avoir de l'aide sur une fonction ou la syntaxe d'instructions SQL, n'hésitez pas à aller faire un tour dans la documentation du SGBD que vous utilisez :
MySQL : http://dev.mysql.com/doc/refman/5.0/fr/
PostgreSQL : http://www.postgresql.org/docs/8.1/interactive/index.html
Bien sûr sélectionnez le manuel qui correspond à la version que vous utilisez...
Et puis, [url=http://www.phpfrance.com/forums/search.php]Rechercher[/url] ou [url=http://www.google.fr]Google[/url] peuvent parfois être utiles...
Et là, si VRAIMENT vous ne trouvez pas... alors vous pouvez venir demander de l'aide sur le forum.
Avec ces trois informations indispensables :
[b]SGBD utilisé et en quelle version[/b], [b]code SQL exécuté[/b] et [b]message d'erreur obtenu[/b]
Merci d'avance.
:idea: Pour information, cet article de PHPDebutant recense toutes les petites choses bêtes (mais qui arrivent à tous) et récurrentes qui peuvent planter un script : [url=http://www.phpdebutant.org/article112.php]ça marche pas ?[/url]