Mysql_fetch_array

Bonjour,
petit pb de requête sql sur une boucle
je débute un peu donc merci de m'éclairer
voici le code
//minitchat
<?php
	 if (isset($_POST['pseudo']) AND isset($_POST['message'])) // Si les variables existent
{
    if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL) // Si on a quelque chose à enregistrer
    {
        // D'abord, on se connecte à MySQL
        mysql_connect("localhost", "ID", "pswd");
        mysql_select_db("test");
 
        // On utilise les fonctions PHP mysql_real_escape_string et htmlspecialchars pour la sécurité
        $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
        $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
 
        // Ensuite on enregistre le message
        mysql_query("INSERT INTO minichatvolley VALUES('', '$pseudo', '$message')");
 
        // On se déconnecte de MySQL
        mysql_close();
    }
}
 
 
// Que l'on ait enregistré des données ou pas...
// On affiche le formulaire puis les 10 derniers messages
 
// Tout d'abord le formulaire :


 ?>
 
 
<form action="page2.php" method="post">
 
<p>
Pseudo : <input type="text" name="pseudo" /><br />
Message :  <input type="text" name="message" /><br />
 
<input type="submit" value="Envoyer" />
</p>
 
</form>
 
 
 
<?php
 
// Maintenant on doit récupérer les 10 dernières entrées de la table
// On se connecte d'abord à MySQL :
mysql_connect("localhost", "ID", "pswd");
mysql_select_db("test");
 
// On utilise la requête suivante pour récupérer les 10 derniers messages :
$reponse = mysql_query("SELECT * FROM minichatvolley ORDER BY ID DESC LIMIT 0,10");
 
// On se déconnecte de MySQL
mysql_close();
 
// Puis on fait une boucle pour afficher tous les résultats :
while ($donnees = mysql_fetch_array($reponse) )
{
?>

<p><strong><?php echo $donnees['pseudo']; ?></strong> :  <?php echo $donnees['message']; ?></p>

 
 
 
<?php
}
// Fin de la boucle, le script est terminé !


	echo "</td>";
?>


l'erreur me dit
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in line "celle en gras et soulignée"

merci par avance
lolo
Configuration: Windows XP
Firefox 3.0.1

22 réponses

Résumé de la discussion

Problème rencontré lors de l'affichage des messages d'un minichat en PHP/MySQL, avec l'erreur indiquant que la ressource de résultat n'est pas valide lors de la lecture dans une boucle. Plusieurs réponses préconisent d afficher l'écriture dans la boucle et de veiller à ce que les balises HTML soient bien fermées, tout en évitant de fermer la connexion avant d'exploiter le résultat. D'autres conseils insistent sur l'exécution correcte des requêtes INSERT et SELECT, l'inclusion éventuelle de l'ID pour déboguer et l'usage d'outils comme die(mysql_error()) afin d'identifier rapidement les erreurs. En complément, certains proposent de clarifier la structure de la table et d'assurer une sélection cohérente des colonnes, en affichant les champs utiles et en ajustant tri et limites.

