Page 1 sur 1

Problème : Warning: mysql_fetch_array(): supplied argument i

Posté : 03 févr. 2009, 04:50
par rubikspirit
Bonjour,

Je suis en train de développer mon site et je suis confronté à un soucis :
Sur mon site, j'ai également un forum qui a la connexion génère un cookie avec un nombre dedans qui correspond à l'user_id de l'utilisateur dans ma base de données.

J'aurais besoin d'exploiter ce cookie en dehors du forum pour mon site pour y utiliser des informations concernant le membre.

Donc, j'ai fait une requête dans mon fichier header comme cela :

Code : Tout sélectionner

<?php if( empty( $_COOKIE["phpbb3_6xrel_u"] )) { setcookie("phpbb3_6xrel_u", 1, time()+36000); } else{ $cookie_log = $_COOKIE["phpbb3_6xrel_u"]; } mysql_connect($serveur, $login, $password); mysql_select_db(forum); $reponse_log = mysql_query("SELECT * FROM forum_users WHERE user_id='$cookie_log'"); // On fait une boucle pour lister tout ce que contient la table : while ($data_log = mysql_fetch_array($reponse_log) ) { echo '<div class="text2">Vous êtes connecté en tant que <b>'.$data_log['username'].'</b> (Utilisateur de rang '.$data_log['user_rank'].')</div>'; } ?>
Et lorsque j'execute ce script, j'obiens une erreur qui est :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home2/phonerom/public_html/newversion/pages/bloc_newsletter.php on line 21

La ligne 21 est ce qui correspond à "while ($data_log = mysql_fetch_array($reponse_log) )".

J'ai beau chercher, je n'arrive pas à trouver mon erreur... Pourriez-vous m'aider ??

Merci à tous !

Posté : 03 févr. 2009, 10:51
par albat
1. Le SELECT * est à proscrire. Préciser les champs.
2. Mieux vaut écrire la requête, puis l'exécuter. Ça permet de débugger.
3. Toujours extraire les variables des chaînes de caractères.
4. Si un champ ou une variable a une valeur numérique, ne pas utiliser d'apostrophes.
$requete = "SELECT champs FROM forum_users WHERE user_id='".$cookie_log."'"; // si user_id alphanumérique
$requete = "SELECT champs FROM forum_users WHERE user_id=".$cookie_log;      // si user_id numérique
$reponse_log = mysql_query($requete);

Posté : 03 févr. 2009, 14:21
par animithra
Bonjour,

il y a aussi le cas tout bête où il n'y a aucun résultat.

Tu devrais ajouter un test :

Code : Tout sélectionner

//si il y a un résultat à la requête if(mysql_num_rows($reponse_log)!=0){ //suite du code }
Bon courage et bonne progra.

Posté : 03 févr. 2009, 15:04
par Ryle
il y a aussi le cas tout bête où il n'y a aucun résultat.
S'il n'y a pas de résultat, il n'y a pas d'erreur, php ne rentre tout simplement pas dans le while ;)

A noter par ailleurs qu'ici :
mysql_select_db(forum);
php va rechercher une constante nommée forum. Si celle-ci est trouvée, sa valeur est utilisée, sinon php supposera qu'il s'agit de la chaine "forum"... le mieux étant bien sur de lui dire dès le départ si c'est une variable $forum ou une chaine "forum" plutôt que de le laisser php essayer de corriger les erreurs de programmation :)

Posté : 03 févr. 2009, 15:26
par animithra
S'il n'y a pas de résultat, il n'y a pas d'erreur, php ne rentre tout simplement pas dans le while
Bien sûr que si.
Pour savoir s'il rentre ou non dans le while il faut bien qu'il teste la condition.
C'est justement lorsqu'il essaie de tester qu'il reçoit une erreur pour le paramètre soumis...

Posté : 03 févr. 2009, 16:46
par Ryle
Bah euh... bien sur que non... en fait... :)

Le fait de ne pas trouver d'enregistrement dans une table ne génère pas une erreur (et heureusement, ma table a bien le droit d'être vide sans que cela ne plante mon code ;)). La fonction mysql_query() retourne bien une resource MySQL valide, c'est juste que cette ressource ne contient pas d'enregistrements.

La boucle while teste quant à elle le résultat de la fonction mysql_fetch_array(). S'il y a des enregistrements, la fonction retourne un tableau, php rentre dans le boucle et exécute le code correspondant. S'il n'y a pas ou plus de lignes, la fonction retourne FALSE et la boucle while s'arrête, voire, ne commence pas :)