IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Boucle qui ne fonctionne pas bien que la 1ère fois [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut Boucle qui ne fonctionne pas bien que la 1ère fois
    Re-Bonjour,

    Comme je suis en chance parce qu'on vient de bien me répondre et clairement, j'en profite pour poser une deuxième question :

    Je m'empresse de préciser, à nouveau, que je copie texto les parties de scripts accompagnant un bouquin.
    Le problème : le code ci-dessous doit proposer 3 choix par plat d'un menu. Or si le titre annonçant les entrées s'affichent bien, le choix entre les trois entrée n'est pas affiché. Seul le bouton Exécuter est affiché. En cliquant dessus on part vers le choix des plats principaux puis des desserts. Et leurs choix s'affichent bien.
    A chaque étape, il y a un récapitulatif des plats déjà commandés. L'entrée ne figure jamais.
    J'ai vérifié par un mysql_num_rows la présence de 3 enregistrements pour le premier plat (Entrée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     **** Script FormCommmande.php ********
    <? php
    function FormCommande ($type_choix, $script, $connexion)
     {
       // Un petit message pour indiquer à quel stade on en est
       if ($type_choix == "Entrée")
        echo "Pour commencer nous vous proposons les entrées<P>";
       else
       if ($type_choix == "Plat")
    ...
    ...
     
    // Recherche des choix selon le type (entrée, plat ou dessert)
       $requete = "SELECT * FROM Carte WHERE type='$type_choix'";
       $resultat = ExecRequete ($requete, $connexion);
     
       // Affichage des choix : BUG car n'affiche pas le choix des entrées !!!
       while  ($choix = ObjetSuivant ($resultat))
         echo "$choix->libelle : "
          . "<INPUT TYPE='RADIO' NAME='id_choix' VALUE='$choix->id_choix'><P>";
     
       echo "<INPUT TYPE='SUBMIT' VALUE='Exécuter'>\n";
    ...
    ?>
    ****************
    Les 2 fonctions appelées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     function ExecRequete ($requete, $connexion)
     {
      $resultat = mysql_query ($requete, $connexion);
     
      if ($resultat)
       return $resultat;
      else 
      {  
        echo "<B>Erreur dans l'exécution de la requête '$requete'.</B><BR>";
        echo "<B>Message de MySQL :</B> " .  mysql_error($connexion);
        exit;
      }  
     } // Fin de la fonction ExecRequete
     
     
     // Recherche de l'objet suivant
     function ObjetSuivant ($resultat)
     {
       return  mysql_fetch_object ($resultat);
     }
    *****************
    Faudrait-il que je publie le code entier des 2 scripts pour être plus claire au risque de noyer le problème ?

    P.S. : comment fait-on pour faire afficher [Résolu] dans la liste des questions ?
    Merci.
    Rosa L.

  2. #2
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Merci d'utiliser la balise code (le petit # dans le menu) pour rendre le code plus lisible.

    Pour le "résolu", c'est le bouton en bas à gauche, juste à droite du bouton ajouter une réponse.

    Par contre erreur de forum, celui qui serait le plus concerné serait PHP -> Sous forum SGBD. Je déplace donc là bas et analyse le code après.

    Juste pour information quel est le livre que vous citez ?
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Si cela vient d'un livre, alors le scrip a été testé. Enfin, on peut le supposer.

    Je regarde le code et me dit que si rien ne s'affiche ni résultat, ni erreur alors c'est que la requête ne retourne absolument rien... Et d'un autre côté vous dîtes/prouvez que cela ne vient pas de là grâce au retour de mysql_num_rows...

    Alors quelques questions :
    1. Pouvez vous faire un echo de $type_choix juste avant la requête
    2. Où ajoutez-vous le mysql_num_rows ? (En d'autres termes, êtes-vous sûr qu'une requête n'est pas passée entre la requête des entrées et votre mysql_num_rows ?)
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Pouvez-vous modifier temporairement la fonction ExecRequete ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function ExecRequete ($requete, $connexion)
     {
      echo '<pre>'.$requete.'</pre>';
       $resultat = mysql_query ($requete, $connexion);
       echo '<pre>'.mysql_num_rows($resultat).'</pre>';
     
      if ($resultat)
       return $resultat;
      else 
      {  
        echo "<B>Erreur dans l'exécution de la requête '$requete'.</B><BR>";
        echo "<B>Message de MySQL :</B> " .  mysql_error($connexion);
        exit;
      }  
     } // Fin de la fonction ExecRequete
    
    
     // Recherche de l'objet suivant
     function ObjetSuivant ($resultat)
     {
       return  mysql_fetch_object ($resultat);
     }
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Ca va vite !
    J'ai rajouté mysql_num_rows après la demande de requête, comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $resultat = ExecRequete ($requete, $connexion);
       $om = mysql_num_rows($resultat);
      echo "$om enregistrements\n";
    Mais maintenant, j'ai 0 enregistrement !
    J'ai tellement fait d'essais...

    Le livre ? "Pratique de MySQL et PHP" de Rigaux chez O'Reilly. Editon 2003 (PHP 4 et MySQL 4). Mais je suis sous PHP 5 et MySQL 5 (la librairie MySQL de PHP 4 de mon installation Wamp 5 n'est pas compatible et personne ne semble savoir comment la mettre à jour pour tourner avec PHP 4 et MySQL 5).

    Allez, je mets le code des 3 scripts :
    FormCommande.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
     // Formulaire de saisie d'un choix à la carte
     function FormCommande ($type_choix, $script, $connexion)
     {
       // Un petit message pour indiquer à quel stade on en est
       if ($type_choix == "Entrée")
        echo "Pour commencer nous vous proposons les entrées<P>";
       else
       if ($type_choix == "Plat")
          echo "Maintenant choisissez un plat<BR>";
       else
          echo "Enfin choisissez un dessert<BR>";
     
       // Maintenant on crée le formulaire
       echo "<FORM ACTION='$script' METHOD='POST'><P>\n";
     
       // Champ caché avec le type de choix
       echo "<INPUT TYPE='HIDDEN' NAME='type_choix' VALUE='$type_choix'>";
     
       // Recherche des choix selon le type (entrée, plat ou dessert)
       $requete = "SELECT * FROM Carte WHERE type='$type_choix'";
       $resultat = ExecRequete ($requete, $connexion);
       $om = mysql_num_rows($resultat); // RL *******
      echo "$om enregistrements\n"; //RL *******
     
       // Affichage des choix : BUG car n'affiche pas le choix des entrées !!!
       while  ($choix = ObjetSuivant ($resultat))
         echo "$choix->libelle : "
          . "<INPUT TYPE='RADIO' NAME='id_choix' VALUE='$choix->id_choix'><P>";
     
       echo "<INPUT TYPE='SUBMIT' VALUE='Exécuter'>\n";
       echo "</FORM></TABLE>\n";
      }
    ?>


    ExSession.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <?php
      if (isSet($_COOKIE['id_session']))
      {
        // L'identifiant de session existe déjà
        $id_session = $_COOKIE['id_session'];
      }
      else
      {
        // Créons un identifiant
        $id_session = $_SERVER['REMOTE_ADDR'] . date("U");
     
        // Envoi du cookie
        SetCookie ("id_session", $id_session);
      } 
    ?>
     
    <HTML><HEAD>
      <TITLE>Une commande au restaurant</TITLE>
      <LINK REL=stylesheet HREF='films.css' TYPE='text/css'>
    </HEAD>
     
    <BODY>
    <H1>Faites votre commande au restaurant</H1>  
     
    <?php
    require_once ("Connect.php");
    require_once ("Connexion.php");
    require_once ("ExecRequete.php");
    require_once ("Normalisation.php");
    require_once ("FormCommande.php");
     
    // Connexion à la base
    $connexion = Connexion (NOM, PASSE, BASE, SERVEUR);
     
    // Normalisation des entrées HTTP
    Normalisation();
     
    // Si le type de choix n'est pas défini : on commence
    // par proposer les entrées
     
    if (!isSet($_POST['type_choix'])) 
    {
      echo "Bonjour. Nous vous avons attribué la session $id_session<BR>";
      FormCommande ("Entrée", "ExSession.php", $connexion);
    }
    else
    {    
      // Insérons dans la table le choix qui vient d'être fait
      // Il faudrait tester que id_choix est défini...
      $requete = "INSERT INTO Commande (id_session, id_choix) "
        . "VALUES ('$id_session', '{$_POST['id_choix']}')";
      ExecRequete ($requete, $connexion);
     
      // Affichage des choix déjà effectués
      $requete = "SELECT C2.* FROM Commande C1, Carte C2"
        . " WHERE id_session='$id_session' AND C1.id_choix=C2.id_choix"
        . " ORDER BY C2.id_choix ";
      $resultat = ExecRequete ($requete, $connexion);
      while ($choix = ObjetSuivant ($resultat))
        echo "Vous avez choisi : $choix->libelle<BR>\n";
     
      // Affichage de la suite
      if ($_POST['type_choix'] == 'Entrée')
        FormCommande ("Plat", "ExSession.php", $connexion);
      else if ($_POST['type_choix'] == 'Plat')
        FormCommande ("Dessert", "ExSession.php", $connexion);
      else
        {
          // Traitement de la commande complète. Ici on détruit...
          echo "<P>Nous avons noté votre commande. Merci !<BR>";
          $requete = "DELETE FROM Commande WHERE id_session='$id_session'";
          ExecRequete ($requete, $connexion);
        }
    }
    ?>
    </BODY></HTML>
    ExecRequete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
     // Exécution d'une requête avec MySQL
     
     function ExecRequete ($requete, $connexion)
     {
      $resultat = mysql_query ($requete, $connexion);
      if ($resultat)
       return $resultat;
      else 
      {  
        echo "<B>Erreur dans l'exécution de la requête '$requete'.</B><BR>";
        echo "<B>Message de MySQL :</B> " .  mysql_error($connexion);
        exit;
      }  
     } // Fin de la fonction ExecRequete
     
     // Recherche de l'objet suivant
     function ObjetSuivant ($resultat)
     {
       return  mysql_fetch_object ($resultat);
     } 
     
     // Recherche de la ligne suivante (retourne un tableau)
     function LigneSuivante ($resultat)
     {
       return  mysql_fetch_assoc ($resultat);
     }
    ?>
    -----------

    Voila, voila...

    R. L.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut un temps pour moi...
    Rectification :
    La première fois, dans la boucle : 0 enregistrement (avec mysql_num_rows()
    La seconde fois : 3 enregistrements.
    C'est là le problème.
    La table Carte (liste des plats) commence avec l'id 1 (et non 0). C'est le code sql que j'ai importé avec PhpMyAdmin.
    Ca a de l'importance ? Je commence à tout mélanger.

    R. L.

  7. #7
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    En fait, ça me rassure que vous ayez zéro ! J'ai l'impression que le problème vient de mysql et de la configuration de l'encodage. Les problèmes d'encodage se remarque notamment quand les recherches sur des chaînes accentuées ne retourne rien.

    Pour tester si cela vient de l'encodage deux choses à faire temporairement:
    1. Dans la base de données, vous remplacez Entrées par Entrees, et vous en faîtes de même.
    2. Vous faites la même chose dans le script PHP
    Si ça marche, alors on saura que le problème vient de l'encodage (charset) , alors reportez-vous à ces liens. C'est pas facile à comprendre du premier coup, alors si besoin d'aide, n'hésitez pas à reposer une question .

    10.3.1. Jeu de caractères et collation serveur
    10.3.2. Jeu de caractères et collation de base de données
    10.3.3. Jeu de caractères de tables et collation
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut Merci
    Merci Alexandre,

    Je vais me pencher sur la modif. dans la base de données.
    Je vais mettre Entrees au lieu d'Entrées dans la base. C'est sûrement l'encodage qui est en cause (encodage suédois par défaut).
    Dès que j'ai terminé d'aider à un déménagement, je m'y colle ;-).

    Donnerais alors de mes nouvelles.

    Encore merci.
    Rosa L.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Effectivement, c'est plutôt tordu les explications d'encodage des caractères.
    J'avoue que je n'ai pas tout lu.
    Il ne pourrait pas faire un point pratique du genre :
    Je veux une base française : j'ai besoin de tel encodage.
    Je veux une base européenne : j'ai besoin de tel autre encodage ?

    utf8 ne fonctionnait pas. J'ai choisi Latin 2 general ci pour chaque champ de la table. Un peu lourdingue je trouve...

    Je prendrais le temps de lire tout ça plus calmement.
    En tous cas, c'était bien un problème de jeu de caractères : le jeu suédois sans les accents français (par défaut) ne faisait pas l'affaire.

    Merci beaucoup Alexandre.
    Rosa L.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Macro EXCEL - Boucle qui ne fonctionne pas
    Par babouchka01 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/10/2011, 11h24
  2. [MySQL] boucle qui ne fonctionne pas dans autocompletion
    Par groskanel dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/08/2010, 14h56
  3. Boucle qui ne fonctionne pas
    Par Msieurduss dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 03/04/2009, 16h00
  4. Range.Offset(1) dans une boucle qui ne fonctionne pas
    Par Pierre.g dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/08/2008, 11h58
  5. [PERL] un grep qui ne fonctionne pas bien
    Par LE NEINDRE dans le forum Langage
    Réponses: 6
    Dernier message: 03/11/2005, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo