Bouton supprimer

Bouton supprimer - PHP - Programmation

Marsh Posté le 31-10-2018 à 18:49:39    

Bonjour,  
 
Je fait appel à vous car je suis débutant dans le code et je cherche à supprimer une ligne grâce à un bouton supprimer  
 
Voici mon code

Code :
  1. <?php
  2. try
  3. {
  4.  $bdd = new PDO('mysql:host=localhost;dbname=creche;charset=utf8','root', '');
  5. }
  6. catch (Exception $e){
  7.  die('Erreur : ' . $e->getMessage());
  8. ?>
  9. <table class="table table-hover">
  10. <thead>
  11.  <th>Nom </th>
  12.  <th>Prenom</th>
  13.  <th>Date de Naissance</th>
  14.  <th>Adresse</th>
  15.  <th>Contact des Parents</th>
  16.  <th>Remarques</th>
  17.  <th>Option</th>
  18.  <th>Option2</th>
  19. </thead>
  20. <?php
  21. $reponse = $bdd->query('SELECT * FROM children');
  22.  while($donnees=$reponse->fetch())
  23.  {
  24.   echo
  25.   '<tr>
  26.   <td>' . $donnees['children_lastname'] . '</td><td>' . $donnees['children_firstname'] . '</td><td>' . $donnees['children_birthday'] . '</td><td>' . $donnees['children_adress'] . '</td><td>' . $donnees['children_parents_contact'] . '</td><td>' . $donnees['children_remarks'] . '</td>
  27.   <td><button>Suppprimer</button></td>
  28.   </tr>';
  29.  }
  30. ?>


 
je n'arrive pas à voir comment récupérer l'id de la ligne que je veux supprimer et donc par la suite la supprimer.
 
Si quelqu'un à des idées, j'ai regarder un peu des cas similaire déjà sur internet mais j'arrive pas à l'adapté.
 
sur le lien là => https://forum.hardware.fr/hfr/Progr [...] 2620_1.htm
 
Voici un poste qui me semble bien mais je comprend pas trop quand il met en commentaire  
"  //Tu rajoutes un lien vers le script delete.php avec en parametre l'ID du contact "  
 
Merci d'avance pour vos réponses et pour votre aide

Reply

Marsh Posté le 31-10-2018 à 18:49:39   

Reply

Marsh Posté le 31-10-2018 à 19:12:49    

Bonjour,
 
Merci de préciser la question, tu veux supprimer une ligne de quoi ? Une ligne de ta base de données, une ligne du tableau HTML, les deux, ou même autre chose ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 31-10-2018 à 21:51:41    

Bonsoir,
 
tout d'abord merci pour votre réponse, et excusez moi je me suis mal exprimé.
 
je souhaiterais supprimer ma ligne sur le tableau HTML à l'aide d'un bouton et que cela supprime aussi dans la base de données.
 
Si je me suis encore un peu mal exprimé, n’hésitez pas à me demander, ou même m'envoyer un mp,  
 
Encore merci pour votre réponse

Reply

Marsh Posté le 31-10-2018 à 23:09:20    

La page HTML générée par ton script PHP actuel doit proposer d'effectuer une requête de type POST ou GET vers ton serveur (en générale on retient le type POST pour la modification de la base de données). C'est cette requête qui indiquera à ton serveur de supprimer une ligne dans ta bdd.
En HTML pur il faut utiliser les formulaires mais cela implique de charger à nouveau la page après la requête.

 

Actuellement on utilise une solution avec le Javascript afin d'effacer la ligne du tableau HTML et d'envoyer la requête, le tout sans recharger la page.
Selon ton niveau de connaissance il te faut donc commencer par choisir une des deux solutions. L'apprentissage de Javascript est souvent source de confusion au début, il permet en effet d'obtenir un côté dynamique tout comme PHP. La différence étant que le Javascript va être exécuté du côté client alors que le PHP est lui exécuté côté serveur. De plus le Javascript peut être exécuté de manière asynchrone. Tout cela doit bien être maitrisé sinon tu ne vas tenter de faire des choses qui n'ont pas de sens et qui ne peuvent fonctionner.


Message édité par MaybeEijOrNot le 31-10-2018 à 23:10:21

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 31-10-2018 à 23:23:57    

Re bonsoir :)  
 
Merci encore d'avoir pris le temps de répondre :)  
 
Malheureusement dans notre consigne d'exercice on doit utiliser que php Natif et pas de javascript ni de Jquery possible :/
 
Je viens de tomber sur un topic avec le même soucis sur OCR mais je n'arrive pas à l'adapter à mon code :/  
 
voici le lien en question => https://openclassrooms.com/forum/su [...] delete-pdo
 
et la partie qui m’intéresse provient de la réponse de  
 
" MarcDonnad 13 août 2015 à 15:50:55 "  
 
Merci pour votre réponse encore une fois.

Reply

Marsh Posté le 31-10-2018 à 23:48:40    

Ah oui je suis bête, la requête GET n'a pas forcément besoin d'utiliser un formulaire. Mais perso je partirai quand même sur un formulaire HTML car c'est plus facile à sécuriser. Pour le GET il faudrait à minima générer un token sinon n'importe qui pourrait vider ta base de données.

 

