Problème mysql_fetch_array

Fermé
Hazel - 13 janv. 2010 à 11:03
 le père - 14 janv. 2010 à 12:06
Bonjour,

J'ai créé une base de données mysql et je dois comparer ces données à celles rentrées par des utilisateurs dans un formulaire en php.

Au moment de valider le formulaire, la page me renvoie l'erreur suivante :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in [...] on line 72
/>

Je sais que c'est censé venir de ma requête sql mais je ne vois pas l'erreur :

$reponse = mysql_query("SELECT * FROM eleve" or die(mysql_error() )) ;

et la ligne qui pose problème est la suivante :

while ($donnees = mysql_fetch_array ($reponse) )

J'ai déjà regardé beaucoup de sujets postés par d'autres utilisateurs et je n'ai trouvé aucune solution. J'ai déjà vérifié le nom de mes champs, de la table et de la base de données, tout est correct.

Je ne suis pas sure que mysql_fetch_array soit la bonne méthode pour simplement parcourir une base de données, mais je n'ai rien trouvé d'autre :/

Merci d'avance pour votre aide !

13 réponses

Bonjour

Ta requête est incorrecte. Tu as incorporé le "or die (mysql_error())" à ta requête, alors qu'il n'a rien à y faire

Ça devrait aller mieux comme ça :
$reponse = mysql_query("SELECT * FROM eleve") or die(mysql_error() ) ;
0
Merci, effectivement j'ai oublié les parenthèses pour le or die ! Maintenant je n'ai plus d'erreur mais ça ne fonctionne pas, quand j'envoie le formulaire la page s'actualise et les champs sont vides. Je voudrais tester si la recherche dans la base de données se fait correctement mais je ne sais pas si le code est bon :

while ($donnees = mysql_fetch_array ($reponse) )
{
if ('$nom_eleve' == $donnees['nom_eleve'] AND '$prenom_eleve' == $donnees['prenom_eleve'] AND '$date_naissance' == $donnees['date_naissance'])

{
echo "OK";
}

}

Merci d'avance
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
13 janv. 2010 à 11:26
Si c'est juste pour un test, fait plutôt quelque chose de très simple, comme ça..

while ($donnees = mysql_fetch_array ($reponse) ) 
{
       echo "$donnees['nom_eleve'] $donnees['prenom_eleve'] $donnees['date_naissance'] <br />";
}

Si ça marche, tu vois que ta requête tourne, alors complexifie le traitement derrière :)
0
En recopiant ton code, je reçois l'erreur suivante :

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in [...] on line 60

En allant voir sur d'autres sujets j'ai eu l'impression que c'était un problème de concaténation, j'ai donc enlevé les guillemets autour du echo et j'ai écrit ça :

echo $donnees['nom_eleve'] $donnees['prenom_eleve'] $donnees['date_naissance'];

