Mehrere DELETE-Statements in einem Query-String

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

  • Mehrere DELETE-Statements in einem Query-String

    /*
    $sql = "DELETE FROM tblcontent where contentCodeID "."\n";
    $sql .= "in (select tblcode.codeID from tblcode where ";
    $sql .= "tblcode.codeEntityID in (SELECT ma.id ";
    $sql .= "FROM mitarbeiter ma ";
    $sql .= "WHERE ma.id=" .$_GET['id']."));";

    $sql .= "DELETE FROM tblcode where ";
    $sql .= "codeEntityID in (SELECT ma.id ";
    $sql .= "FROM mitarbeiter ma ";
    $sql .= "WHERE ma.id=".$_GET['id'].");";

    $sql .= "DELETE FROM mitarbeiter ";
    $sql .= "WHERE id=".$_GET['id'].";";
    $ergebnis = mysql_query($sql)or die("Error, Daten konnten nicht gelöscht werden.");
    echo "Daten wurden erfolgreich gelöscht."."\n";
    mysql_close();
    */

    Hallo *

    Ich bin ein PHP-Neuling und habe bis anhin in VB6.0 und/oder C# Programmiert.

    Dort war es kein Problem, in einem Query-String mehrere Inline-Transaktionen, also z.B. mehrere DELETE-Statements abzusetzen.

    Hier in PHP kriege ich es einfach nicht hin. Siehe obiges Code-Fragment.
    Wenn ich diesen Code mittels echo rauskopiere und diesen im mySQL-Manager ausführe, wird die Löschung ausgeführt, aber mittels PHP nicht
    (DB-Connect ist i.O).

    Wenn ich die DELETE-Queries einzeln auslöse, funktioniert es.
    Ist aber "transaktionsmässig" nicht gerade das gelbe vom Ei.

    Kann mir jemand miteilen, was ich falsch mache?

    Besten Dank und Gruss

  • #2
    siehe transaktionen mysql

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      soweit ich weiß kann man pro query(); nur ein statement ausführen. das einzige was da bleibt ist eine schleife. alternative siehe etwas weiter unten.

      aber ne transaktion ist meines wissens was anderes.
      man erzeugt ne transaction führt dann x-beliebig viele queries aus und am schluss prüft man ob die alle erfolgreich waren. wenn mindestens eins schiefgegangen ist, gibts nen rollback.

      es ist zwar unwahrscheinlich, weil alles sehr schnell in server manager ausgeführt wird, aber wenn du jetzt 100 queris hintereinander setzt und beim 87. der server abraucht, dann sind nur 13 stück nicht ausgeführt worden.

      achja nutz doch einfach ein framework/klassensammlung wie z.B. Zend (hab ich selbst jetzt noch nicht mitgearbeitet) oder die PEAR-Klasse mdb2. zumindest bei letzterem gibt es "multiple executes" und auch transaktionen

      Kommentar


      • #4
        Mit PDO geht das auch. Viel sagen kann ich dir dazu allerdings nicht, da ich das momentan selbst noch erforsche. Scheint aber eigentlich ne feine Sache zu sein das Ding. Und Transaktionen sind dort auch möglich. ( Abschnitt 5 in dem Link da oben ).
        Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

        Kommentar


        • #5
          MyISAM

          Danke für die Antworten.

          Ist es tatsächlich so dass man pro query() nur ein Statement ausführen kann?

          Aber jetzt ist mir einiges klar(er).
          Die Tabellen sind vom Typ myISAM, ich kann daraus keine InnoDB machen, da es sich um eine bestehende Lösung handelt.
          Keine referenzielle Intergrität mit Lösch-Option (dann könnte ich mir den Murks sparen) und keine Transaktionen.
          Pech gehabt.
          Werde eine andere Lösung suchen. Vielleicht eine Klasse welche die Löschungen in den Tabellen Schritt für Schritt überprüft. Die Pear-Klasse mdb2 werde ich auch noch ganauer unter die Lupe nehmen.

          Gruss und einen schönen Tag

          Kommentar


          • #6
            Die Transaktionen von PDO funktionieren doch mit myISAM, odernicht ?
            Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

            Kommentar


            • #7
              Da MyISAM keine unterstützt. Nein.
              Das kann man nicht "emulieren".

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Die Transaktionen von PDO funktionieren doch mit myISAM, odernicht ?
                Afaik sind die PDO-Methoden nur Wrapper um entsprechende Transaktionsfunktionen des nativen Treibers.

                Kommentar


                • #9
                  Warum verwendest du nicht einfach "OR" um eine zweite, dritte oder vierte Bedingung festzulegen?

                  Kommentar


                  • #10
                    evt kannst Du
                    http://de2.php.net/manual/de/functio...ulti-query.php
                    benutzen
                    Delete mit OR bei verschiedenen Tabellen geht nicht.
                    Beantworte nie Threads mit mehr als 15 followups...
                    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                    Kommentar


                    • #11
                      Original geschrieben von MelloPie
                      evt kannst Du
                      http://de2.php.net/manual/de/functio...ulti-query.php
                      benutzen
                      Delete mit OR bei verschiedenen Tabellen geht nicht.
                      Mit dem multi_query() hat es funktionert.
                      Einziger Schöheitsfehler: Wenn ein Teilquery dazwischen abschmiert
                      (testweise falscher Table-Namen eingegeben), wird der Rest trotzdem ausgeführt. Also
                      kein Transaction-Rollback in der Funktion. Damit muss ich wohl leben mit myISAM.

                      Aber sicherlich eine elegantere Lösung als Einzelabfragen generieren und ständig verbinden und schliessen.

                      Kommentar


                      • #12
                        Na ja, ob das jetzt besser ist als ein paar mysql_query-Aufrufe wage ich zu bestreiten. Dazwischen mysql_connect und mysql_close auszuführen ist natürlich schwachsinnig.

                        Nur mysql_multi_query hat absolut nix mit Transaktionssicherheit zutun... das ist nicht Transaktionssicher und das ist auch keine Transaktion, wenn irgendwas da schief geht ist alles im Arsch und die Queries werden auch nicht ohne Unterbrechung hintereinander ausgeführt.

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #13
                          Original geschrieben von ghostgambler
                          Na ja, ob das jetzt besser ist als ein paar mysql_query-Aufrufe wage ich zu bestreiten. Dazwischen mysql_connect und mysql_close auszuführen ist natürlich schwachsinnig.

                          Nur mysql_multi_query hat absolut nix mit Transaktionssicherheit zutun... das ist nicht Transaktionssicher und das ist auch keine Transaktion, wenn irgendwas da schief geht ist alles im Arsch und die Queries werden auch nicht ohne Unterbrechung hintereinander ausgeführt.
                          Bin auch noch nicht glücklich über die Lösung.

                          Meinst Du es wäre ratsam die DB auf InnoDB umzustellen? Probleme resp. Seiteneffekte sollten keine auftreten. So viele Entitäten sind noch nicht in der DB vorhanden.

                          Kommentar


                          • #14
                            also ich bin noch nicht so tief in mysqli eingestiegen aber es gibt commit und rollack funktionalität und das manual sagt:
                            Commits the current transaction for the database connection.
                            Gilt das auch für multi_query() ?
                            Beantworte nie Threads mit mehr als 15 followups...
                            Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                            Kommentar


                            • #15
                              Original geschrieben von MelloPie
                              also ich bin noch nicht so tief in mysqli eingestiegen aber es gibt commit und rollack funktionalität und das manual sagt:

                              Gilt das auch für multi_query() ?
                              Habe es getestet:
                              /*
                              $db->autocommit(FALSE);

                              $sql = "DELETE FROM tblcontent where contentCodeID ";
                              ..................

                              $sql .= "DELETE FROM tblcode where ";
                              ..................
                              $sql .= "DELETE FROM people ";
                              ..................

                              /* execute multi query */
                              if ($db->multi_query($sql)) {
                              do {
                              /* store first result set */
                              if ($result = $db->store_result()) {
                              echo "Inhalt gelöscht";
                              $result->close();
                              }
                              /* print divider */
                              if ($db->more_results()) {
                              printf("-\n");
                              }
                              } while ($db->next_result());
                              echo "Löschung erfolgreich";
                              $db->rollback();
                              */

                              Mit myIsam no way. Mit innoDB rollback ok.
                              Zuletzt geändert von neophyt; 26.02.2008, 22:25.

                              Kommentar

                              Lädt...
                              X