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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    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
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    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
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    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
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    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
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    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 averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    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.

+ 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