Torben: &mySQL - mehrere Anfrage "gleichzeitig"?

Moin!

Ich habe ein Problem mit PHP und mySQL. Ich möchte aus bestimmten Gründen mehrere Anweisungen in eine packen.

Im Moment sieht es bei mir ungefähr so aus (verkürzt):

$eintr1 = "INSERT INTO Tabelle1 (Kategorie1, Kategorie2) VALUES ('$Wert1', '$Wert2')";

$eintr2" = "UPDATE Tabelle2 SET Anz = '$numrec' WHERE id = '$userID'";

$eintragen = mysql_query($eintr1);
  $eintragen = mysql_query($eintr2);

Nun möchte ich das zusammen fassen. Wenn ich direkt in phpmyadmin im SQL-Feld eine Anfrage ausprobiere:

INSERT INTO Tabelle1 (Kategorie1, Kategorie2) VALUES (5, 1);
  UPDATE Tabelle2 SET Anz = 2 WHERE id = 1

Dann funktioniert das.
Probiere ich das aber in PHP:

$eintr = "INSERT INTO Tabelle1 (Kategorie1, Kategorie2) VALUES ('$Wert1', '$Wert2');
  UPDATE Tabelle2 SET Anz = '$numrec' WHERE id = '$userID'";

$eintragen = mysql_query($eintr);

Dann scheint es zwar zu funktionieren (es gibt keine Fehlermeldung), aber die Tabellenwerte ändern sich nicht.

Geht das unter PHP einfach nicht, oder mache ich etwas falsch?

Gruß,
Torben

  1. Moin!

    Ich habe ein Problem mit PHP und mySQL. Ich möchte aus bestimmten Gründen mehrere Anweisungen in eine packen.

    Welche Gründe sind das?

    Nun möchte ich das zusammen fassen. Wenn ich direkt in phpmyadmin im SQL-Feld eine Anfrage ausprobiere:
    Dann funktioniert das.

    PHPMyAdmin trennt das Textfeld in zwei nacheinander gegebene SQL-Statements auf - also genau so, wie du es im Skript bisher auch tust.

    Probiere ich das aber in PHP:
    Dann scheint es zwar zu funktionieren (es gibt keine Fehlermeldung), aber die Tabellenwerte ändern sich nicht.

    mysql_query erlaubt nur einen einzigen SQL-Befehl pro Aufruf.

    Geht das unter PHP einfach nicht, oder mache ich etwas falsch?

    Für mehrere Befehle benötigst du die MYSQLI-Extension und dort mysqli_multi_query. Damit kriegst du aber trotzdem nicht hin, dass die zwei Statements wie ein einziges Statement behandelt werden. Außerdem würde die Nutzung von mysqli bedeuten, dass du deine Skripte alle komplett überarbeitest und auf die Erfordernisse von multi_query einstellst.

    Deshalb nochmal die Eingangsfrage: Welche Gründe hast du, aus zwei Querys einen machen zu wollen? Das ist der Knackpunkt!

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Ich habe ein Problem mit PHP und mySQL. Ich möchte aus bestimmten Gründen mehrere Anweisungen in eine packen.

      Welche Gründe sind das?

      Die Gründe sind, dass sich der Programmteil nicht so verhält, wie er sich verhalten sollte. Im Wesentlichen geht es darum, dass Benutzer bestimmte Datensätze eintragen können. Anschließend wird gespeichert, wie viele Einträge der Nutzer nun getätigt hat und dies wird gespeichert.
      Dazu wird der alte Wert ausgelesen und inkrementiert.

      Der INSERT Befehl dient also dazu, den Datensatz einzutragen, der UPDATE Befehl, den inkrementierten Wert zu speichern.

      Nun wurde aber nicht immer inkrementiert. Ich hatte vermutet, dass dies vielleicht an einem Problemen mit der Nebenläufigkeit liegt, aber eigentlich kann das nicht sein. Aus diesem Grund wollte ich die Befehle aber zusammen fassen.

      Mittlerweile habe ich aber einen anderen Fehler gefunden, durch den ich vermutlich immer NULL zurück geliefert bekommen habe, das würde den Fehler erklären.

      Das Problem hat sich also im Prinzip erledigt, aber trotzdem gut zu wissen, dass es nicht geht.

      Danke Dir für die Antwort.

      Gruß,
      Torben

      1. Hello,

        Der INSERT Befehl dient also dazu, den Datensatz einzutragen, der UPDATE Befehl, den inkrementierten Wert zu speichern.

        Nun wurde aber nicht immer inkrementiert. Ich hatte vermutet, dass dies vielleicht an einem Problemen mit der Nebenläufigkeit liegt, aber eigentlich kann das nicht sein. Aus diesem Grund wollte ich die Befehle aber zusammen fassen.

        Das hängt davon ab, wo Du die "Incrementierung" durchführst.
        Wenn Du dazu das Reich des DBMS nicht verlässt, sollte kein Fehler auftreten.
        Wenn Du den Wert allerdings in der API (im PHP-Script) aufaddierst und dann mit dem neuen das Update durchführst, dann hast Du eine Prozesslücke geschaffen.

        Lass also das Update ungefähr so aussehen:

        sql = "UPDATE Tabelle2 SET Anz = Anz + $anz_neue_eintraege WHERE id = 1";

        Lass also die Datenbank rechnen.

        Wenn nun jemand anderes (ein weiterer Request) dazwischenfunkt, addiert das DBMS auch dessen Neuzugänge ganz brav.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Moin,

          Lass also das Update ungefähr so aussehen:

          sql = "UPDATE Tabelle2 SET Anz = Anz + $anz_neue_eintraege WHERE id = 1";

          Lass also die Datenbank rechnen.

          Der Tipp ist gut, daran habe ich noch garnicht gedacht. Vielen Dank :)

          Gruß,
          Torben

    2. Hello,

      PHPMyAdmin trennt das Textfeld in zwei nacheinander gegebene SQL-Statements auf - also genau so, wie du es im Skript bisher auch tust.

      Kann sogar sein, dass er dafür sogar zwei Connections benutzt, warum man häufig nicht mit Last_insert_id() arbeiten kann im PHPmyAdmin...

      Das Script benutzt augenscheinlich nur eine Connection.
      Könnte nur sein, dass man die Statements binden muss, wenn es sich um abhängige Daten handelt.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

  2. Ich habe ein Problem mit PHP und mySQL. Ich möchte aus bestimmten Gründen mehrere Anweisungen in eine packen.

    Du moechtest vermutlich sicherstellen, dass eine Befehlsfolge als Ganzes ausgefuehrt wird oder gar nicht.

    Das geht nur mit Transaktionen, bspw. wird
      UPDATE DT_1 SET DF_1 "gleich" "Leerstring"   - merine Tastatur gibt bestimmte Zeichen gerade nicht her
    implizit transaktional ausgefuehrt, d.h. es wird alles akutualisiert oder nichts.

    Beschaeftige Dich einmal mit expliziten Transaktionen, pruefe zuerst, ob Dein Datenserver diese kennt bzw. kann.