PHP MySQL Delete function in while loop

Soir,

Je suis un peu coincé ici. J'ai fait une connexion pour que nos employés créent facilement une nouvelle facture (c'est danois cependant, désolé) et presque tout est terminé. Mais une chose que je ne peux pas comprendre comment faire, c'est de supprimer un matériau (matériel en danois) d'une boucle while. J'ai un formulaire avec une boucle while, qui affiche tous les matériaux, et à côté des champs de saisie matérielle, j'ai créé un petit lien href, qui devrait supprimer le champ avec une aide de javascript. Il supprime le champ parfaitement, mais ne supprime pas les données de notre base de données mysql. Donc chaque fois que je rafraîchis la page, les données sont de retour. La mise à jour et l'insertion ne sont pas un problème. Le code ressemble à ceci:

$ct_update = 0; foreach ($_POST['beskrivelse_update'] as $k => $value) { $beskrivelse_update = addslashes($value); $enhed_update = addslashes($_POST['enhed_update'][$ct_update]); $stk_update = addslashes($_POST['stk_update'][$ct_update]); $vejl_eks_moms_update = addslashes($_POST['vejl_eks_moms_update'][$ct_update]); $update_id = (int)$_POST['update_id'][$ct_update]; $db->query("UPDATE faktura_materialer SET beskrivelse = '$beskrivelse_update', enhed = '$enhed_update', stk = '$stk_update', vejl_eks_moms = '$vejl_eks_moms_update', subtotal = '$stk_update' * '$vejl_eks_moms_update' WHERE id = '$update_id' LIMIT 1"); $ct_update++; } $ct_ny = 0; if(isset($_POST['beskrivelse_ny'])){ foreach ($_POST['beskrivelse_ny'] as $k => $value) { $beskrivelse_ny = addslashes($value); $enhed_ny = addslashes($_POST['enhed_ny'][$ct_ny]); $stk_ny = addslashes($_POST['stk_ny'][$ct_ny]); $vejl_eks_moms_ny = addslashes($_POST['vejl_eks_moms_ny'][$ct_ny]); $db->query("INSERT INTO faktura_materialer (faktura_id, beskrivelse, enhed, stk, vejl_eks_moms, subtotal) VALUES ('".$_faktura->faktura_id."', '".$beskrivelse_ny."', '".$enhed_ny."', '".$stk_ny."', '".$vejl_eks_moms_ny."', '".$stk_ny."' * '".$vejl_eks_moms_ny."')"); $ct_ny++; } } 

J'espère que vous comprenez ce que je veux faire, sinon, faites un commentaire. Avoir une bonne soirée peeps 🙂

Modifier:

Je souhaite que la requête de suppression soit soumise lorsque l'utilisateur clique sur le bouton "Enregistrer les modifications". C'est mon code javascript:

 <script type="text/javascript"> function myFunction() { var table = document.getElementById("produkter_rows"); var row = table.insertRow(-1); var cell1 = row.insertCell(0); var cell2 = row.insertCell(1); var cell3 = row.insertCell(2); var cell4 = row.insertCell(3); var cell5 = row.insertCell(4); cell1.innerHTML = '<td><input style="width:450px;" class="text-input" type="text" name="beskrivelse_ny[]" value=""></td>'; cell2.innerHTML = '<td><input style="width:60px;" class="text-input" type="text" name="enhed_ny[]" value=""></td>'; cell3.innerHTML = '<td><input style="width:30px;" class="text-input" type="text" name="stk_ny[]" value=""></td>'; cell4.innerHTML = '<td><input style="width:205px;" class="text-input" type="text" name="vejl_eks_moms_ny[]" value=""></td>'; cell5.innerHTML = '<td><a href="#" onclick="removeRow(this)" id="addNew" title="Slet produkt"><img src="images/icons/slet.gif" width="16" alt="Slet" /></a></td>'; } removeRow = function(el) { $(el).parents("tr").remove() } </script> 

Lorsque l'utilisateur clique sur l'icône de suppression juste à côté du matériel, il sera supprimé. Et il supprime les champs de saisie, mais pas de la base de données dans mysql.

Deuxième édition:

Ceci est HTML et PHP pour la mise à jour des données actuelles dans la base de données MySQL:

 $materialer_query = $db->query("SELECT faktura_materialer.id as materialer_id, faktura.*, faktura_materialer.* FROM faktura, faktura_materialer WHERE faktura_materialer.faktura_id = faktura.id"); while($mat = $materialer_query->fetch_object()){ ?> <tr> <input type="hidden" name="update_id[]" value="<? print $mat->id; ?>" /> <td><input style="width:450px;" class="text-input" type="text" name="beskrivelse_update[]" value="<? print $mat->beskrivelse; ?>"></td> <td><input style="width:60px;" class="text-input" type="text" name="enhed_update[]" value="<? print $mat->enhed; ?>"></td> <td><input style="width:30px;" class="text-input" type="text" name="stk_update[]" value="<? print $mat->stk; ?>"></td> <td><input style="width:205px;" class="text-input" type="text" name="vejl_eks_moms_update[]" value="<? print $mat->vejl_eks_moms; ?>"></td> <td></td> <td><a href="#" onclick="removeRow(this)" id="addNew" title="Slet produkt"><img src="images/icons/slet.gif" width="16" alt="Slet" /></a></td> </tr> <? } 

Le name="update_id[]" champ de saisie caché name="update_id[]" est ajouté au formulaire lorsque je suis en name="update_id[]" mettre à jour. J'espère que ça aide…

Vous devez informer le script PHP que vous souhaitez supprimer l'enregistrement. Une solution serait d'utiliser une entrée cachée qui est définie lorsque vous appelez removeRow, par exemple

 function removeRow(el) { // get the table row var row = $(el).parents('tr:first'); // disable the input fields for the row $('input', row).attr('disabled', 'disabled'); // rename update_id to delete_id and re-enable the field $('input[name="update_id[]"]', row).attr('name', 'delete_id[]').removeAttr('disabled'); // hide the row row.hide(); } 

Cette méthode ne supprime plus la ligne de table du DOM. Cependant, il désactivera les champs de saisie contenus dans la ligne et ajoutera une entrée cachée avec le nom beskrivelse_delete .

Lorsque le formulaire est soumis, votre PHP aura maintenant la possibilité de savoir quels enregistrements doivent être supprimés.

 foreach ($_POST['delete_id'] as $deleteId) { $deleteId = (int)$deleteId; $db->query("DELETE FROM faktura_materialer WHERE id = $deleteId"); } 

Mise à jour: J'ai créé un fichier phpfiddle qui a quelques améliorations dont vous voudrez peut-être apprendre. Ces points incluent:

  • Prise en charge de la suppression où JavaScript n'est pas activé
  • Utilisation des instructions préparées (préféré à add_slashes )
  • Échapper la sortie en utilisant htmlspecialchars
  • Définition explicite des identifiants de saisie pour éviter de deviner en fonction d'un compteur incrémental