MySQL - DELETE in einer verschachtelten WHILE-Schleife funktioniert bei mir nicht

  • Hallo liebes Forum,

    Ich habe zwei Tabellen mit den Feldinhalten: "tisch". Die erste Tabelle liefert die Information welche Datensätze (Datum, Uhrzeit ... und den Inhalt: tisch) in der zweiten Tabelle bearbeitet werden sollen. Für jeden Datensatz mit Übereinstimmung im Feld: tisch, soll in der zweiten Tabelle der Datensatz gelöscht werden.
    Meine Vermutung ist, dass während der Bearbeitung in einer While-Schleife nicht unmittelbar gelöscht werden kann. Vielleicht ist der Datensatz gesperrt und erst nach dem Durchlauf der Schleife wieder frei?
    Noch eine Information. Das von mir eingebaute ERROR-Handling führt zu einer Warn-Fehlermeldung, die ohne ERROR-Handling nicht erscheint. Der Fehler-Code hinter dem Error-Text ist leer.

    Warning: mysqli::query() expects parameter 1 to be string, object given in C:\xampp\htdocs\restaurant\reservierungen_laufkundschaft\verwalten\zwireservierungen_einzeln_loeschen.php on line 75
    Fehler bei Löschen

    Hier mein Programm-Code:

    Wie man unterhalb des DELETE Befehls sieht, habe ich zwei andere Varianten des DELETE versucht, auch ohne Erfolg.
    Ich bin mir gar nicht sicher, ob dieser Lösungsansatz der richtige Weg ist, vielleicht verkompliziere ich ja das Problem? Für eine Anregung bin ich dankbar.

    Danke für Eure freundliche Unterstützung.

    2 Mal editiert, zuletzt von hpuettma (23. Juli 2017 um 15:55)

  • $sql8 = mysqli_query($con, "select * from zwischenspeicher");

    if ($con->query($sql8) === TRUE)

    Da fällt dir wirklich nichts auf? :shock:

  • Hallo Bandit,

    ich habe den Fehler gefunden, es fehlte wohl im if-Befehl der Bezug zur Datenbank $con. Das kommt davon, wenn man an der falschen Stelle etwas kopiert, ohne genau zu wissen, was man tut. :shock:
    Aber leider ist der Befehl genau so fehlerhaft wie vorher.

  • Nochmal:

    $sql8 = mysqli_query($con, ...);

    if ($con->query(...) === TRUE)

    Da fällt dir wirklich nichts auf? :shock:

  • Hallo Bandit,

    ich habe bisher noch keine PDO-Kenntnisse. Beim Kopieren ist mir wohl der "falsche" Code untergekommen.
    Jetzt sollte der IF-Befehl aber stimmen. Leider - die Fehlermeldung aus dem ersten Post erscheint immer noch.

  • Mach' doch bitte mal die Augen auf!

    $num8 = "DELETE FROM zwischenspeicher";
    if (mysqli_query($con, $sql8))

    Das passiert, wenn man Variablen sinnlos durchnummeriert.

  • Der Fehler ist weg, der DELETE-Befehl funktioniert allerdings besser als erwartet.
    Eigentlich wollte ich nur EINEN Datensatz, den mit der gleichen Tisch-Nr in beiden Tabellen löschen.
    Habe wohl noch einen Logikfehler im Ablauf, muss mal weitersuchen.
    Danke vielmals für Deine Hilfe.

  • Jetzt weiß ich nicht, wie der Code der äußeren Schleife aktuell aussieht. Aber es ist keine gute Idee, innerhalb von

    PHP
    while ($dsatz = mysqli_fetch_assoc($sql7))


    eine weitere Schleife zu haben, in der $dsatz ein Wert zugewiesen wird, der den Abbruch der äußeren Schleife unberechenbar macht:

    PHP
    while ($dsatz = mysqli_fetch_assoc($sql8)


    Dann doch lieber sinnlos durchnummerieren mit $dsatz7 und $dsatz8 :wink:

  • Hallo, ich wollte mich gerade sowieso noch einmal melden.
    Zuvor hatte ich mich über den funktionierenden DELETE-Befehl gefreut. Dabei wurden alle Datensätze aus der zweiten Tabelle gelöscht. Danach habe ich den DELETE Befehl modifiziert und habe noch eine WHERE Bedingung eingebaut. Leider funktioniert das auch nicht, ich erhalte folgenden Fehler.

    Code
    restische: 2
    Anzahl Zeilen: 5
    zw_tisch 1 rt_tisch 2
    zw_tisch 2 rt_tisch 2
    Fehler  bei Löschen You have an error in your SQL syntax; check the manual that  corresponds to your MariaDB server version for the right syntax to use  near '= 2' at line 1
    Zwischenspeicher wurde gelöscht
    zw_tisch 5 rt_tisch 2
    zw_tisch 8 rt_tisch 2
    zw_tisch 9 rt_tisch 2

    Hier nochmal der Code zur Kontrolle:

    zuvor habe ich mit Unterstützung von Bandit die Syntax korrigiert. Der DELETE-Befehl funktioniert aber nach wie vor nicht. Eine Anmerkung noch: Hat jemand eine Anregung wie man das Problem der verschachtelten WHILE-Bedingungen besser löst??:shock:

    Einmal editiert, zuletzt von hpuettma (23. Juli 2017 um 18:09)

  • Mir fehlt's irgendwie an Vorstellungsvermögen, um die genaue Tabellenstruktur zu erkennen. Aber vermutlich wird statt

    PHP
    $num8 = "DELETE FROM zwischenspeicher WHERE $zwtisch == $rttisch";


    das hier zum gewünschten Ergebnis führen:

    PHP
    $num8 = "DELETE FROM zwischenspeicher WHERE zw_tisch = $rttisch";


    Das Problem mit der $dsatz-Variablen (s. letzter Beitrag) ist auch noch vorhanden und die Variablen-Benennung ist recht unübersichtlich und inkonsistent. $num8 ist erst eine Ganzzahl zugewiesen, später dann String mit einem SQL-Statement...

    Einmal editiert, zuletzt von d_spaete (23. Juli 2017 um 18:23)

  • Die scheinbar sinnlose Durchnummerierung (sql7, sql8, num7, num8 ...) rührt daher, dass ich den vorliegenden Code nur über einen INCLUDE in einem Hauptprogramm aufrufe. Dabei befürchte ich, dass frühere sql1, sql2 .... Nummerierungen den hier vorliegenden Code beeinflussen könnten. Ist das so?

    - - - Aktualisiert - - -

    wenn ich im DELETE WHERE das Tabellenfeld ansprechen soll, wäre das 'zw_tisch'. Ist das so gemeint?

    - - - Aktualisiert - - -

    Habe das auch mal probiert, geht leider auch nicht.

    Hier die beiden Tabellenstrukturen:

    Einmal editiert, zuletzt von hpuettma (23. Juli 2017 um 18:36)

  • Eher andersherum. Du könntest in der inkludierten Datei Variablen Werte zuordnen und damit unerwünschte Effekte in der inkludierenden Datei bewirken. Es ist eh kein funktionales Problem, sondern erschwert die Wartbarkeit, wenn die Variablen keine Bezeichnungen haben, mit denen man gleich eine Ahnung hat, was für Datentypen ihnen zugewiesen sind etc.

    Stimmt, zw_tisch heißt das Tabellenfeld, nicht zwtisch wie in meinem Post (hab's aber korrigiert).

    - - - Aktualisiert - - -

    Nicht

    PHP
    //$num8 = "DELETE FROM zwischenspeicher WHERE $zwtisch == $rttisch";
                                $delete = "DELETE FROM zwischenspeicher WHERE zw_tisch == $rttisch";
    
                                if (mysqli_query($con, $num8))


    sondern

    PHP
    //$num8 = "DELETE FROM zwischenspeicher WHERE $zwtisch == $rttisch";
                                $delete = "DELETE FROM zwischenspeicher WHERE zw_tisch = $rttisch";
    
                                if (mysqli_query($con, $delete))
  • zum Verständnis, hatte ich den obigen Text als einen Lösungsansatz zu verstehen? Oder war es eine generelle Vorgehensweise? Der Test ergab nämlich keine Veränderung, das Problem besteht nach wie vor.

    - - - Aktualisiert - - -

    hab es korrigiert - leider kein Erfolg beim Löschen

  • Sag' mal, liest du auch die Antworten, die du bekommst?!?!?!?!?!?!?

    Dir wurde schon 2x gesagt, dass == falsch ist!!!

    Außerdem verjubelst du unnötig Speicherplatz in der DB. int(11) bei Anzahl Personen und Tisch ist Irrsinn, denn ich glaube kaum, dass du knapp 100 Milliarden Personen an einen Tisch bekommst und du auch keine rund 100 Milliarden Tische hast.

  • Der Webentwickler ist praktisch verpflichtet, darauf hinzuweisen. Mit der konkreten Lösung dürfte es aber nichts zu tun haben.

    Im Code steht aber immer noch zw_tisch == $rttisch statt zw_tisch = $rttisch

  • Geschafft!! :lol: Ich hatte den Hinweis übersehen.
    Tausend Dank an Euch beiden. Wenn ich könnte, würde ich Euch jetzt ein Bier ausgeben. :D
    Vielen vielen Dank.