Delete-Befehl funktioniert nicht

  • Hallo Miteinander,

    ich muss jetzt einfach hier nachfragen.

    Ich habe im Moment eine Webseite, auf dieser sollen Modellzüge in einer Datenbank angelegt, angezeigt und gelöscht werden können.

    Das Anlegen und Anzeigen funktioniert problemlos, allerdings funktioniert das Löschen nicht.

    Kann mir jemand vielleicht erklären was ich falsch mache.

    Ich benutze XAMPP zum Testen auf einem Win10 Rechner, später soll das ganze auf einem Raspberry Pi laufen.


    Anbei der Code meiner "Löschen" Seite



    Vielen Dank im Voraus


    Lukas

  • 1. Wird der If Block ausgeführt, bzw. gibt es beide Variablen auch? Gib beide Variablen einmal aus.

    2. Wird die Query auch ausgeführt? Teste das mit der "die" Methode.

    3. Verwende bitte nur eine Schreibweise. Entweder fügst du bei der ersten If Bedingung den Code-Block hinzu oder du entfernst sie auch bei der zweiten. Das hinzufügen des Code-Blocks "{}" könnte das Problem bereits beheben, falls das einen Error ausgibt.

  • Wie so oft gilt auch hier, einfach mal mehr Eigeninitiative zeigen und sich daran halten:


    Richtig debuggen


    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

    Alles unter dem Strich ist eine Signatur!


    tut ist ein Hilfsverb, dass man nicht brauchen tut


    Die Deutsche Rechtschreibung ist Freeware, sprich, du darfst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen!


    Zitat von Dieter Nuhr: "Wenn man keine Ahnung hat, einfach mal Fresse halten". Wie recht er doch hat...

  • Hallo nochmal,

    ich habe jetzt bei der If-Anweisung den fehlenden Code Block eingefügt, ebenso habe ich die Bedingung Invertiert.

    Die erwähnte Sicherheitslücke werde ich noch beheben.

    Oder ungleich

    Code
    1. if (!$db->connect_errno)

    und sql Injection Sicherheitslücke hier


    Code
    1. $db->query("DELETE FROM Zuege WHERE Zugnummer = '$Nummer'");

    Mit dem jetzigen Code funktioniert alles wie es soll. :)



    Vielen Dank

    Lukas

  • $db->query("DELETE FROM Zuege WHERE Zugnummer = '$Nummer'");


    Die Zugnummer wird sicherlich unique sein. Ich empfehle LIMIT 1 an die Query anzuhängen.

    Und, wie schon erwähnt wurde, SQL-Injection fixen!

    SQL
    1. DELETE FROM `Zuege` WHERE `Zugnummer` = :train_id LIMIT 1;

    Warum LIMIT 1:

    Die Query funktioniert, alles i.O.

    Aber mit der Zeit wird sie erweitert, wird immer komplizierter, und evtl passiert ein Fehler - die Bedingungen betreffen auf einmal mehrere oder alle Zeilen in der db.

  • Warum LIMIT 1:

    Die Query funktioniert, alles i.O.

    Aber mit der Zeit wird sie erweitert, wird immer komplizierter, und evtl passiert ein Fehler - die Bedingungen betreffen auf einmal mehrere oder alle Zeilen in der db.

    ...wodurch die Ergebnisliste fehlerhaft sortiert sein kann und man ein falsches Ergebnis verarbeitet. Hier würde ich eher nicht Limit nehmen, da solche Fehler sonst kaum auffallen werden und man wundert sich, warum mit falschen Daten gearbeitet wird.


    Es ist nie gut, mögliche Fehler zu kaschieren!

    Wenn sie auftreten => fixen!

  • Es ist nie gut, mögliche Fehler zu kaschieren!

    Aber das ist eine DELETE query. Du willst doch nicht erst, wenn alles gelöscht ist, feststellen, dass da ein Fehler ist :)


    wodurch die Ergebnisliste fehlerhaft sortiert sein kann und man ein falsches Ergebnis verarbeitet

    Kommt evtl auf den Fall an.

    Bsp user tbl.

    Wenn Du nur einen user laden willst, der per query definition nur einmal vorkommen kann,

    dann macht ORDER BY id ASC LIMIT 1 Sinn,

    denn es kann kein nächster user selectiert werden. Es wird immer der "originale", erste user selectiert.

  • Aber das ist eine DELETE query. Du willst doch nicht erst, wenn alles gelöscht ist, feststellen, dass da ein Fehler ist

    DELETE habe ich übersehen, dann wäre es natürlich besser, wenn man den Fehler vorher schon erkennt.

    Aber bei einem DELETE macht LIMIT erst recht keinen Sinn. Wenn das die Lösung ist, stimmt das Datenbankdesign nicht.


    Wenn Du nur einen user laden willst, der per query definition nur einmal vorkommen kann,

    dann macht ORDER BY id ASC LIMIT 1 Sinn

    Dann macht LIMIT überhaupt gar keinen Sinn. Warum will man den ersten Datensatz einer Datenmenge aus genau einem Datensatz noch extra limitieren?!

    Du gehst doch auch nicht auf den Wochenmarkt und sagst zu dem Obsthändler, der nur noch einen Apfel in der Auswahl hat: "Von diesem einen Apfel möchte ich bitte nur den ersten". Welcher Sinn sollte dahinter stecken.

    LIMIT macht dann Sinn, wenn man bspw. Pagination einsetzen möchte, vielleicht gibt es noch ein zwei Anwendungsfälle mehr, die mir grad nicht einfallen würden, aber in allen anderen Situationen, wie auch hier ist das nur kaschieren von Fehlern.

  • Arne Drews

    Du hast schon recht. Das db Design und|oder die Query sollte das schon klären.

    Aber es kann vorkommen, das mal was geändert wird, und es bei Design nicht mehr geregelt wird.

    ZB "ausversehen" den unique index ge-dropped, statt eines anderen.

    Man kann also mit solchen einfachen Beschränkungen Fehler vorbeugen.


    Auf dem live server schreib ich zB auch keine DELETE oder UPDATE query ohne LIMIT, wenn ich nur eine Zeile ändern will.

    Einmal nicht aufgepasst, irgendwas in der Bedingung vergessen, und 100000 rows sind weg. :D


    Warum nicht nutzen, was da ist? :)

  • Warum nicht nutzen, was da ist?

    Eben... Ein DELETE FROM `Zuege` WHERE `Zugnummer` = :train_id kann keine 1000000 Datensätze löschen, es sei denn, Du hast überall die gleiche Train_id, was nicht passieren kann, wenn das UNIQUE ist.


    Wenn der Entwickler selber die falsche Query schreibt und die WHERE-Klausel bspw. vergisst, ist das Lehrgeld, sowas sollte nicht mit Live-Daten getestet werden.

    Wenn die Datenbank sauber aufgebaut ist und die Queries entsprechend getestet wurden, kann so etwas, wie hier beschrieben nicht passieren.


    Geht man dennoch davon aus, dass sowas passieren kann, liegt aus meiner Sicht ein Verständnisproblem der Materie vor.

    Sicher kann man bei vielen Dingen auf Nummer sicher gehen, aber manches ist halt unnötig, wenn die Basis vernünftig aufgebaut wurde, jedes LIMIT kostet.


    Eine Datenbank - soweit vorhanden - ist das fundamentalste und Zeit intensivste Element in einer Anwendung.

    Wenn diese erstmal steht, darf so etwas nicht passieren.


    Natürlich fragen die Leute hier - und vermutlich der TE auch -, weil Sie da nicht die Profis sind ( ich auch nicht! ).

    Aber ich finde es viel wichtiger, die Grundprobleme aufzuzeigen, als einen Workaround anzubieten, der im Grunde nicht nötig wäre, wenn man sich damit befasst. Ich setze da einfach voraus, dass die Leute etwas lernen wollen. Wenn nicht, können sie die Hinweise ignorieren.


    Ich will aber keinen davon anhalten, LIMIT zu verwenden! Ich möchte nur sensibilisieren, dass es sinnvollere Ansätze gibt.

    ;)