Avec un formulaire il faut d'abord modifier ta page HTML générée pour qu'elle introduise le formulaire (form). Tu places ton tableau dans le formulaire, tu ajoutes une colonne (td) dans laquelle tu places une checkbox (input type="checkbox" ) à chaque ligne avec pour nom (name="nom_variable" ) le nom qu'aura ta variable PHP qui sera de type array ($_POST['nom_variable']) et en valeur le numéro de la ligne dans ta base de données (value="id" ).

 

Puis en-dessous du tableau tu crées un bouton d'envoi (input type="submit" ) qui va permettre de lancer la requête. La requête sera lancée vers le lien précisé dans la balise de formulaire (form action="lien_du_script.php" method="post" ).

 

Ton script PHP analysera alors la variable $_POST['nom_variable'] pour déterminer quelles cases ont été cochées.
Il te suffira alors d'effectuer une requête SQL pour chaque case qui supprimera la ligne associée.

 


Je te laisse, dans un premier temps, googler "formulaire checkbox php" ou quelque chose dans le genre ainsi que les termes que j'ai utilisé pour te mettre un peu au point si tu ne captes pas. Normalement le sujet est bien renseigné, faut juste décomposer ton problème (c'est ce que j'ai tenté de faire). Mais évidemment je répondrai à tes questions si tu as besoin.

 


EDIT : oui normalement quand on crée une base de données, on assigne un numéro unique à chaque ligne (qu'on appelle généralement "id" ), numéro qu'on incrémente à chaque ajout de ligne, cela permet de manipuler plus facilement ta base de données comme tu pourras le constater avec ton problème.


Message édité par MaybeEijOrNot le 31-10-2018 à 23:52:01

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 01-11-2018 à 12:34:45    

Bonjour :)  
 
Alors j'ai essayé de faire comme vous avez dit ( sans les checkbox par contre :s ) même  si j'avoue que je n'ai pas tout compris :/ j'ai essayé de faire au mieux mais maintenant mon tableau html ne s'affiche plus, sûrement une erreur de syntaxe dans mon form avec les simples ou doubles guillemet ( à mon avis ) je m'y perd un peu et aussi peut être le echo avec le $donnees je sais pas si je doit le concaténer ou pas  
 
alors pour mon HTML/php j'ai fait comme ça  
 

Code :
  1. <?php
  2. $reponse = $bdd->query('SELECT * FROM children');
  3.  while($donnees=$reponse->fetch())
  4.  {
  5.   echo
  6.   '<tr>
  7.   <td>' . $donnees['children_lastname'] . '</td><td>' . $donnees['children_firstname'] . '</td><td>' . $donnees['children_birthday'] . '</td><td>' . $donnees['children_adress'] . '</td><td>' . $donnees['children_parents_contact'] . '</td><td>' . $donnees['children_remarks'] . '</td>
  8.     <td>
  9.    
  10.      <form method="post" action="delete1.php" class="deleteform">
  11.       <input type="hidden" name"id" value="<?php' echo '.$donnees["children_id"]." ?>
  12.       <input type="submit" name="valider" class="delete" value="supprimer"
  13.      </form>
  14.    
  15.     </td>
  16.   </tr>';
  17.  }
  18. ?>


 
Avec le formulaire method POST
 
et dans ma requete enfin mon fichier delete.php
 

Code :
  1. <?php
  2. $id_el = $_POST['children_id'];
  3. $bdd->query("delete  FROM children  where id= $id_el" ); 
  4. header('Location: index.php');
  5. exit();


 
La question que je me pose là aussi dans ce fichier je pense que je doit mettre le try avec la connexion ?
 
 
Enfin voilà je suis un peu perdu avec toutes ces infos et j'ai un peu de mal à comprendre j'avoue que je bloque pas mal malgré votre aide  
 
Encore merci d'avoir pris le temps de répondre :)

Reply

Marsh Posté le 01-11-2018 à 13:15:48    

1somniak a écrit :

Code :
  1. <?php
  2. $id_el = $_POST['children_id'];
  3. $bdd->query("delete  FROM children  where id= $id_el" ); 
  4. header('Location: index.php');
  5. exit();


Aie! Tu devrais te renseigner sur les injections SQL et sécuriser ce code. D'ailleurs la même chose est valable pour le serveur bien sûr, avec cette récente loi européenne (dont j'ai encore oublié le nom :o ) vous risquez une grosse amende si il y a une fuite!

Reply

Marsh Posté le 01-11-2018 à 13:20:58    

Après c'est dans le cade d'une formation et il ne restera que en localhost même si c'est vrai il faut prendre les bonnes pratiques le plus rapidement possible :)

Reply

Marsh Posté le 01-11-2018 à 13:32:30    

1somniak a écrit :

Après c'est dans le cade d'une formation et il ne restera que en localhost même si c'est vrai il faut prendre les bonnes pratiques le plus rapidement possible dès le début!:)

:o  

Reply

Marsh Posté le 01-11-2018 à 13:32:30   

Reply

Marsh Posté le 01-11-2018 à 13:42:18    

