Dynamisches löschen von Tabellen records

Braman

Mitglied
Unbedingt, zu der while-Schleife, die die Tabellenzeilen erzeugt, gehört natürlich die Select-Query, ich hätte sie besser mit gepostet.
ach eigtl. ist das ja selbstverständlich, hatte nur gedacht vlt ist es in diesem fall anders ^^


Was die foreign keys betrifft, musste ich selber nachlesen:
Exact Meaning of MySQL's Foreign Key 'on delete restrict' Clause

Demnach musst Du die Zeilen, die die Referenzen enthalten, als erstes löschen, und dann die Zeile, auf die die Verweise gezeigt haben.
stimmt, habe das nochmal verglichen aber ich glaube zufälligerweise ist das grade der fall oder irre ich mich? zuerst löschen wir die bestell tabelle, welche die beiden foreign keys "warennr" und "kundeprojekt_id" beinhaltet. Anschließend löschen wir die Zeile in der Tabelle mit der warennr und daraufhin die Zeile der Tabelle mit der kundeprojekt_id:

PHP:
$bestellnr = $_POST['bestellnr'];
$delete=mysqli_query($connection,"DELETE FROM bestellung WHERE bestellnr='$bestellnr'");
$result3 = mysqli_query($delete) or die(mysqli_error());

$warennr = $_POST['warennr'];
$delete=mysqli_query($connection,"DELETE FROM ware WHERE warennr='$warennr'");
$result2 = mysqli_query($delete) or die(mysqli_error());

$kundeprojekt_id = $_POST['kundeprojekt_id'];
$delete=mysqli_query($connection,"DELETE FROM kunde_projekt WHERE kundeprojekt_id='$kundeprojekt_id'");
$result = mysqli_query($delete) or die(mysqli_error());

Ich habe mal die foreign keys auf "delete on CASCADE" gesetzt, hierbei werden mir zwei zeilen gelöscht, jedoch bleibt eine Übrig. Ist die delete query der warennr ganz oben, wird diese Zeile und der der bestellnr gelöscht.
Ist die delete query der Kundeprojekt_id hingegen ganz oben, wird diese gelöscht und die der bestellnr (und die zeile der warennr bleibt in diesem fall übrig). Aber sobald die delete query der bestellnr ganz oben steht wird nur noch diese gelöscht.
Hoffe das war verständlich ^^
 

Sempervivum

Erfahrenes Mitglied
zuerst löschen wir die bestell tabelle, welche die beiden foreign keys "warennr" und "kundeprojekt_id" beinhaltet. Anschließend löschen wir die Zeile in der Tabelle mit der warennr und daraufhin die Zeile der Tabelle mit der kundeprojekt_id
Soweit plausibel. Gibt es vielleicht noch mehr Verweise mit foreign keys, vielleicht in der anderen Richtung?
 

Braman

Mitglied
Ich liste das mal einfach auf ^^:

Tabelle bestellung: Bestellnr(primary key), warennr und kundeprojekt_id(foreign key)
Tabelle ware: warennr(primary key), lieferantID und gruppenid(foreign keys)
Tabelle kunde_projekt: kundeprojekt_id(primary key), kstnr und investPSPID(foreign Keys)

Tabelle investpsp: InvestPSPID (primary key), kstnrr (foreign key)
Tabelle Kostenstelle: kstnr (primary key)
Tabelle lieferant: lieferantID (primary key)
Tabelle warengruppe: gruppenid(primary key)

Das sind jetzt die gesamten Schlüssel meiner DB und alles ist auf DELETE ON RESTRICT gestellt :)

Vollständigkeitshalber schmeiß ich hier einfach mal alles rein, vlt. liegt hier ja noch ein Fehler versteckt^^

liste.php

PHP:
<td>  <button class="btn-deletee" type="button" id="<?php echo $row['bestellnr']; ?>" data-id2="<?php echo $row['warennr']; ?>" data-id3="<?php echo $row['kundeprojekt_id']; ?>" ></a></button></td>

Javascript:
<script type="text/javascript" >
        $(function() {
          $(".btn-deletee").click(function() {
                var del_id = $(this).attr("id");
                var del_id2 = $(this).data("id2");
                var del_id3 = $(this).data("id3");
                var info = {bestellnr: del_id,warennr: del_id2, kundeprojekt_id: del_id3};
                if (confirm("Are you sure?")) {
                    $.ajax({
                        type : "POST",
                        url : "delete.php", //URL to the delete php script
                        data : info,
                        success : function() {
                            setInterval('location.reload()', 1000);
                        }
                    });
                    $(this).parents(".record").animate("fast").animate({
                        opacity : "hide"
                    }, "slow");
                }
                return false;
            });
        });
</script>

delete.php

PHP:
$bestellnr = $_POST['bestellnr'];
$delete=mysqli_query($connection,"DELETE FROM bestellung WHERE bestellnr='$bestellnr'");
$result3 = mysqli_query($delete) or die(mysqli_error());
$warennr = $_POST['warennr'];
$delete=mysqli_query($connection,"DELETE FROM ware WHERE warennr='$warennr'");
$result2 = mysqli_query($delete) or die(mysqli_error());
$kundeprojekt_id = $_POST['kundeprojekt_id'];
$delete=mysqli_query($connection,"DELETE FROM kunde_projekt WHERE kundeprojekt_id='$kundeprojekt_id'");
$result = mysqli_query($delete) or die(mysqli_error());
 

Sempervivum

Erfahrenes Mitglied
Der Gedanke kam mir auch schon, dass es vielleicht nicht an den foreign keys liegt sondern noch ein Fehler im PHP oder JS ist. Wegen JS schau mal in die Console und wegen PHP schalte die Fehleranzeigen ein.
 

Sempervivum

Erfahrenes Mitglied
PS: Mir fällt noch auf, dass die Werte in den where-Klauseln in Hochkommas stehen. Das ist richtig, wenn es sich um Strings handelt. Häufig sind IDs jedoch numerisch?
 

m.scatello

Erfahrenes Mitglied
Das PHP-Script ist doch Schrott:
PHP:
$delete=mysqli_query($connection,"DELETE FROM bestellung WHERE bestellnr='$bestellnr'");
$result3 = mysqli_query($delete) or die(mysqli_error());
Da wird ein Delete auf die Datenbank geschickt und mit dem Result davon wird mysqli_query aufgerufen.
 

Braman

Mitglied
Tatsache, es lag wirklich am Result ^^ danke dir @m.scatello

Das neue auslesen der Tabelle funktioniert bei mir, jedoch wird die bei mir doppelt und dreifach wieder zurückgegeben: 1614939815799.png

statt so:
1614939858827.png

ich hab jetzt daran rumgeschraubt, doch finde nicht den entscheidenen Fehler @Sempervivum

Hier mal mein gesamtes delete.php:


PHP:
$result=mysqli_query($connection,"SELECT besteller,DATE_FORMAT(datum, '%d.%m.%Y') AS datum, gesamtwert,po_nr,ebest_ekw,
we_gebucht,geliefert,smarttrack,bestellnr, name, preis,menge, assetnr,
ticketnr, Anlagennr, ware.lieferantID,lieferantname, kostenstelle, kunde_projekt.kstnr, ware.warennr, kunde_projekt.kundeprojekt_id,
kundenname_projekt, standort, info_uebergabe, kunde_projekt.InvestPSPID, PSP_Element, lieferant.lieferantID, warengruppe, ware.gruppenid
From bestellung
RIGHT outer Join ware
ON bestellung.warennr = ware.warennr
JOIN warengruppe
ON ware.gruppenid = warengruppe.gruppenid
Right outer Join lieferant
ON ware.lieferantID = lieferant.lieferantID
RIGHT OUTER JOIN kunde_projekt
ON bestellung.kundeprojekt_id = kunde_projekt.kundeprojekt_id
LEFT OUTER JOIN kostenstelle
ON kunde_projekt.kstnr = kostenstelle.kstnr
LEFT OUTER JOIN investpsp
ON kunde_projekt.InvestPSPID = investpsp.InvestPSPID
ORDER BY bestellung.datum DESC;");
    if(mysqli_num_rows($result)!=0){
        ?>
        
        <div class="tabelle">
        
          <table id="customers">
          <tbody>
          <thead>
          <tr>
      <th>warennr</th>
      <th>kundeprojekt_id</th>
      <th>BestellNr.</th>
      <th>Besteller</th>
      <th>Datum</th>
      <th>Gesamtwert</th>
      <th>PO-Nr.</th>
      <th>eBest ekw</th>
      <th>WE Gebucht</th>
      <th>PSP Element</th>
      <th>Geliefert</th>
      <th>Smarttrack</th>
      <th>Ware</th>
      <th>Preis</th>
      <th>Menge</th>
      <th>AssetNr.</th>
      <th>Ticket Nr.</th>
      <th>Anlagennr</th>
      <th>Lieferantenname</th>
      <th>Kostenstelle</th>
      <th>Kundenname/Projekt</th>
      <th>Standort</th>
      <th>Info/Übergabe</th>
      <th>Warengruppe</th>
      <th>Bearbeiten</th>
      <th>Löschen</th>
          </tr>
          </thead>
          <tbody>
        </div>

<?php
    while($row=mysqli_fetch_array($result)){

 ?>
        <tr>
      <td> <?php            echo         $row['warennr'];                    ?>    </td>
      <td> <?php            echo         $row['kundeprojekt_id'];          ?>    </td>
      <td> <?php            echo         $row['bestellnr'];                ?>    </td>
      <td> <?php            echo         $row['besteller'];                ?>    </td>
      <td> <?php            echo         $row['datum'];                    ?>    </td>
      <td> <?php            echo         $row['gesamtwert'];               ?>    </td>
      <td> <?php            echo         $row['po_nr'];                    ?>    </td>
      <td> <?php            echo         $row['ebest_ekw'];                ?>    </td>
      <td>
                <form id='form' class="form" method="post" action="liste.php">
      <input type="checkbox" onClick="this.form.submit();" name="wegeb" id="we_gebucht" value="<?php echo $row['bestellnr'] ?>">
                </form>
           <?php            echo         $row['we_gebucht'];               ?>    </td>
      <td> <?php            echo         $row['PSP_Element'];              ?>    </td>
      <td>
                  <form id='form1' class="form1" method="post" action="liste.php">
      <input type="checkbox" onClick="this.form.submit();" name="liefert" id="liefert" value="<?php echo $row['bestellnr'] ?>">
                </form>                                                                                       
              <?php            echo         $row['geliefert'];                ?>    </td>
      <td> <?php            echo         $row['smarttrack'];               ?>    </td>
      <td> <?php            echo         $row['name'];                     ?>    </td>
      <td> <?php            echo         $row['preis'];                    ?>    </td>
      <td> <?php            echo         $row['menge'];                    ?>    </td>
      <td> <?php            echo         $row['assetnr'];                  ?>    </td>
      <td> <?php            echo         $row['ticketnr'];                 ?>    </td>
      <td> <?php            echo         $row['Anlagennr'];                ?>    </td>
      <td> <?php            echo         $row['lieferantname'];            ?>    </td>
      <td> <?php            echo         $row['kostenstelle'];             ?>    </td>
      <td> <?php            echo         $row['kundenname_projekt'];       ?>    </td>
      <td> <?php            echo         $row['standort'];                 ?>    </td>
      <td> <?php            echo         $row['info_uebergabe'];           ?>    </td>
      <td> <?php            echo         $row['warengruppe'];              ?>    </td>
      <td> <button class="btn-update"> <a href="updateliste.php? bestellnr=<?php print $row['bestellnr']; ?>&besteller=<?php print $row['besteller']; ?>&datum=<?php print $row['datum']; ?>&gesamtwert=<?php print $row['gesamtwert']; ?>&gruppenid=<?php print $row['gruppenid']; ?>&warengruppe=<?php print $row['warengruppe']; ?>&po_nr=<?php print $row['po_nr']; ?>&ebest_ekw=<?php print $row['ebest_ekw']; ?>&we_gebucht=<?php print $row['we_gebucht']; ?>&geliefert=<?php print $row['geliefert']; ?>&smarttrack=<?php print $row['smarttrack']; ?>&name=<?php print $row['name']; ?>&preis=<?php print $row['preis']; ?>&menge=<?php print $row['menge']; ?>&assetnr=<?php print $row['assetnr']; ?>&ticketnr=<?php print $row['ticketnr']; ?>&Anlagennr=<?php print $row['Anlagennr']; ?>&lieferantname=<?php print $row['lieferantname']; ?>&kundenname_projekt=<?php print $row['kundenname_projekt']; ?>&standort=<?php print $row['standort']; ?>&info_uebergabe=<?php print $row['info_uebergabe']; ?>&warennr=<?php print $row['warennr']; ?>&warennr=<?php print $row['warennr']; ?>&kundeprojekt_id=<?php print $row['kundeprojekt_id']; ?>&kstnr=<?php print $row['kstnr']; ?>&kostenstelle=<?php print $row['kostenstelle']; ?>&lieferantID=<?php print $row['lieferantID']; ?>&InvestPSPID=<?php print $row['InvestPSPID']; ?>" class="btn-update">✎</a> </button> </td>
      
      <td>  <button class="btn-deletee" type="button" id="<?php echo $row['bestellnr']; ?>" data-id2="<?php echo $row['warennr']; ?>" data-id3="<?php echo $row['kundeprojekt_id']; ?>" ></a></button></td> 
    </tr>

<?php

}
    }
?>


Javascript:
<script type="text/javascript" >
        $(function() {
          $(".btn-deletee").click(function() {
                var del_id = $(this).attr("id");
                var del_id2 = $(this).data("id2");
                var del_id3 = $(this).data("id3");
                var info = {bestellnr: del_id, warennr: del_id2, kundeprojekt_id: del_id3};
                if (confirm("Are you sure?")) {
                    $.ajax({
                        type : "POST",
                        url : "delete.php", //URL to the delete php script
                        data : info,
                        success : function(data) {
                          $('#customers tbody').html(data);
                        }
                    });
                    $(this).parents(".record").animate("fast").animate({
                        opacity : "hide"
                    }, "slow");
                }
                return false;
            });
        });
 </script>

Und danke nochmal dir für deine ganze Hilfe und Zeit ^^
 

Sempervivum

Erfahrenes Mitglied
Mit diesem:
Code:
                        success : function(data) {
                          $('#customers tbody').html(data);
                        }
tragen wir die Ausgabe des PHP-Skriptes in den body der Tabelle ein, die schon vorhanden ist. Du gibst mit dem PHP jedoch eine komplette neue Tabelle aus. Reduziere das auf die Tabellenzeilen mit <tr>...</tr>
 

Braman

Mitglied
So, habe jetzt viele möglichkeiten ausprobiert, doch es will mir nicht funktionieren :(
Ich habe es jetzt auch mit:
Javascript:
success: function(data) {
$('customers tbody').html(data);
}
probiert, und damit klappt die ausgabe auch, jedoch rutscht die Tabelle danach knapp 150px nach unten und ich kann keine weiteren Zeilen löschen..
könntest du noch einmal zum verständniss sagen was du mit
Reduziere das auf die Tabellenzeilen mit <tr>...</tr>
genau meinst, ich habe jetzt an meinem code viele umgestellt etc. aber anscheinend schraub ich an den flaschen stellen(?)
und danke nochmal für die ganze hilfe ^^
 

Sempervivum

Erfahrenes Mitglied
könntest du noch einmal zum verständniss sagen was du mit
Sempervivum hat gesagt.:
Reduziere das auf die Tabellenzeilen mit <tr>...</tr>
genau meinst
Dein letztes PHP sieht so aus:
Code:
    if(mysqli_num_rows($result)!=0){
        ?>
      
        <div class="tabelle">
      
          <table id="customers">
          <tbody>
          <thead>
          <tr>
      <th>warennr</th>
      <th>kundeprojekt_id</th>
      <th>BestellNr.</th>
      <th>Besteller</th>
      <th>Datum</th>
      <th>Gesamtwert</th>
      <th>PO-Nr.</th>
      <th>eBest ekw</th>
      <th>WE Gebucht</th>
      <th>PSP Element</th>
      <th>Geliefert</th>
      <th>Smarttrack</th>
      <th>Ware</th>
      <th>Preis</th>
      <th>Menge</th>
      <th>AssetNr.</th>
      <th>Ticket Nr.</th>
      <th>Anlagennr</th>
      <th>Lieferantenname</th>
      <th>Kostenstelle</th>
      <th>Kundenname/Projekt</th>
      <th>Standort</th>
      <th>Info/Übergabe</th>
      <th>Warengruppe</th>
      <th>Bearbeiten</th>
      <th>Löschen</th>
          </tr>
          </thead>
          <tbody>
        </div>

<?php
    while($row=mysqli_fetch_array($result)){

?>
        <tr>
      <td> <?php            echo         $row['warennr'];                    ?>    </td>
// usw.
Du musst daraus den Header der Tabelle löschen, weil er sonst doppelt vorhanden ist. Außerdem ist das div dort fehl am Platze. Dann würde dies übrig bleiben:
Code:
    if(mysqli_num_rows($result)!=0){
        ?>

<?php
    while($row=mysqli_fetch_array($result)){

?>
        <tr>
      <td> <?php            echo         $row['warennr'];                    ?>    </td>
    
      usw. wie bisher
ich kann keine weiteren Zeilen löschen..
Das liegt daran, dass die Eventlistener beim Überschreiben des HTML verloren gehen. Du kannst das vermeiden, indem Du beim Registrieren auf das Eventbubbling setzt:
Code:
            $(document).on('click', '.delete-btn', function() {
                var del_id = $(this).attr("id");
                var del_id2 = $(this).data("id2");
                var del_id3 = $(this).data("id3");
                var info = {lieferantID: del_id, del_id2: del_id2, del_id3: del_id3};
Erklärt wird das hier:
Understanding Event Delegation | jQuery Learning Center
 

Neue Beiträge