Je n'ai plus d'erreur mais encore une fois le formulaire ne renvoie rien :(
0

if ('$nom_eleve' == $donnees['nom_eleve'] AND '$prenom_eleve' == $donnees['prenom_eleve'] AND '$date_naissance' == $donnees['date_naissance'])

Ce test est incorrect. '$nom_eleve' n'est pas une variable, il faudrait mettre $nom_eleve sans les apostrophes.
Idem pour les autres variables

essaye
echo '$nom_eleve';
et
echo $nom_eleve;

Dans le premier cas, ça affichera $nom_eleve tel quel, dans le second, ça affichera le contenu de la variable.
0
D'ailleurs, tu aurais mieux fait de mettre un WHERE dans ta requête, tu n'aurais pas du tout de test à faire...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
13 janv. 2010 à 12:48
Etrange le message d'erreur.. Dommage, dans ce message, l'important, c'est la fin.. Si je pouvais l'avoir en entier... Sans les guillements, ça ne veux absolument plus dire la même chose.. T'es sur que t'as quelque chose dans ta base de donnée sinon? Sinon.. j'ai un doute. La parenthère ne doit pas être collée au "array" normalement?
$donnee = mysql_fetch_array( $reponse);

Vérifie bien les noms de variables aussi donne/donnee/donnees... puis bien faire ta requete dans "reponse", faire ton array a partir de "reponse", en "donnée", afficher "donnee['...']" Avec les bons champs de la db, ...
0
-> Apatik
Etrange le message d'erreur
Non, normal, ta ligne est incorrecte. Quand tu utilises un tableau avec indices à l'intérieur d'une chaîne entre " ", il ne faut pas mettre d'apostrophes autour de l'indice
echo "$donnees[nom_eleve] $donnees[prenom_eleve] $donnees[date_naissance] <br />";
est correct alors que
echo "$donnees['nom_eleve'] $donnees['prenom_eleve'] $donnees['date_naissance'] <br />";
ne l'est pas.
On peut aussi écrire
echo $donnees['nom_eleve']," ",$donnees['prenom_eleve']," ", $donnees['date_naissance']," <br />";
et un tas d'autres variantes...
0
->Hazel
Peux-tu nous re-montrer le script tel qu'il est maintenant ?
0
En fait, j'ai regardé et modifié beaucoup de choses mais je pense que mon problème vient de l'utilisation des variables que je crée dans mon formulaire : on dirait que mysql ne les reconnait pas, et même avec un simple echo, sans faire appel à la base de données, ça ne fonctionne pas !

Je vais vous mettre tout mon code, je suis une débutante en php (et même en html) donc il doit y avoir beaucoup de choses non optimisées :/ :

<form action="verification_eleve.php" method="post">

Nom :       <input type="text" name="nom_eleve" /> <br/><br/>
Prénom :   <input type="text" name="prenom_eleve" /> <br/><br/>
Date de naissance :    
Jour :   <input type="text" name="jour_naiss"size="1px" />   
Mois :   <input type="text" name="mois_naiss"size="1px" />    
Année :   <input type="text" name="annee_naiss" size="2px"/>    (jj/mm/aaaa)

<br/><br/>

<input type="submit" name="valider"

<?php

// date_naissance est la concaténation de jour_naiss mois_naiss et annee_naiss

$date_naissance = "$_POST[jour_naiss].$_POST[mois_naiss].$_POST[annee_naiss]" ;
echo "$date_naissance" ; // test d'affichage de la date de naissance


// on vérifie que l'utilisateur a rentré des données dans les champs et que les champs ne sont pas nuls
if (isset($_POST['nom_eleve']) AND isset($_POST['prenom_eleve']) AND
isset($_POST['jour_naiss']) AND isset($_POST['mois_naiss']) AND isset($_POST['annee_naiss']))
{
if ($_POST['nom_eleve'] != NULL AND $_POST['prenom_eleve'] != NULL AND
$_POST['jour_naiss'] != NULL AND $_POST['mois_naiss'] != NULL AND
$_POST['annee_naiss'] != NULL)
{

mysql_connect("localhost", "root", "");
mysql_select_db("eleves_comparer");


//essai d'affichage des données

while ($donnees = mysql_fetch_array ($reponse) )
{
echo '$nom_eleve' '$prenom_eleve' '$date_naissance' ;
}
while ($donnees = mysql_fetch_array ($reponse) )
{

// test plus complexe pour la comparaison

if ($_POST['nom_eleve']== $donnees['nom_eleve'] AND
$_POST['prenom_eleve'] == $donnees['prenom_eleve'] AND
$_POST['date_naissance'] == $donnees['date_naissance'])
{
echo "OK";
}
}

mysql_close();
}
}

?> />
</form>


Voila, j'espère qu'il n'y a pas trop de grosses erreurs ^^'
Quand je dis qu'il y a un problème d'utilisation de mes variables, je veux dire que mon code ne reconnait que les variables crées hors <input/> , alors que tout l'intérêt de mon formulaire est de récupérer les données entrées par les utilisateurs.

Merci d'avance pour votre aide !
0
Tu as mis tout ton PHP à l'intérieur du <input type = "submit" !
Tes echo affichent probablement des choses, mais à l'intérieur de la balise donc ton navigateiur ne les affiche pas.
Déplace tout ton PHP après le </form>
0
Je trouvais ça bizarre aussi, mais je suis les tutoriels du site du zéro et il disaient de faire comme ça alors je ne m'étais pas posé la question :/

J'ai déplacé mon php hors du form, mais il y a toujours un problème : selon ce que je fais, soit j'ai l'erreur :

Parse error: parse error, expecting `','' or `';'' in [...] on line 59

La ligne 59 étant : echo $_donnees['nom_eleve'] $_donnees['prenom_eleve'] $_donnees['date_naissance'] ;

Apparemment il manque les guillemets, mais quand j'en rajoute :

echo "$_donnees['nom_eleve'] $_donnees['prenom_eleve'] $_donnees['date_naissance']" ; je reçois cette erreur :

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in [...] on line 59

Et finalement quand j'écris mon echo comme ça :

echo "$_donnees[nom_eleve] $_donnees[prenom_eleve] $_donnees[date_naissance]" ; je reçois cette erreur :

Notice: Undefined variable: _donnees in [...] on line 59 autant de fois qu'il y a d'élèves enregistrés dans ma table.

Je ne sais vraiment pas quoi faire, on dirait que mes variables ne sont pas correctes :/
0
De plus ton code a de nombreuses erreurs :

while ($donnees = mysql_fetch_array ($reponse) )
{
echo '$nom_eleve' '$prenom_eleve' '$date_naissance' ;
}
while ($donnees = mysql_fetch_array ($reponse) )
{

D'où vient ton réponse ? Tu as retiré l'appel à mysql_query !
Ce echo '$nom_eleve' '$prenom_eleve' '$date_naissance' ; est erroné, relis mon message 4
le second while ($donnees = mysql_fetch_array ($reponse) ) ne donnera rien, il faut faire mysql_data_seek($reponse,0); avant pour revenir au début des résultats
0
mais je suis les tutoriels du site du zéro et il disaient de faire comme ça Ça m'étonnerait beaucoup. Je voudrais bien que tu me montres où ils disent ça.

La ligne 59 étant : echo $_donnees['nom_eleve'] $_donnees['prenom_eleve'] $_donnees['date_naissance'] ;
Apparemment il manque les guillemets,

J'ai déjà expliqué ça au message 4. Il faudrait que tu regardes dans le manuel PHP comment écrire une chaîne correctement et comment mettre une variable dedans. Ça fait partie du B A BA du php. Les règles sont très simples et quand on les connaît, il suffit de les appliquer. Ajouter ou enlever des " ou de ' ou des . au hasard pour voir ce que ça donne est une très mauvaise méthode.

Undefined variable: _donnees in [...] on line 59 autant de fois qu'il y a d'élèves enregistrés dans ma table. Le message est très clair : la variable $_donnees n'est pas définie. Où est(-elle définie, je ne la vois pas dans le script que tu donnes message 10
0
Désolée, en effet je me suis rendue compte que mon echo était totalement faux, ce n'était pas étonnant qu'il ne me renvoie rien !

Je crois avoir compris mon problème de variable et je pense l'avoir résolu, mais maintenant j'ai un autre petit problème : je compare les données rentrées par les utilisateurs à celles enregistrées dans la base de données mais ça ne fonctionne pas. J'ai créé un booléen qui me renvoie true lorsque la comparaison a abouti à un résultat positif, et false pour un résultat négatif. Mais j'ai beau recopier exactement les données présentes dans ma table mysql, le résultat est toujours négatif...

Est la bonne manière de comparer des données à celles d'une bdd ?


if (isset($_POST['nom_eleve']) AND isset($_POST['prenom_eleve']) AND isset($_POST['jour_naiss']) AND isset($_POST['mois_naiss']) AND isset($_POST['annee_naiss']))
{
while ($donnees = mysql_fetch_array ($reponse) )
{
if ($_POST['nom_eleve'] == $donnees['nom_eleve'] AND $_POST['prenom_eleve'] ==
$donnees['prenom_eleve'] AND $date_naissance == $donnees['date_naissance'])
{
$verification = true;
}
else
{
$verification = false;
}
}

mysql_close();
}

if ($verification == true)
{
echo "OK";
}
else
{
echo "Incorrect";
}
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
14 janv. 2010 à 10:53
Pour la date de naissance, un coup c'est "$_POST['annee_naiss']", l'autre c'est "$date_naissance" .. Faut se décider :) Ca c'est pour le "négatif tout le temps".
Sinon, tu peux comparer comme tu le fait, ou alors comme ça, (Je ne sais pas laquelle est la mieux, j'ai tendance a préférer ma méthode.) Tu remarquera a la ligne 4 que j'ai initialisé la variable $date_naissance en concaténant les deux données issues du post sous la forme "mm/aaaa". Change le pour adapter a ta db :)
if (isset($_POST['nom_eleve']) AND isset($_POST['prenom_eleve']) AND isset($_POST['jour_naiss']) AND isset($_POST['mois_naiss']) AND isset($_POST['annee_naiss'])) 
{ 
          $verification = false;
          $date_naissance = $_POST['mois_naiss'].'/'.$_POST['annee_naiss'];
          while ($donnees = mysql_fetch_array ($reponse) ) 
          { 
                      if ($_POST['nom_eleve'] == $donnees['nom_eleve'])
                      {
                                 if ( $_POST['prenom_eleve'] == $donnees['prenom_eleve'])
                                 {
                                            if ($date_naissance == $donnees['date_naissance'])
                                            {
                                                     $verification = true; 
                                            }
                                 }
                      }
            }
            mysql_close(); 
            if ($verification) 
            { 
                   echo "OK"; 
             } 
             else 
             { 
                   echo "Incorrect"; 
             }
}
else
{
       echo "Tous les champs ne sont pas remplis";
}
0
Non la variable c'est bien $date_naissance, le $_POST['annee_naiss'] c'est juste pour vérifier si tous les champs sont bien remplis. J'avais pourtant bien concaténé ma date de naissance, en faisant $date_naissance = "$_POST[jour_naiss]"."$_POST[mois_naiss]"."$_POST[annee_naiss]" ; le format doit être jjmmaaaa. J'avais testé en l'affichant avec un echo, c'était correct.
Et pour le résultat qui est toujours négatif je ne pense pas que ça vienne de là, puisque j'avais vérifié en ne mettant que la comparaison du nom, et ça ne fonctionnait pas non plus :/

Ta méthode fait beaucoup d'imbrications, c'est pour éviter ça que j'ai voulu utiliser des AND ; mais je vais essayer, il vaut mieux que ça fonctionne, même si ce n'est pas totalement optimisé.
0
Ta comparaison avec les NAD est très bien, même si un WHERE dans la requête serait infiniment mieux
Tu as un problème de logique. Tu mets $verification à true chaque fois que tu tombes sur ce que tu cherches, et à false chaque fois que tu tombes sur autre chose.
Mais comme tu boucles sur toutes ta table, ce que tu vois à la fin, c'est seulement le résultat du test sur la dernière ligne de ta table !
Il faut initialiser $verification à false AVAVNT le while, le mettre à true comme tu fais mais surtout ne pas le mettre à false dans le else car cela écrase le true que tu as peut-être trouvé avant !
donc enlève le else tout simplement
0
Edit : il faut lire AND et AVANT bien sûr
0
le père > le père
14 janv. 2010 à 11:21
Re-Edit : la remarque de Apatik du l'année/ date de naissance reste valable
0
Ah oui, je n'y avais pas du tout pensé, c'est vrai que le while continue alors que la vérification est déjà faite ! Je n'ai plus l'habitude de programmer depuis pas mal de temps, mes réflexes de logiques sont un peu partis ; je me demande comment j'ai pu oublier ça :o

Ca fonctionne maintenant, effectivement il fallait enlever le else :) Merci beaucoup !

J'avais essayé de faire un WHERE dans ma requête, mais il va être très long puisque j'aurai 3 contraintes à mettre dedans : le nom, le prénom et la date de naissance :/
Hier en tout cas ça ne fonctionnait pas, mais c'était certainement à cause de mes autres problèmes !
Je vais réessayer, maintenant que tout fonctionne correctement !

Encore merci à vous !
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
14 janv. 2010 à 11:29
Effectivement "le père", je partais du principe qu'il n'avait qu'une ligne dans son retour de requête.. Quoi que au final, mon code va quand même ^^.
Mais c'est vrai qu'une requête comme ça, y'a rien de mieux ^^:
SELECT COUNT(*) FROM membres WHERE nom_eleve = $_POST['nom_eleve'] AND prenom_eleve = $_POST['prenom_eleve'] AND date_naissance = $date_naissance 

Te retourne 0 si tu n'as pas de résultat, ou le nombre de lignes qui remplissent ces paramètres (1 maximum normalement..). Ne pas oublier le mysql_fetch_array sur le résultat
0
SELECT COUNT(*) FROM membres WHERE nom_eleve = $_POST['nom_eleve'] AND prenom_eleve = $_POST['prenom_eleve'] AND date_naissance = $date_naissance
il manque des ' ' autour des données, ça ne va pas marcher
$requete = "SELECT COUNT(*) FROM membres WHERE nom_eleve = '$_POST[nom_eleve]' AND prenom_eleve = '$_POST[prenom_eleve]' AND date_naissance = '$date_naissance' "
0