Pour la partie HTML/PHP il y a en effet de petites erreurs, voici le code corrigé :
 

Code :
  1. <?php
  2. $reponse = $bdd->query('SELECT * FROM children');
  3. while($donnees=$reponse->fetch())
  4. {
  5.    echo
  6.    '<tr>
  7.       <td>' . $donnees['children_lastname'] . '</td><td>' . $donnees['children_firstname'] . '</td><td>' . $donnees['children_birthday'] . '</td><td>' . $donnees['children_adress'] . '</td><td>' . $donnees['children_parents_contact'] . '</td><td>' . $donnees['children_remarks'] . '</td>
  8.       <td>
  9.          <form method="post" action="delete1.php" class="deleteform">
  10.             <input type="hidden" name"id" value="'. $donnees['children_id'] . '">
  11.             <input type="submit" name="valider" class="delete" value="supprimer">
  12.          </form>
  13.       </td>
  14.    </tr>';
  15. }
  16. ?>


 
Pour le premier input, tu veux utiliser ta variable php, alors pourquoi ne fais-tu pas comme pour les précédentes ? Car là tu avais remis des balises php qui étaient déjà présentes dans ton code et tu refais un "echo" alors que tu es déjà dans une commande "echo" donc ça n'a pas de sens*. Tu refermes ensuite ta balise php inutile et par conséquent tu oublie de fermer ton input HTML.
Le input suivant, tu oublies aussi de le refermer.
 
Pour ce qui est des injections SQL, la classe PDO implémente les requêtes préparées qui permettent facilement de se protéger de cette "faille".
 
La solution des checkbox permet de supprimer plusieurs lignes en une seule fois. Tu ajoutes une case à cocher à chaque ligne du tableau qui se trouve alors à l'intérieur d'un formulaire. Quand tu envoies le formulaire, la variable va contenir un tableau (array) avec toutes les lignes à supprimer. Côté PHP il suffit alors de parcourir le tableau pour supprimer chaque ligne.
 
 
EDIT : (*) grosso modo tu fais :

Code :
  1. <?php
  2. echo 'blablabla' .  '<?php echo' . monArray['indice'] . '; ?>';
  3. ?>


Tu imbriques dans tes balises php et ta commande echo des balises php et une commande echo. :pt1cable:


Message édité par MaybeEijOrNot le 01-11-2018 à 13:48:06

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 01-11-2018 à 13:54:26    

Sinon, autre point au niveau de tes fichiers.

 

Pour faire ce que tu veux faire, tu n'as besoin que d'un fichier php. Ce fichier doit prendre en compte deux cas :
- le premier cas, qui est celui où on charge le contenu de la bdd pour l'afficher, on y ajoute dans le HTML le contenu nécessaire pour supprimer les lignes, le formulaire doit envoyer la requête POST vers ce même fichier.
- le second cas, qui est celui où une requête est envoyée, et donc une variable $_POST est définie, à ce moment là on lit dans un premier temps le contenu de la variable pour supprimer la ou les lignes de la base de données. Ensuite on charge le contenu de la base de données pour retomber dans le premier cas.


Message édité par MaybeEijOrNot le 01-11-2018 à 13:54:46

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 03-11-2018 à 15:28:28    

Bonjour :)  
 
Désolé du temps de réponse, j'ai enfin réussi :) j'ai galéré pendant un lonnnnng moment en ayant fait le bon code mais erreur d’inattention sur mon premier input javais le premier "name" ou il manque un "=" .
 
je met mon code si jamais ça peut service à quelqu'un  
 
1er fichier  
( ou il faudra ajouter un require("nomDuDeuxiemeFichier" );
 

Code :
  1. <form method="post" class="deleteform">
  2.      <input type="hidden" name="children_id" value="'. $donnees['children_id'] . '">
  3.      <input type="submit" name="supprimer" class="delete" value="supprimer">
  4. </form>


 
 
Deuxiemes fichier ( delete.php )  
 

Code :
  1. <?php
  2. ini_set('display_errors', 1);
  3. try
  4. {
  5.  $bdd = new PDO('mysql:host=localhost;dbname=creche;charset=utf8','root', '');
  6. }
  7. catch (Exception $e){
  8.  die('Erreur : ' . $e->getMessage());
  9.    if(isset($_POST['supprimer']))
  10.         {
  11.     $id_del = $_POST['children_id'];
  12.  $bdd->query("DELETE FROM children WHERE children_id=" . $id_del); 
  13.  header('Location: index.php');
  14.          }
  15. ?>


 
En tout cas merci beaucoup MaybeEijOrNot pour votre aide et votre patience :)

Message cité 1 fois
Message édité par 1somniak le 03-11-2018 à 15:30:19
Reply

Marsh Posté le 03-11-2018 à 17:03:01    

1somniak a écrit :

mais erreur d’inattention sur mon premier input javais le premier "name" ou il manque un "=" .


 
Ah oui en effet, j'avais oublié une erreur. :s
 
Sinon, comme je te le disais, tu peux essayer de tout mettre dans un seul fichier, ce n'est pas très compliqué. ;)


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed