Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] es wird falsche Zeile gelöscht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] es wird falsche Zeile gelöscht

    Hallo,

    ich muss schon wieder um Hilfe bitte.

    Bis jetzt habe ich ein Eingabeformular erstellt, das Daten in meine Übungsdatendank schreibt. Ich kann die Daten in einer Tabelle ausgeben lassen.

    Jetzt habe ich einen Löschen-Button für jeden Datensatz erstellt, der den jeweils markierten Eintrag löschen soll. Irgendwie kommt früher oder später wohl jeder darauf, sowas zu machen , denn ich habe bei meiner Fehlersuche schon einiges darüber gelesen - auch hier. Meine Frage konnte ich mir leider trotzdem nicht selbst beantworten.

    Das Problem ist einfach, dass immer der letzte Datensatz (die letzte Zeile) gelöscht wird, obwohl ich einen ganz anderen Datensatz zum Löschen auswähle.

    Ich habe versucht, das ganze mit einer if-Abfrage zu erledigen, vermute aber, dass ich GET falsch eingesetzt habe. Nur sehe ich meinen Fehler nicht.

    Die ID wird von mySQL automatisch erstellt (auto_increment) und eingefügt. Ich lasse sie in meiner Tabelle zur Ansicht auch ausgeben.

    Hier mal der Quelltext von meiner Löschen-Seite:

    PHP-Code:
    <?php

    if(isset($_GET['delete'])){

    $Verbindung mysql_connect('xxx''xxx''xxx');
    mysql_select_db('xxx'$Verbindung)
    or die(
    'Die Datenbank ist nicht vorhanden.'); 

    mysql_query("DELETE FROM minidata WHERE id='".$_GET['id']."'") OR die(mysql_error());
    echo 
    "<strong>Zutat erfolgreich gelöscht</strong>";
    }

    else {
    echo 
    'nix gel&ouml;scht';
    }


    $sql "SELECT `id`, `Zutat`, `kcal`, `Fett`, `KH`, `Prot` FROM `minidata`";

    $Verbindung mysql_connect('xxx''xxx''xxx');
    mysql_select_db('xxx'$Verbindung);
    $abfrageergebnis mysql_query$sql$Verbindung );

    echo 
    '<table border="1">';
    echo 
    "<tr><th>id</th><th>Zutat</th><th>kcal</th><th>Fett</th><th>KH</th><th>Prot</th></tr>";


    while (
    $datensatz mysql_fetch_array$abfrageergebnis )){

    echo 
    '<form  method="get">';
    echo 
    "<tr>";
    echo 
    "<td>" .$datensatz['id']. "</td>";
    echo 
    "<td>" .$datensatz['Zutat']. "</td>";
    echo 
    "<td>" .$datensatz['kcal']. "</td>";
    echo 
    "<td>" .$datensatz['Fett']. "</td>";
    echo 
    "<td>" .$datensatz['KH']. "</td>";
    echo 
    "<td>" .$datensatz['Prot']. "</td>";
    echo 
    '<td><input type="hidden" name="id" value="'.$datensatz['id'].'" /></td>',
    '<td><input type="submit" name="delete" value="Entfernen" /></td>';
    echo 
    "</tr>";

    }

    echo 
    "</table>";
    echo 
    "</form>";

    ?>
    Ein Denkanstoß bei der Fehlersuche würde mir wirklich sehr weiterhelfen.

    Vielen Dank!
    [SIZE="1"][FONT="Arial"]Mit kleinen Schritten vorwärts. :) [/FONT][/SIZE]

  • #2
    Das Problem ist, dass du das Formular erst außerhalb der Schleife beendest. Außerdem verschachtelst du auch noch falsch.
    Code:
    <table>
      <form>
    ist falsch.
    Code:
    <form>
      <table>
    ist korrekt, wobei in meinen Augen ein Formular auch keine Tabelle ist, folglich auch nicht als solche ausgezeichnet werden sollte. Anbieten würde sich zum Beispiel eine geordnete Liste.

    IMHO würde sich für diese Aufgabe auch ein Link weitaus besser eignen.
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Zitat von Asipak Beitrag anzeigen
      IMHO würde sich für diese Aufgabe auch ein Link weitaus besser eignen.
      IMHO sollte so etwas wie löschen weder mit einem Link noch mit einem GET Formular geschehen, da es keine Daten abfragt sondern verändert
      . POST ist da das Mittel der Wahl.
      [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
      [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

      Kommentar


      • #4
        Da hast du sicher Recht.

        Nach meinem Geschmack ist ein Formular an dieser Stelle aber doch immer etwas übertrieben, da ich wirklich nur die ID und sonst keine Daten übertrage. Sicher kann ich den Löschvorgang aber auch mit einer Datenabfrage verbinden, indem ich nachfrage, ob der Datensatz noch existiert und mir eine Meldung ausgeben lasse. Also in Form einer Statusabfrage.

        Sensible Vorgänge wie der Löschvorgang sollten sowieso vor unbefugten Zugriffen geschützt werden. Die einfache Manipulation durch das Anhängen einer ID und Aufrufen der Seite zum Löschen eines Datensatzes sollte zum Beispiel durch einen Login verhindert werden.

        Daher sehe ich da eigentlich kein Problem beim Einsatz von GET.

        Gruß
        [URL]http://hallophp.de[/URL]

        Kommentar


        • #5
          Egal was gewählt wird - vor das Löschen gehört immer eine Sicherheitsabfrage
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            EDIT

            also da alle deine Hidden-ID Felder gleich heißen, wird "er" darüber immer das letzte übermitteln ...

            du musst also am besten mit dem Button die richtige ID übergeben

            PHP-Code:
            echo '<td><input type="hidden" name="id" value="'.$datensatz['id'].'" /></td>',
            '<td><input type="submit" name="delete_'.$datensatz['id'].'" value="Entfernen" /></td>'
            beim verarbeiten schaust du dir die $_POST daten an ...
            PHP-Code:
                FOREACH ($_POST as $key=>$element) {
                   if (
            substr($key),0,7)=="delete_") {
                      
            $idnumber=(intval(substr($key,7));
                      ... 
            // weiterverarbeiten
                      
            break;
                  else
                     continue;
                } 
            und wenn dein Formular per GET übermittelt, dann eben überall im unteren Code-Abschnitt $_POST durch $_GET ersetzen
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

            Kommentar


            • #7
              Nein, das Problem ist nach wie vor, dass das Formular erst nach der Schleife geschlossen wird. Somit stehen alle hidden-Felder in einem Formular und ausgewertet wird entsprechend nur das Letzte.
              [URL]http://hallophp.de[/URL]

              Kommentar


              • #8
                Beides richtig, die Frage ist ob ein einziges Formular gewünscht ist oder viele einzelne.
                [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                Kommentar


                • #9
                  hm - meinem Code-Abschnitten ist das relativ egal - da der Button selbst die korrekte ID mitteilt
                  "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                  Kommentar


                  • #10
                    Der Button ja, da du aber nicht den Button abfragst, sondern $_GET['id'], bleibt das Problem bestehen.
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Hallo,

                      damit kann ich wirklich etwas anfangen. Ich hatte ja auch schon fast die Vermutung, dass ich immer denselben Button für alle Datenzeilen fabriziert habe.

                      Ich probiere das heute noch unter Beherzigung eurer Hinweise in Ruhe aus. Jetzt weiss ich, worauf ich erstmal achten muss. Das hilft mir schonmal sehr weiter.
                      [SIZE="1"][FONT="Arial"]Mit kleinen Schritten vorwärts. :) [/FONT][/SIZE]

                      Kommentar


                      • #12
                        Asipak hatte Recht. Genau daran lags.

                        Danke!
                        [SIZE="1"][FONT="Arial"]Mit kleinen Schritten vorwärts. :) [/FONT][/SIZE]

                        Kommentar

                        Lädt...
                        X