Eintragung in 2 DBs

Alles, was PHP betrifft, kann hier besprochen werden.

Eintragung in 2 DBs

Postby h0n1g » 11. July 2005 10:32

Guten Tag allerseits, ich bin neu hier und noch im "lernstadium" von PHP und MySQL.

Folgende Frage:

folgende ausgangsposition
Code: Select all
INSERT INTO seat_block (name, rows, cols, text) VALUES ('$name', '$rows', '$cols', '$text')";


Ich füge also einen Block in die DB ein, gleichzeitig soll in eine andere DB etwas eingetragen werden.

Siehe hier:

Code: Select all
INSERT INTO seat_seats (blockid, row, col, status, ip, userid) VALUES ('$blockid', '$row', '$col', '0', '', '')";



Die "einfache" dumme Frage, wie kann ich jetzt durch $blockid die id aus "seat_block" nehmen, das er die jeweilig letzte id in "seat_seats" einträgt?


PS: Da ich im Büro bin, habe ich leider keine möglichkeiten komplette Quelltexte zu posten, da wir mit OS2 (Warp von IBM) Arbeiten.
Es ist schon eine Qual überhaupt das Forum zu sehen unter OS2.
Jeder weiß selbst was er tut, aber wissen es auch andere ?
h0n1g
 
Posts: 16
Joined: 11. July 2005 10:21
Location: Pinneberg (Hamburg)

Postby Wiedmann » 11. July 2005 10:45

Ich denke mal du suchst mysql_insert_id().
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby h0n1g » 11. July 2005 11:17

Danke schonmal,

habe die function auf php.net durchgelesen
müsste also folgendermaßen aussehen:

Code: Select all
INSERT INTO seat_block (name, rows, cols, text) VALUES ('$name', '$rows', '$cols', '$text')";



Code: Select all
INSERT INTO seat_seats (blockid, row, col, status, ip, userid) VALUES ('LAST_INSERT_ID(), '$row', '$col', '0', '', '')";



Hoffentlich klappt es auch, wenn ich zuahuse bin,

ich bedanke mich herzlich.


Anmerkung zum #1 Post (mein eigener)
Habe auch zuhause kein Internet, da kein Geld vorhanden...
Jeder weiß selbst was er tut, aber wissen es auch andere ?
h0n1g
 
Posts: 16
Joined: 11. July 2005 10:21
Location: Pinneberg (Hamburg)

Postby jakimo72 » 12. July 2005 10:18

Du solltest nocheinmal über das Schließen von Strings Gedanken machen.
Funktionen können nicht innerhalb von doublequote-Strings stehen,
da muss es dann heißen:
"INSERT INTO seat_seats (blockid, row, col, status, ip, userid) VALUES ('".LAST_INSERT_ID()."', '$row', '$col', '0', '', '')";

Aus Informatikersicht interessant ist das Wort gleichzeitig.
Eine echte Gleichzeitigkeit ist bei PHP nicht möglich.
Aber aus der Datensicht heraus ist eine Transaktion atomar, und damit
quasigleichzeitig.
Transaktionen sind aber nicht über Datenbankgrenzen erlaubt, sondern nur innerhalb einer Datenbank (aber mit mehreren Tabellen).
In MySQL musst
SET AUTOCOMMIT=0
gesetzt werden.

Danach führst Du Deine SQL-Anweisungen aus, als erste
Anweisung muss dann
START TRANSACTION;
stehen, und als letzte SQL-Anweiung
COMMIT;
.
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

Postby Aziz » 16. July 2005 02:41

jakimo72 wrote:Du solltest nocheinmal über das Schließen von Strings Gedanken machen.
Funktionen können nicht innerhalb von doublequote-Strings stehen,
da muss es dann heißen:
"INSERT INTO seat_seats (blockid, row, col, status, ip, userid) VALUES ('".LAST_INSERT_ID()."', '$row', '$col', '0', '', '')";

Aus Informatikersicht interessant ist das Wort gleichzeitig.
Eine echte Gleichzeitigkeit ist bei PHP nicht möglich.
Aber aus der Datensicht heraus ist eine Transaktion atomar, und damit
quasigleichzeitig.
Transaktionen sind aber nicht über Datenbankgrenzen erlaubt, sondern nur innerhalb einer Datenbank (aber mit mehreren Tabellen).
In MySQL musst
SET AUTOCOMMIT=0
gesetzt werden.

Danach führst Du Deine SQL-Anweisungen aus, als erste
Anweisung muss dann
START TRANSACTION;
stehen, und als letzte SQL-Anweiung
COMMIT;
.


Ich muss dich korrigieren:

1.) LAST_INSERT_ID() ist keine PHP-Funktion sondern eine MySQL-Funktion. Also war die Query von h0n1g schon richtig; er/sie hat allerdings ein Apostroph zuviel in der Query gehabt, nämlich genau vor der Funktion LAST_INSERT_ID().
Code: Select all
INSERT INTO seat_seats (blockid, row, col, status, ip, userid) VALUES (LAST_INSERT_ID(), '$row', '$col', '0', '', '')


2.) In diesem Fall sind Transaktionen nicht notwendig. Die Funktion LAST_INSERT_ID() ist session-basierend, daher kann es nicht zu korrupten Ergebnissen kommen. Außerdem sind atomare Operationen, nicht 100% atomar/sicher, denn wenn der Thread inmitten einer Transaktion abstürzt od. gekillt wird, dann werden die Operationen nie erfolgreich bis zum Ende ausgeführt. Soweit ich weiß werden Transaktionen erst ab der MySQL-Version 3.23 und nur bei InnoDB und BDB Tabellen unterstützt. Support für Transaktionen in MyISAM Tables gibt es erst ab MySQL 5+.
Aziz
 
Posts: 3
Joined: 13. April 2005 17:36


Return to PHP

Who is online

Users browsing this forum: No registered users and 25 guests