Partage
  • Partager sur Facebook
  • Partager sur Twitter

modification d'une base de donnée

Sujet résolu
    27 août 2006 à 14:39:59

    Bonjour,

    je poursuis mes exercices sur le cours PHP de Mathéo.
    Je vais procéder par étape pour vous expliquer
    • ce que je souhaite faire,
    • comment je comptais le faire
    • le code obtenu
    • et là ou je pense que ça bloque.


    L'objectif est:
    • d'abord de générer un tableau HTML qui ira lire et affichera chaque donnée de la base de donnée jeux_videos
    • de pouvoir modifier chaque valeur de chaque cellule du tableau en cliquant dessus

    Ma démarche et mon raisonnement ont été les suivants:
    • génerer une ligne par enregistrement de la base de donnée
    • La valeur de chaque cellule est entourée de balises HTML "<a href=" faisant donc de chacune des données un lien
    • le lien mène vers un formulaire ou l'on pourra enregistrer la nouvelle valeur modifiée de la cellule
    • une fois la valeur saisie dans le formulaire, la donnée est mise à jour
    • en cliquant sur la donnée à modifier, je sais quelle champs modifier. je ne sais par contre pas de quelle ligne il s'agit. Afin de résoudre cela, j'ai choisi de transmettre l'ID de l'enregistrement dans le lien internet grace à la variable superglobale $_GET
    • je récupère la variable superglobale dans le formulaire et dans le script de modification.


    Voici donc le code de mes deux fichiers:
    celui générant le tableau
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
       <head>
           <title>Page d'exemple pour tester le CSS</title>
           <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
           <link rel="stylesheet" media="screen" type="text/css" title="Essai" href="13-css pour tableaux.css" />
       </head>
       
       <?php
    mysql_connect("localhost", "root", ""); // Connexion à MySQL
    mysql_select_db("test"); // Sélection de la base test

    // On est connectés, on peut travailler sur la BDD
    // ...
    // ...
    $retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM jeux_videos");
    $donnees = mysql_fetch_array($retour);


    $reponse = mysql_query("SELECT * FROM jeux_videos ORDER BY prix")or die(mysql_error());
    ?>

    Il y a <?php echo $donnees['
    nbre_entrees']; ?> jeux vidéos en vente !

    <table id ="test">


    <thead> <!-- En-tête du tableau -->
           <tr>
               <th>Nom</th>
               <th>Possesseur</th>
               <th>Prix</th>
                       <th>Console</th>
               <th>Nombre maximum de joueurs</th>
               <th>Commentaires</th>
                       <th>Modifier</th>
                       <th>Supprimer</th>
           </tr>
       </thead>
    <caption>Liste des jeux en vente</caption>

       
    <?php

    while ($donnees = mysql_fetch_array($reponse) )
    {
    ?>

       <tr>
           <td width="19%"><a href="modification2.php?id=.$donnees['
    ID']." target="_blank"><?php echo $donnees['nom']; ?></td>
               <td width="7%"><a href="modification2.php?id=$donnees['
    ID']"><?php echo $donnees['possesseur']; ?></td>
           <td width="6%"><a href="modification3.php?id=$donnees['
    ID']"><?php echo $donnees['prix']; ?></td>
               <td width="9%"><a href="modification4.php?id=$donnees['
    ID']"><?php echo $donnees['console']; ?></td>
               <td width="6%"><a href="modification5.php?id=$donnees['
    ID']"><?php echo $donnees['nbre_joueurs_max']; ?></td>
               <td width="33%"><a href="modification6.php?id=$donnees['
    ID']"><?php echo $donnees['commentaires']; ?></td>
               <td width="5%"><a href="modification.php?id=$donnees['
    ID']"><?php ; ?>modifier</td>
               <td width="5%"><a href="suppression.php?id=$donnees['
    ID']">supprimer</td>
       </tr>
     


    <?php
    }
    ?>

    </table>

    <?php
    // On a fini de travailler, on ferme la connexion :
    mysql_close(); // Déconnexion de MySQL
    ?>

    celui générant le formulaire et modifiant la donnée
    <?php

    // --------------- Etape 1 -----------------
    // Si un message est envoyé, on l'enregistre
    // -----------------------------------------

    if (isset($_POST['nom']))
    {
       
        $nom = htmlentities($_POST['nom'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité


    mysql_connect("localhost", "root", "");
    mysql_select_db("test")
        // On peut enfin enregistrer
        mysql_query("UPDATE jeux_videos SET nom='$_POST['nom']' WHERE ID='$donnees['ID']'")
            or die(mysql_error());
           
    mysql_close();
    }
    ?>



    Le HIC!!!

    Vous vous en doutez si je poste sur le forum, cela coince quelque part.

    J'ai essayé d'afficher simplement la valeur de "$_GET['ID']" et cela ne fonctionne pas.
    J'en conclue que j'ai mal rédigé le lien internet appelant le script générant le formulaire et transférant l'ID.

    Mon araisonnement est il juste?
    Si mon approche est coorect, pouvez vous me dire ou se trouve l'erreur?
    Pouvez vous m'indiquer également comment fonctionne les guillemets, les apostrophes et les concaténations?
    J'ai lu individuellement les explications dans le cours de Mathéo mais à force d'avoir le nez dedans, de jongler entre les tutoriaux, je n'y comprends plus rien et ne sais même plus où regarder.

    Merci pour votre aide.

    Lorran
    • Partager sur Facebook
    • Partager sur Twitter
      27 août 2006 à 14:57:46

      Citation : Lorran


      Celui générant le formulaire et modifiant la donnée


      <?php

      // --------------- Etape 1 -----------------
      // Si un message est envoyé, on l'enregistre
      // -----------------------------------------

      if (isset($_POST['nom']))
      {
         
          $nom = htmlentities($_POST['nom'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité


      mysql_connect("localhost", "root", "");
      mysql_select_db("test")
          // On peut enfin enregistrer
          mysql_query("UPDATE jeux_videos SET nom='$_POST['nom']' WHERE ID='$donnees['ID']'")
              or die(mysql_error());
             
      mysql_close();
      }
      ?>




      Ben tu a pas d'autre code parce que je vois pas de trace de formulaire la dedans??

      Et c'est quoi tout tes fichiers modification1,2,3,4??

      Tu dois transmettre plusieurs variables du style


      Le lien: Modification.php?champs=['Nom du champs']&id=['L'id']

      Le code de modification.php

      <?php

      $id = $_GET['id'];
      $champs = $_GET['champs'];

      $sql = "SELECT $champs FROM jeauxvideos WHERE id=$id"; // Nom de la tablme à vérifier, j'ai la flegme :D
      $sql = mysql_query($sql);
      $sql = mysql_fetch_array($sql);
      $valeur = $sql[$champs];
      echo $valeur; // Tu affiches la valeur...
      ?>


      Je t'ai pas mal aidé là je crois :D

      Mais attention!! C'est vraiment pas très sécurisé (encore que...) Donc juste pour apprentissage.

      Indice: tu devras passer le nom du champs encore une fois pour le traitement de tes données, que ce soit en GET ou un POST (champs caché: <input type="hidden" />)

      Je te laisse chercher le reste :D
      • Partager sur Facebook
      • Partager sur Twitter
        27 août 2006 à 15:04:09

        < a href="modification2.php?id=<?php echo $donnees['ID']; ?>">


        Car sinon il ne comprend pas la variable ;) .
        • Partager sur Facebook
        • Partager sur Twitter
          27 août 2006 à 23:13:15

          Merci pour ta réponse why not

          Citation : WhyNot



          Ben tu a pas d'autre code parce que je vois pas de trace de formulaire la dedans??



          Effectivement, j'ai effacé le code du formulaire à force de bidouiller mon code et de vérifier ce qui marchait ou pas.

          Citation : WhyNot


          Et c'est quoi tout tes fichiers modification1,2,3,4??

          Tu dois transmettre plusieurs variables du style


          Le lien: Modification.php?champs=['Nom du champs']&id=['L'id']




          J'avais justement prévu de faire ce que tu suggères. Mais avant de me lancer la dessus, je préférais déja résoudre le problème qui m'occupe et bien comprendre ou étais mon erreur.
          En attendant, je comptais créer un fichier pour le champs "nom", un pour le champs"possesseur, un pour le "prix"......
          pas trés esthétique mais bon.

          Par rapport à ton code:

          Citation : WhyNot


          Le code de modification.php

          <?php

          $id = $_GET['id'];
          $champs = $_GET['champs'];

          $sql = "SELECT $champs FROM jeauxvideos WHERE id=$id"; // Nom de la tablme à vérifier, j'ai la flegme :D
          $sql = mysql_query($sql);
          $sql = mysql_fetch_array($sql);
          $valeur = $sql[$champs];
          echo $valeur; // Tu affiches la valeur...
          ?>




          La variable ID se transmets sans problème sur ma seconde page.
          Par contre la variable "champs" ne passe pas.
          ni dans l'adresse de la page, ni quand j'essaie d'afficher la valeur de $_GET['champs']

          D'apres les cours de Mathéo, les variables superglobales sont des arrays. Pour moi, "champs" était une variable du type $champs=nom. J'ai cru que l'erreur se situait à cet endroit la.
          J'ai donc créé un array pour la variable "champs":
          $champs = array ("nom", "possesseur", "prix", "console", "nbre_joueurs_max", "commentaires");


          Le résultat reste identique.

          Je vous joins les codes:

          Voici pour le tableau:
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
             <head>
                 <title>Page d'exemple pour tester le CSS</title>
                 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
                 <link rel="stylesheet" media="screen" type="text/css" title="Essai" href="13-css pour tableaux.css" />
             </head>
             <!-- on ne peut pas transmettre des données  "hidden" par la méthode GET via un formulaire que si une autre donnée à été saisie et envoyer via un bouton submit
          du coup, il faut définir une variable, lui affecter une valeur et l'
          intégrer dans / pour le GET   
          deuxième point:  toutes les variables superglobales sont des arrays !!!!!!!! -->
             <?php
          mysql_connect("localhost", "root", ""); // Connexion à MySQL
          mysql_select_db("test"); // Sélection de la base test

          // On est connectés, on peut travailler sur la BDD
          // ...
          // ...
          $retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM jeux_videos");
          $donnees = mysql_fetch_array($retour);


          $reponse = mysql_query("SELECT * FROM jeux_videos ORDER BY ID")or die(mysql_error());
          ?>

          Il y a <?php echo $donnees['nbre_entrees']; ?> jeux vidéos en vente !

          <table id ="test">


          <thead> <!-- En-tête du tableau -->
                 <tr>
                     <th>Nom</th>
                     <th>Possesseur</th>
                     <th>Prix</th>
                             <th>Console</th>
                     <th>Nombre maximum de joueurs</th>
                     <th>Commentaires</th>
                             <th>Modifier</th>
                             <th>Supprimer</th>
                 </tr>
             </thead>
          <caption>Liste des jeux en vente</caption>

             
          <?php

          $champs = array ("nom", "possesseur", "prix", "console", "nbre_joueurs_max", "commentaires");

          while ($donnees = mysql_fetch_array($reponse) )
          {
          ?>

             <tr>
                 <td width="19%"><a href="modification2.php?champs=<?php echo $champs['0']; ?>&id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php echo $donnees['nom']; ?></td>
                     <td width="7%"> <a href="modification2.php?champs=<?php echo $champs['1']; ?>&id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php echo $donnees['possesseur']; ?></td>
                 <td width="6%"> <a href="modification2.php?champs=<?php echo $champs['2']; ?>&id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php echo $donnees['prix']; ?></td>
                     <td width="9%"> <a href="modification2.php?champs=<?php echo $champs['3']; ?>&id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php echo $donnees['console']; ?></td>
                     <td width="6%"> <a href="modification2.php?champs=<?php echo $champs['4']; ?>&id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php echo $donnees['nbre_joueurs_max']; ?></td>
                     <td width="33%"><a href="modification2.php?champs=<?php echo $champs['5']; ?>&id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php echo $donnees['commentaires']; ?></td>
                     <td width="5%"> <a href="modification.php?id=<?php echo $donnees['ID']; ?>"> <target="_blank"><?php ; ?>modifier</td>
                     <td width="5%"> <a href="suppression.php?id=<?php echo $donnees['ID']; ?>">supprimer</td>
             </tr>
           


          <?php
          }
          ?>

          </table>

          <?php
          // On a fini de travailler, on ferme la connexion :
          mysql_close(); // Déconnexion de MySQL
          ?>


          Voila pour le fichier du formulaire. Pour l'instant j'ai viré le formulaire pour ne faire apparaitre que le code pour afficher la valeur de $_GET et ainsi vérifier si les valeurs passent.



          Citation : WhyNot


          Mais attention!! C'est vraiment pas très sécurisé (encore que...) Donc juste pour apprentissage.


          Pas trés sécurisé, je suis d'accord. Comme tu le dis, un $_POST avec un champs caché serait préférable. Encore que le seul risque à ce que j'ai compris est de modifier l'adresse manuellement et ains de voir les autres données. Au cas où la protection des données affichées n'est pas importante, la solution peut être parfaitement satisfaisante.

          Citation : WhyNot


          Indice: tu devras passer le nom du champs encore une fois pour le traitement de tes données, que ce soit en GET ou un POST (champs caché: <input type="hidden" />)



          Je reviens sur le $_POST et le champs caché.
          Je ne peux pas l'utiliser car ce sont des balises utilisés dans le cadre d'un formulaire.
          Si je veux transmettre les valeurs postés, il me faudrait un bouton "submit" que je ne vois pas du tout ou positionner dans mon tableau HTML.....
          • Partager sur Facebook
          • Partager sur Twitter
            28 août 2006 à 0:03:38

            Ca fait plaisir de voir quelqu'un qui réfléchit et essaie de comprendre...

            Concernant tes variables 'superglobales' (ici $_GET) ce sont effectivement des array (tableaux). Mais je ne vois pas bien ce que tu vas faire avec ton $champs = array ("nom", "possesseur", "prix", "console", "nbre_joueurs_max", "commentaires"); :D

            En fait quand tu fais l'url, tu peux et doit mettre les valeurs des clés de ton tableau comme ceci: cle=valeur après le ?

            Je m'explique: l'url

            index.php?champs=console&id=3

            "Générera" une array $_GET dans ta page de destination (index.php) exploitable avec PHP, autrement dit, si tu fais un print_r($_GET), tu trouves

            Citation : La fonction print_r dans la tête à WhyNot

            array
            (
            'champs' => 'console',
            'id' => '3'
            )



            J'espère t'avoir un peu éclairé (je t'avoue que je suis pas super frais dans ma tête :D)

            Ton code un peu corrigé et optimisé donne ceci:

            <?
            $champs = array ("nom", "possesseur", "prix", "console", "nbre_joueurs_max", "commentaires");

            while ($c = mysql_fetch_array($reponse) )
            {

               echo '<tr>';
               
                         foreach($champs as $champ) // Il va faire une boucle en remplaçant la valeur de $champ successivement par chaque valeur que contient le tableau $champs
                         {
                              echo '<td><a href="modification.php?champs='.$champ.'&amp;id='.$donnees['id'].'">'.$donnees[$champ].'</a></td>';
                              // Le &amp; pour la validation W3C ;)
                   
                              
                         }
                         
                         echo '<td><a href="suppression.php?id='.$id.'">Supprimes</a></td>';
                 
                  // Tu avais oublier de fermer tous tes <a> => pas bien !!
                   
               echo '</tr>';
             

            }
            ?>


            Essaie de bien regarder, pas mal de choses ont changé, ça devrait fonctionner mais je t'avoue ne pas avoir fait de debugg...

            Je te félicite pour ton initiative d'essayer de faire des choses "en plus", tu deviendras un grand :D

            Personnelement, je préfère faire des echo que des <? ?> à tout bout de champs, ça rend mieux... je trouve ;) (et je crois aussi que c'est plus optimisé :D)
            • Partager sur Facebook
            • Partager sur Twitter
              1 septembre 2006 à 20:28:03

              Hello,

              apres une semaine de dure labeur et avec le week end arrivant, je profite de ce début de soirée pour me repencher sur mon code laissé en suspens depuis la semaine dernière.

              Pour rappel, ma démarche était la suivante:
              • afficher toute la base de donnée dans un tableau. Chaque donnée affichée est un lien faisant appel à un formulaire généré par PHP;
              • je récupère le champs de la donnée que je souhaite modifier par un $_GET afin de ne générer le formulaire que pour le champs qui m'intéresse. Je transmets en champs caché l'ID et le champs pour la troisième étape;
              • Enfin, je cherche à mettre à jour la donnée. Pour cela je récupère la variable "champs". Pour chaque champs, je modifie ma requete UPDATE.


              Il reste un dernier obstacle situé je pense dans les lignes suivantes:

              echo 'mysql_query("UPDATE jeux_videos SET prix='.$prix.', WHERE ID='.$id.'")'
                      or die(mysql_error());


              Apres avoir vérifié que toutes mes variables passaient bien d'une page à l'autre grace à des "echo", je ne vois pas ou l'erreur peut se trouver.

              Dernier symptome:

              lorsque je clique sur le bouton submit du formulaire, une page est généré et affiche l'ID sans rien d'autre. De plus, la modification des données ne fonctionne pas.

              Est ce que ce sont bien ces lignes qui déconnent?
              Si oui, ou se trouve mon erreur?


              Merci pour vos indications!!!
              • Partager sur Facebook
              • Partager sur Twitter
                2 septembre 2006 à 11:15:03

                Bonjour,

                en me paluchant le forum, j'ai trouvé plusieurs personnes ayant le même problème.

                Une des réponses apportés à ces posts du forum étaient la bonne.

                désormais tout fonctionne.

                J'ai du remplacer le "£champs" dans mon echo par le nom du champs

                Je considère le sujet comme résolu même si j'aurais souhityé que ça marche avec "$champs".

                merci à tous
                • Partager sur Facebook
                • Partager sur Twitter
                  2 septembre 2006 à 13:42:39

                  Citation : Whynot

                  <?php

                  $id = $_GET['id'];
                  $champs = $_GET['champs'];

                  $sql = "SELECT $champs FROM jeauxvideos WHERE id=$id"; // Nom de la tablme à vérifier, j'ai la flegme :D
                  $sql = mysql_query($sql);
                  $sql = mysql_fetch_array($sql);
                  $valeur = $sql[$champs];
                  echo $valeur; // Tu affiches la valeur...
                  ?>

                  Perso j'aurais plutôt mis:

                  $sql = mysql_query("SELECT".$champs." FROM jeuxvideos WHERE id=".$id.");
                  //Je n'ai pas vérifié il y a peut être un parse error...

                  Mais ainsi $champs devrait marcher ;) !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  modification d'une base de donnée

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown