Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction Delete - PDO

Suite a mise à jour de mon site chez OVH

Sujet résolu
    13 août 2015 à 10:45:02

    Bonjour,

    Suite à une mise à jours PHP chez OVH,
    Je me retrouve face à un problème concernant DELETE (et aussi Update sur mon  site)
    j'avais une petite interface d'administration qui fonctionnait bien avec l'ancienne version
    où sous forme de tableau html je pouvais voir et administrer mes actualités, mes partenaires
    les modifier et les supprimer et cela sans passer par l'interface phpmyadmin

    Je me suis donc lancé a refaire en PDO, comme conseillé sur le cour Openclassrooms
    J'arrive à me connecter et retrouve mes éléments à la base en utilisant

    $bdd = new PDO('mysql:host .....

    pour cela pas de problèmes je pense avoir compris

    mais maintenant je n'arrive pas à utiliser par exemple la fonction DELETE dans mon tableau
    Fonction appelée sous forme de lien dans la dernière cellule de mon tableau

    l'ancien code était de ce type :

    $sql = 'Delete from partenaires where id ='.$id;
    
            // on envoie la requete
            $req = mysql_query($sql) or die('Erreur SQL !<br>' . $sql . '<br>' . mysql_error());
    }
    // on créer la requete SQL et on l'envoie 
    $sql = 'SELECT id,lien,adresse,ordre FROM partenaires ORDER BY ordre';
    
    .....

     '<td bgcolor="#FFFFCC" width="62" align="center"><font face="Arial, Helvetica, sans-serif" color="#FFFFFF" size="1"><b> <a href="index.php?page=modifie_lien&id='.$data['id'].'"><< modif >></a></b></font></td>'. '<td bgcolor="#FFFFCC" width="48" align="center"><font face="Arial, Helvetica, sans-serif" color="#FFFFFF" size="1"><b> <a href="index.php?page=admin_liens&id='.$data['id'].'" ><< sup >></a></b></font></td></tr>';


    je cliquais simplement sur le lien << sup >> et cela supprimais de la base l'id et le reste...

    maintenant je teste avec cette nouvelle version POD mais je ne trouve pas la solution

      
    <?php
    
    try
    
    {
    
    // On se connecte à MySQL
    
        $bdd = new PDO('mysql:host=*******;dbname=********;charset=utf8', '*******', '*******');
    
    
    }
    
    catch(Exception $e)
    
    {
    
        // En cas d'erreur, on affiche un message et on arrête tout
    
            die('Erreur : '.$e->getMessage());
    
    }
    
    
    // Si tout va bien, on peut continuer
    
    
    // On récupère tout le contenu de la table partenaires
    
    $reponse = $bdd->query('SELECT * FROM partenaires');
    
    
    // On affiche chaque entrée une à une
    
    while ($donnees = $reponse->fetch())
    
    {
    
    ?>
    
        <tr bgcolor="#FFFFFF">
    
        <td><?php echo $donnees['lien']; ?> - <?php echo $donnees['adresse']; ?> - <?php echo $donnees['ordre']; ?></td>
    
        <td>Lien Modifier à venir </td>
        
        <td><?php
    
    $req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = $id');
    
    
    
         echo '<a href="index.php?page=admin_liens2&id='.$donnees['id'].'" ><< sup >></a>'
    
    ?></td>
    
        
       </tr>
    
    <?php
    
    }
    
    
    $reponse->closeCursor(); // Termine le traitement de la requête
    
    ?>
    </table>

    voyez vous où peut se trouver le problème dans mon code ?

    pour le moment je n'en suis qu'a DELETE j'espere que pour UPDATE cela sera dans le même style de correction ;-)

    Merci pour votre aide









    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2015 à 11:00:50

      Salut,

      Deux remarque dans ton code:

      La première, tu n'a pas fermé la première requête avec la fonction closeCursor;

      La deuxième, dans ta seconde requête pour je pense que t'a variable $id n'est pas affichée à cause des guillemets mal utilisées.

      Corrige et réessaye 

      -
      Edité par bechir_ 13 août 2015 à 11:04:30

      • Partager sur Facebook
      • Partager sur Twitter

      Making functional apps for digital products @NEOTIC

      -

        13 août 2015 à 11:24:17

        Merci Pour ta réponse Hatll

        Pour vous dire que je  débute et c'est assez dur en fait...

        je ne vois pas où placer la fermeture de la première requête
        qui se termine si j'ai bien compris par un While... (et que nous sommes là sur la première requête...)

        dont le but est l'affichage du tableau html

        si je ferme, au niveau de la ligne 36 par exemple avec

        $reponse->closeCursor(); // Termine le traitement de la requête

        Mon tableau ne s'affichera pas,

        j'y vais en tâtonnant , en testant .... merci encore




        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2015 à 12:36:59

          tu peux le faire autrement:

          $donnees = $reponse->fetchAll(); // Cette fonction retourne un tableau contenant toutes les entrés trouvées
          $reponse->closeCursor();
          foreach ($donnees as $value)
          { # code... $req = $db->exec('DELETE FROM ... WHRE ID='.$id); }


          Mais la logique du code, je le comprends pas car normalement, tu devais d'abord cliquer sur "sup" pour exécuter la requête

          -

          Edit: Ou j'ai pas bien vu ?

          -
          Edité par bechir_ 13 août 2015 à 12:37:51

          • Partager sur Facebook
          • Partager sur Twitter

          Making functional apps for digital products @NEOTIC

          -

            13 août 2015 à 14:30:26

            Me revoilà ;-) hatll

            en gros je mascagne en reprenant des exemples , des bouts de codes ici et là

            je ne sais vraiment pas si c'est propre

            mais bon

            étant novice , je comprend pas grand chose et c'est finalement assez compliqué pour moi

            je crois que je vais laisser tomber et faire les modifs directement sur phpmyadmin

            Grand merci en tout cas c'est sympa d'avoir pris du temps pour me répondre

            • Partager sur Facebook
            • Partager sur Twitter
              13 août 2015 à 15:23:28

              Bonjour MarcDonnad,

              Il ne faut pas lâcher si près du but. ;)

              Il ne reste que ton delete à corriger et c'est vraiment simple. Tout ce qu'il faut fairem comme hatll l'a mentionné plus tôt, c'est de légèrement modifier l'appel de la requête SQL pour s'assurer que la variable $id est bien passée et que la ligne est supprimer. Pour cela, il y a deux méthodes.

              La première, celle qui est la plus simple à appliquer : remplacer les simple quotes ( ' ) par des double quotes ( " ). Exemple :

              $req = $bdd->exec("DELETE FROM `partenaires` WHERE `id` = $id");

              La seconde méthode, consiste à sortir $id de la chaine et de le concaténer à la chaine. Exemple :

              $req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);

              Une requête DELETE avec PDO retour un entier du nombre d'entrées qui a été supprimé ou false si aucune entrée n'a été supprimé. Tu peux utiliser cette valeur pour afficher le message que si la suppression a eu lieu. Exemple :

              if ( !$req ) {
                  echo 'La suppression n\'a pas eu lieu';
              } else {
                  echo 'L\'entrée '.$id.' a été supprimée';
              }

               Un dernier problème que j'ai remarqué, c'est que ta requête n'est pas correctement positionnée dans ton fichier. La suppression devrait avoir lieu que si la page à reçu l'identifiant de la ligne à supprimer par $_GET. Donc la requête devrait être placé avant ta boucle et être dans une condition if. Exemple :

              if ( isset($id) ) {
                  $req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);
              
                  if ( !$req ) {
                      echo 'Erreur de suppression';
                  } else {
                      echo 'Entrée '.$id.' supprimée';
                  }
              }

              -
              Edité par Youmy001 13 août 2015 à 15:24:24

              • Partager sur Facebook
              • Partager sur Twitter
              N'oubliez pas la mention +1 si je vous ai aidé | APIne Framework
                13 août 2015 à 15:50:55

                Bonjour Youmy001

                merci du soutient !  ;) et de votre entraide solidaire à vous 2 !!

                je n'ai pas lâché l'affaire.... en fait j'ai trouvé un bout de code sur un site

                bon c'est peut être pas super mais ça marche

                je fais passer pour ceux que cela intéresse et qui serait dans le même cas que moi


                il  faut une deuxième page php que j'ai nommé delete1.php que l'on appelle dans le premier "echo" ci dessous de ma page principale

                <?php
                
                try
                
                {
                
                // On se connecte à MySQL
                
                    $bdd = new PDO('mysql:host=*****;dbname=*****;charset=utf8', '*****', '*****');
                
                
                }
                
                catch(Exception $e) {
                   die('erreur : ' . $e -> getMessage());
                  }
                  $reponse = $bdd -> query('SELECT * FROM partenaires ORDER BY id ASC');
                  while ($donnees = $reponse->fetch())
                   {
                   echo "<hr /><div><a href='delete1.php?id=" . $donnees['id'] . "'><< SUPPRIMER CE LIEN >></a><p>";
                   echo "<b>Lien :</b> " . $donnees['lien'] . "<br />";
                   echo "<b>Adresse :</b>" . $donnees['adresse'] . "<br />";
                   echo "</p></div><hr />";
                  }
                  
                  ?>

                puis la fameuse et miraculeuse page delete1.php

                <?php
                try {
                   $bdd = new PDO('mysql:host=*******;dbname=*******;charset=utf8', '*******', '******');
                  } catch (Exception $e) {
                   die('erreur : ' . $e -> getMessage());
                  }
                if (isset($_GET['id']) && !empty($_GET['id'])) {
                 $id = $_GET['id'];
                 $sql = "DELETE FROM partenaires WHERE id = :id";
                 $q = array('id' => $id);
                 $req = $bdd -> prepare($sql);
                 $req -> execute($q);
                 header('Location:index.php'); 
                }
                ?>

                Maintenant je vais essayer de m'attaquer à l'Update et là c'est une autre paires de manches....

                le but dans mon tableau html est de cliquer sur modifier (voir copie ecran plus haut) > d’atterrir sur une page avec un formulaire qui aura récupéré les valeurs > de modifier sur ce formulaire > de cliquer sur envoyer"updater" tout cela via une requête et du code compliqué > ce qui mettra à jour les éléments de ma base de données partenaires -.... allez rock'n'roool





                -
                Edité par MarcDonnad 13 août 2015 à 15:51:10

                • Partager sur Facebook
                • Partager sur Twitter
                  13 juin 2017 à 19:01:47

                  bonjour,j'ai le même problème

                  je n'arrive pas a trouvé une méthode  pour supprimer une ligne de tableau

                  voici mon code mais comme ça il supprime toute la table

                  <?php
                                      session_start();
                                      include("bdconnect.php");
                                     
                                      $reponse = $bdd->query('SELECT * FROM utilisateurs');

                                      while($data = $reponse->fetch()){
                                  ?>
                                 <tr>
                                     <td id="t2"> <?php echo $data['nomUser'];?></td>
                                     <td id="t2"> <?php echo $data['prenomUser'];?> </td>
                                     <td id="t2"> <?php echo $data['emailUser'];?> </td>
                                     <td id="t2"> <?php echo $data['pseudoUser'];?> </td>
                                      <td id="t2"> <?php echo $data['passwordUser'];?> </td>
                                      <td id="t2"> <?php echo $data['villeUser'];?> </td>
                                     <td id="t2"> <?php echo $data['paysUser'];?> </td>
                                     <td id="t2"> <?php echo $data['ageUser'];?> </td>
                                     <td id="t2"> <?php echo $data['telephoneUser'];?> </td>
                                     <td id="t2"><input type="submit" name="supp" value="Supprimer" ></td>
                                 </tr>
                                 <?php
                                          if (isset ($_POST['supp']) ) {
                                         
                                              $insert=$bdd->prepare('DELETE FROM utilisateurs WHERE nomUser = ?');
                                              $insert->execute( array($data['nomUser']) );
                                          }
                                      }   
                                     
                                     
                                 ?>

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2017 à 19:44:22

                    Bonsoir tout l'monde. Bon, j'arrive après la bataille, mais il y a pas mal de trucs depuis le début du topic qui tendent à me hérisser les poils, donc je vais les adresser ici.

                    hatll a écrit:

                    Salut,

                    Deux remarque dans ton code:

                    La première, tu n'a pas fermé la première requête avec la fonction closeCursor;

                    Ce n'est en rien une obligation, sauf rare cas particulier (et aucun exemple ne me vient à l'esprit au moment où j'écris ces lignes, c'est dire si ces cas particuliers sont rares). La destruction de l'objet PDOStatement entrainera un appel automatique de la méthode PDOStatement::closeCursor().

                    hatll a écrit:

                    tu peux le faire autrement:

                    $donnees = $reponse->fetchAll(); // Cette fonction retourne un tableau contenant toutes les entrés trouvées
                    $reponse->closeCursor();
                    foreach ($donnees as $value)
                    { # code... $req = $db->exec('DELETE FROM ... WHRE ID='.$id); }

                    Cette utilisation de foreach() n'apporte rien, autant foreach $reponse directement (oui c'est possible).

                    Par ailleurs, aucun contrôle sur $id ? C'est là qu'utiliser une requête préparée PDO avec un typage adapté serait préférable.

                    Youmy001 a écrit:

                    [...]

                    $req = $bdd->exec("DELETE FROM `partenaires` WHERE `id` = $id");

                    [...]

                    $req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);

                    [...]

                    if ( isset($id) ) {
                        $req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);
                    
                        if ( !$req ) {
                            echo 'Erreur de suppression';
                        } else {
                            echo 'Entrée '.$id.' supprimée';
                        }
                    }

                    Même problème ici, une requête préparée avec le typage adapté est préférable. PDO fait pour vous les contrôles et blindages adaptés, sous réserve que vous lui communiquiez le bon typage, pourquoi vous en priver ?

                    De plus, si le mode d'erreurs par exception était actif, ce qui est un must, ton if() à la fin serait inutile.

                    MarcDonnad a écrit:

                    il  faut une deuxième page php que j'ai nommé delete1.php que l'on appelle dans le premier "echo" ci dessous de ma page principale

                    <?php
                    
                    try
                    
                    {
                    
                    // On se connecte à MySQL
                    
                        $bdd = new PDO('mysql:host=*****;dbname=*****;charset=utf8', '*****', '*****');
                    
                    
                    }
                    
                    catch(Exception $e) {
                       die('erreur : ' . $e -> getMessage());
                      }
                      $reponse = $bdd -> query('SELECT * FROM partenaires ORDER BY id ASC');
                      while ($donnees = $reponse->fetch())
                       {
                       echo "<hr /><div><a href='delete1.php?id=" . $donnees['id'] . "'><< SUPPRIMER CE LIEN >></a><p>";
                       echo "<b>Lien :</b> " . $donnees['lien'] . "<br />";
                       echo "<b>Adresse :</b>" . $donnees['adresse'] . "<br />";
                       echo "</p></div><hr />";
                      }
                      
                      ?>

                    puis la fameuse et miraculeuse page delete1.php

                    <?php
                    try {
                       $bdd = new PDO('mysql:host=*******;dbname=*******;charset=utf8', '*******', '******');
                      } catch (Exception $e) {
                       die('erreur : ' . $e -> getMessage());
                      }
                    if (isset($_GET['id']) && !empty($_GET['id'])) {
                     $id = $_GET['id'];
                     $sql = "DELETE FROM partenaires WHERE id = :id";
                     $q = array('id' => $id);
                     $req = $bdd -> prepare($sql);
                     $req -> execute($q);
                     header('Location:index.php'); 
                    }
                    ?>

                    Hmm... ça fait beaucoup de fois le même code de connexion BDD, ne trouves-tu pas ?

                    Je vois une requête préparée, bien, mais tu insères ton paramètre id directement via PDOStatement::execute(). Ceci signifie qu'il va être traité comme étant typé string, avec le blindage de sécurité qui va avec, et l'encadrement de guillemets SQL qui va avec. Je sais pas pour toi, mais pour moi 1 et '1' ce n'est pas la même chose. Certains moteurs tolèreront et rattraperont cette erreur mais ça dépendra du contexte (bon courage avec un paramètre dans la clause LIMIT par exemple), d'autres moteurs ne voudront rien savoir. Tu peux en revanche insérer tes paramètres un à un avec PDOStatement::bindValue(), avec le bon type sous forme de constante (ici le type entier serait PDO::PARAM_INT par exemple), et ensuite seulement lancer PDOStatement::execute() à vide. Là ça marche.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Fonction Delete - PDO

                    × 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