Bobot (l’IA à votre service)
  1. Chalut :3

    https://www.commentcamarche.net/contents/784-php-bases-de-donnees

    Tu récupères mal les données de te BDD ;) tu te débrouilles bien pour un(e) débutant(e) ;)

    Code propre, bien commenté *_* C'est super !!! ^^
    1. Bonjour,

      Tu dois te déconnecté de la base de données après la fin de la boucle et non avant, car tu ne peux plus récupérer tes résultats à ce moment-là.

      A plus
      1. Il a déjà récupérer les résultats, il ne peut simplement pas les lire :)

        
        // On utilise la requête suivante pour récupérer les 10 derniers messages : Il récupère la réponse
        $reponse = mysql_query("SELECT * FROM minichatvolley ORDER BY ID DESC LIMIT 0,10");
         
        // On se déconnecte de MySQL
        mysql_close();
         
        // Puis on fait une boucle pour afficher tous les résultats :
        while ($donnees = mysql_fetch_array($reponse) )
        Et là il ne peut pas lire, car il ne l'a pas stocké dans un tableau je crois
        
        
        

      2. @@nGel_974Bonjour,

        Honte sur moi, j'avais pas vu cette ligne. Sorry

        A +
    2. bonjour merci de vos réponses
      loin de moi l'idée de m'attribuer ce code
      je l'ai pris sur le siteduzero c'est celui de matteo
      j'ai suivi tous ces tuto et ça m'a donné envie d'améliorer mon site alors je me lance....en bon newbee quand même!

      pour l'erreur mysql_fetch_array c'est réglé ...j'avais mis un nom de table erroné minichatvolley au lieu de minitchatvolley corrigé et ça marche

      j'ai essayé de l'insérer dans mon site ,dans un tableau où il apparaitrait à chaque ligne du tableau et où bien sur le tchat de chaque ligne devrait être indépendant l'un de l'autre
      les champs apparaissent bien ça c'est ok c'est déjà pas mal ...:lol:

      mais par contre plusieurs pb se posent
      -tout d'abord seul le pseudo s'affiche pas le message
      -ensuite il s'affiche 1 fois dans la 1ère ligne , 2 fois dans la seconde
      3fois dans la 3ème ...etc etc
      -enfin les tchats ne sont pas indépendants donc quand je tape sur la 1ère ligne ça apparait partout
      je vous joins tout le code de cette 1ère colonne

      <?php
      foreach($listeDates as $cle=>$date){
           echo "<tr>";
           //premiere colone date
           echo '<td align="center"><DIV class="dateclass">'.$date.'</DIV><br>';
      	 //minitchat
      	 if (isset($_POST['pseudo']) AND isset($_POST['message'])) // Si les variables existent
      {
          if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL) // Si on a quelque chose à enregistrer
          {
              // D'abord, on se connecte à MySQL
              mysql_connect("localhost", "ID", "pswd");
              mysql_select_db("test");
       
              // On utilise les fonctions PHP mysql_real_escape_string et htmlspecialchars pour la sécurité
              $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
              $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
       
              // Ensuite on enregistre le message
              mysql_query("INSERT INTO minitchatvolley VALUES('', '$pseudo', '$message')");
       
              // On se déconnecte de MySQL
              mysql_close();
          }
      }
       
       
      // Que l'on ait enregistré des données ou pas...
      // On affiche le formulaire puis les 10 derniers messages
       
      // Tout d'abord le formulaire :
      
      
       ?>
       
       
      <form action="page2.php" method="post">
       
      <p>
      Pseudo : <input type="text" name="pseudo" /><br />
      Message :  <input type="text" name="message" /><br />
       
      <input type="submit" value="Envoyer" />
      </p>
       
      </form>
       
       
       
      <?php
       
      // Maintenant on doit récupérer les 10 dernières entrées de la table
      // On se connecte d'abord à MySQL :
      mysql_connect("localhost", "ID", "pswd");
      mysql_select_db("test");
       
      // On utilise la requête suivante pour récupérer les 10 derniers messages :
      $reponse = mysql_query("SELECT * FROM minitchatvolley ORDER BY ID DESC LIMIT 0,10")or exit(mysql_error());
      
       
      // On se déconnecte de MySQL
      mysql_close();
       
      // Puis on fait une boucle pour afficher tous les résultats :
      while ($donnees = mysql_fetch_array($reponse) )
      {
      ?>
      
      <p><strong><?php echo $donnees['pseudo']; ?></strong> :  <?php echo $donnees['message']; ?></p>
      
       
       
      <?php
      }
      // Fin de la boucle, le script est terminé !
      
      
      	echo "</td>";
      ?>
      


      je vous remercie encore beaucoup
      1. Bonjour,

        Il te manques une balise </tr> dans ton code
        // Fin de la boucle, le script est terminé !
        
        
        	echo "</td>";
        
               echo " </tr>";
        

        Ensuite, à chaque occurrence de date (avec foreach), tu vas insérer un enregistrement, tu vas avoir un formulaire et tu vas afficher les 10 derniers enregistrements. C'est peut-être voulu ?

        A plus
        1. merci de t'y intéresser...
          oui j'insère un nouvel enregistrement à chaque date donc à chaque ligne du tableau....c'est voulu
          en fait je voudrais un minitchat indépendant pour chaque nouvelle date
          pour le moment les pb restent les mêmes qu'à 16:35

          par contre si je rajoute
          echo " </tr>";
          tout mon tableau part de travers ....
          donc je l'ai pas mis...:lol::

          merci encore
          1. Bonjour,

            En fait ton code devrait être le suivant (je ne l'ai pas testé)
            <p><strong><?php echo $donnees['pseudo']; ?></strong> :  <?php echo $donnees['message']; ?></p>
              
            <?php
            
                 echo "</td>";
                 echo "</tr>";
            }
            // Fin de la boucle, le script est terminé !
            
            ?>
            

            Les echo doivent être dans la boucle et non après la boucle puisque les balises <tr> et <td> sont dans la boucle.
            A plus
            1. Bonjour,

              rien à voir avec le problème, mais je vois que vous utilisez tous les 2 des balises Php quasimment tout le temps, mais si je me souviens bien, on peut écrire duu html dans du php, non ?!

              Donc :

              <?php

              mon code html

              echo "patati patata" ;

              ?>

              ça le fait aussi non ? (pour un confort de lecture)
              1. Bonjour,

                Tu as tout à fait raison mais je n'ai pas voulu changer son code, juste essayer de trouver son erreur.

                A plus
            2. j'ai essayé de modifier le code comme tu me l'as conseillé christounet mais ça va pas ....le tableau est complètement décalé et j'ai plein de "echo" qui s'affichent avant le tableau
              en fait le <tr> est fermé plus loin dans le script

              vous pensez pas qu'il faudrait ptêt une table différente pour chaque ligne....dans la mesure ou chaque tchat doit être indépendant?

              merci
              1. Bonjour,

                Je n'ai pas vu de balise </tr> dans le code que tu nous a donné, peut-être devrais-tu copier/coller le code complet et non une partie seulement.
                Concernant le fait d'avoir une table par tchat, c'est peut-être pas une mauvaise idée si plus tard tu veux avoir des styles CSS différents en fonction du tchat.
                A plus
                1. ok merci
                  au niveau de l'affichage ça va mieux maintenant le pseudo et le messge s'affichent
                  par contre
                  cela s'affiche toujours 1 fois dans la 1ère ligne , 2 fois dans la seconde
                  3fois dans la 3ème ...etc etc
                  -enfin les tchats ne sont pas indépendants donc quand je tape sur la 1ère ligne ça apparait partout
                  je vous joins une image de ce que ça donne

                  http://imageshack-france.com/out.php/i217672_screensite.JPG
                  merci encore
                  1. Bonjour,

                    Désolé pour cette réponse tardive, fort occupé aujourd'hui.
                    Peux-tu copier/coller la définition de ta table minitchatvolley, c-à-d les colonnes , le ou les index, cela pourra peut-être me donner des idées, car à priori ton code html à l'air correct.

                    A plus
                    1. salut
                      aucun pb ....c'est déjà sympa de m'aider
                      j'ai pas bien compris ce que tu voulais exactement alors j'ai un screen de la table et de ce qu'elle contenait à cet instant
                      désolé

                      les voilà.....
                      http://imagik.fr/view-rl/118248

                      http://imagik.fr/view-rl/118249

                      et merci encore
                      1. Bonjour,

                        C'est bien ce que je voulais, définition de ta table , le ou les index et le contenu de cette table.
                        Juste une petite remarque, dans ton script tu fais un SELECT sur la table minitchatvolley mais tu m'as envoyé la table chat, mais je suppose que c'est la même chose.
                        Peux-tu essayer l'une des deux choses ci-dessous (a toi de voir ce qui est le plus facile)?
                        1°) Peux-tu rajouter dans ton code l'affichage de la colonne ID
                        <p><?php echo $donnees['id']; ?> : <strong><?php echo $donnees['pseudo']; ?></strong> :  <?php echo $donnees['message']; ?></p>

                        2°) Peux-tu dans phpMyadmin, dans l'onglet SQL executé ton ordre
                        SELECT * FROM minitchatvolley ORDER BY ID DESC LIMIT 0,10

                        et ensuite mettre sur imagik.fr le résultat de soit 1°) soit 2°)
                        Merci
                        A plus
                        1. ok merci christounet
                          effectivement j'ai renommé ma table tchat pour simplifier et j'ai ajouté un champ date (qui pour le moment sert pas )
                          voilà ce que la réquête sql donne

                          http://imagik.fr/view-rl/123881

                          pour l'affichage des données ID, rien n'est affiché....pas très normal ça ....

                          voici ce que ça donne

                          http://imagik.fr/view-rl/123901
                          1. Bonjour,

                            Concernant l'affichage de l'ID, est-tu sur de le sélectionné dans ton ordre SQL ?

                            Concernant l'autre problème ( affichage 1 ligne, puis 2 , puis 3, ...) dans tes images, je ne vois où il se situe, le fait d'avoir plusieurs fois le même pseudo et message est normal étant donné que c'est ce que contient ta table tchat.

                            Quand au problème de tchat indépendant, là aussi je ne comprends pas très bien ce que tu veux dire, peut-être une image sera plus parlante ?

                            A plus
                            1. salut
                              bin je voudrais simplement que mon tchat soit indépendant pour chaque match
                              c'est à dire que sur cette image
                              http://imageshack-france.com/out.php/i217672_screensite.JPG

                              je voudrais pouvoir taper dans le tchat à la date du 6-10-2008 par exemple " je prends ma voiture"
                              sans que cela apparaisse aussi à la date d'après
                              ci sur l'image 13-10-2008)
                              on tchaterait indépendamment sur chaque date de match...

                              c'est plus clair là ?
                              merci encore de m'aider

                              sinon pour l'affichafge de l'ID effectivement je l'ai pas mis dans la requete SQl c'est pour ça
                              bye
                              1. Bonjour,

                                Je pense que tu dois donner des noms différents aux variables Pseudo et Message, tu pourrais utiliser un tableau, ensuite mettre à jour ta colonne date lors de la création d'un nouveau enregistrement et également de tester la valeur de ta date dans ton select. Exemple de code pour le tableau
                                <form action="page2.php" method="post">
                                <p><?php
                                echo "Pseudo : <input type='text' name='pseudo['.$date']' /><br />";
                                echo "Message :  <input type='text' name='message['.$date']' /><br />
                                ?>
                                <input type="submit" value="Envoyer" />
                                </p>
                                </form>
                                . Tu peux alors tester tes variables en fonction de la valeur de ta date
                                foreach($listeDates as $cle=>$date){
                                     echo "<tr>";
                                     //premiere colone date
                                     echo '<td align="center"><DIV class="dateclass">'.$date.'</DIV><br>';
                                	 //minitchat
                                	 if (isset($_POST['pseudo[.$date]']) AND isset($_POST['message[.$date['])) // Si les variables existent
                                {
                                    if ($_POST['pseudo[.$date]'] != NULL AND $_POST['message[.$date]'] != NULL) // Si on a quelque chose à enregistrer
                                    {
                                        // D'abord, on se connecte à MySQL
                                        mysql_connect("localhost", "ID", "pswd");
                                        mysql_select_db("test");
                                 
                                        // On utilise les fonctions PHP mysql_real_escape_string et htmlspecialchars pour la sécurité
                                        $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
                                        $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
                                 
                                        // Ensuite on enregistre le message
                                        mysql_query("INSERT INTO minitchatvolley VALUES('', '$pseudo', '$message',date'$date')");
                                 
                                        // On se déconnecte de MySQL
                                        mysql_close();
                                    }
                                }
                                . Tu changes également ton ordre select
                                // On utilise la requête suivante pour récupérer les 10 derniers messages :
                                $reponse = mysql_query("SELECT * FROM tchat where date = date'.$date' ORDER BY ID DESC LIMIT 0,10")or exit(mysql_error());


                                Tiens moi au courant. A plus
                                1. salut christounet
                                  j'ai modifié comme tu me l'as dis
                                  d'abord j'ai changé le champ date dans la table en date_match sur conseil d'un pote
                                  ensuite j'ai modifié le code comme suis
                                  if (isset($_POST['pseudo[.$date]']) AND isset($_POST['message[.$date]'])) // Si les variables existent
                                  {
                                      if ($_POST['pseudo[.$date]'] != NULL AND $_POST['message[.$date]'] != NULL) // Si on a quelque chose à enregistrer
                                      {
                                          
                                   
                                          // On utilise les fonctions PHP mysql_real_escape_string et htmlspecialchars pour la sécurité
                                          $message = mysql_real_escape_string(htmlspecialchars($_POST['message[.$date]']));
                                          $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo[.$date]']));
                                   
                                          // Ensuite on enregistre le message
                                          mysql_query("INSERT INTO tchat VALUES('', '$pseudo', '$message','date_match'$date'')")or die(mysql_error());
                                   
                                          // On se déconnecte de MySQL
                                          mysql_close();
                                      }
                                  }
                                  
                                   
                                   
                                  // Que l'on ait enregistré des données ou pas...
                                  // On affiche le formulaire puis les 10 derniers messages
                                   
                                  // Tout d'abord le formulaire :
                                  
                                  
                                   ?>
                                   
                                   
                                  <form action="page2.php" method="post">
                                  <p><?php
                                  echo "Pseudo : <input type='text' name='pseudo['.$date']' /><br />";
                                  echo "Message :  <input type='text' name='message['.$date']' /><br />";
                                  ?>
                                  <input type="submit" value="Envoyer" />
                                  </p>
                                  </form>
                                   
                                  <?php
                                   
                                  // Maintenant on doit récupérer les 10 dernières entrées de la table
                                  // On se connecte d'abord à MySQL :
                                  mysql_connect("localhost", "id", "pswd");
                                  mysql_select_db("volleycrna");
                                   
                                  // On utilise la requête suivante pour récupérer les 10 derniers messages :
                                  $reponse = mysql_query("SELECT * FROM tchat where date_match = date_match'.$date' ORDER BY DESC LIMIT 0,10") or die(mysql_error()) ;
                                  
                                   
                                  
                                   
                                  // Puis on fait une boucle pour afficher tous les résultats :
                                  while ($donnees = mysql_fetch_array($reponse) )
                                  {
                                  ?>
                                  
                                  <p><strong><?php echo $donnees['pseudo']; ?></strong> :  <?php echo $donnees['message'];?></p>
                                  
                                   
                                   
                                  <?php
                                  }
                                  // Fin de la boucle, le script est terminé !
                                  // On se déconnecte de MySQL
                                  mysql_close();
                                  
                                  
                                     echo "</td>";
                                       


                                  et ça ne change rien ....:-(
                                  toujours un affichage dans le 1er
                                  2 dans le second

                                  ....
                                  • 1
                                  • 2