php_beginner: MySQL Transactions

Hi,

Ich moechte, dass die Daten einer Session in einer mysql Datenbank gespeichert werden. Da ich nun außerdem verhindern moechte, dass  bei nahezu gleichzeitigem Beginn zweier Sessions Fehler auftreten, wollte ich meine SQL Anweisung reapeatable read geschuetzt machen:

$qry =  " START TRANSACTION; " .
     " INSERT INTO Session (SessionID,StartTime,Usertype,Name) " .
     " VALUES ('$sessionid','$startime','Admin','$Admin_Account'); " .
     " SELECT last_insert_id(); " .
     " COMMIT;";

Nach dem Ausfuehren des query`s wollte ich dann eben die last_insert_id auslesen lassen, um sie hinterher weiter zu benutzen. Da aber zwischen Insert und Select ein weiteres Insert erfolgen koennte, wuerde die last_insert_id u.U. nicht mehr stimmen. Normalerweiße ist mysql auf repeatable read eingestellt, was ja reichen wuerde, wenn ich das Insert und das Select irgendwie "koppeln" koennte. Ist meine Query Eingabe einfach falsch oder was habe ich nicht beachtet ?

  1. Hallo!

    Nach dem Ausfuehren des query`s wollte ich dann eben die last_insert_id auslesen lassen, um sie hinterher weiter zu benutzen.

    Nach einem INSERT-Befehle kannst du dir aber auch mit der PHP-Funktion mysql_insert_id($sql); (http://www.php.net/manual/de/function.mysql-insert-id.php) die letzte ID ausgeben lassen.

    lg lixx

    1. Auch gut :]
      Danke

  2. echo $begrüßung;

    Ich moechte, dass die Daten einer Session in einer mysql Datenbank gespeichert werden. Da ich nun außerdem verhindern moechte, dass  bei nahezu gleichzeitigem Beginn zweier Sessions Fehler auftreten, wollte ich meine SQL Anweisung reapeatable read geschuetzt machen:

    Welche Fehler befürchtest du?

    $qry =  " START TRANSACTION; " .
         " INSERT INTO Session (SessionID,StartTime,Usertype,Name) " .
         " VALUES ('$sessionid','$startime','Admin','$Admin_Account'); " .
         " SELECT last_insert_id(); " .
         " COMMIT;";

    PHP weigert sich, mehrere Statements mit einem mysql_query()-Aufruf auszuführen. Und das ist auch gut so, verhindert dies doch zumindest diejenigen SQL-Injection-Angriffe, die das eigentliche Statement abschließen und neue Statements anzuhängen versuchen. Für mehrere Statements benötigst du PHP5, die mysqli-Extension und die Funktion mysqli_multi_query(). Außerdem brauchst du die InnoDb-Datebase Engine, wenn du unter MySQL Transaktionen vermenden willst.

    Nach dem Ausfuehren des query`s wollte ich dann eben die last_insert_id auslesen lassen, um sie hinterher weiter zu benutzen. Da aber zwischen Insert und Select ein weiteres Insert erfolgen koennte, wuerde die last_insert_id u.U. nicht mehr stimmen.

    Wenn das erfolgt, bist du aber selbst dran schuld, denn LAST_INSERT_ID() bezieht sich immer nur auf die aktuelle Datenbankverbindung. Die PHP-Funktion mysql_insert_id() greift übrigens auch nur auf diesen Wert zu.

    echo "$verabschiedung $name";

    1. PHP weigert sich, mehrere Statements mit einem mysql_query()-Aufruf auszuführen. Und das ist auch gut so, verhindert dies doch zumindest diejenigen SQL-Injection-Angriffe, die das eigentliche Statement abschließen und neue Statements anzuhängen versuchen. Für mehrere Statements benötigst du PHP5, die mysqli-Extension und die Funktion mysqli_multi_query(). Außerdem brauchst du die InnoDb-Datebase Engine, wenn du unter MySQL Transaktionen vermenden willst.

      Wenn das erfolgt, bist du aber selbst dran schuld, denn LAST_INSERT_ID() bezieht sich immer nur auf die aktuelle Datenbankverbindung. Die PHP-Funktion mysql_insert_id() greift übrigens auch nur auf diesen Wert zu.

      echo "$verabschiedung $name";

      Danke fuer diese Info. Dachte, dass last_insert_id() allgemein die letzte ID zurueckgibt. Stellt man sich ein Website mit mehreren Zugriffen/Inserts/Updates vor, dann haette das zum Problem werden koennen.