2012-07-24 6 views
14

Ich möchte wissen, ob ich eine Mysqli Anweisung vorbereiten kann, die mehrere Abfragen ausführt:mysqli: Kann es mehrere Abfragen in einer Anweisung vorbereiten?

mysqli->prepare(query1 ...1,2,3 param...; query2...4,5 param...); 
or 
mysqli->prepare(insert into ...1,2,3 param...; insert into...4,5 param...); 
and after all 
mysqli->bind_param("sssss", 1, 2, 3, 4, 5); 

es Fehler machen Auf diese Weise: Call auf eine Elementfunktion bind_param in() auf einem Nicht-Objekt ...

$stmt = $sql->getQueryPrepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?); INSERT INTO process (id_user, idp) VALUES (?,?);"); 

$stmt->bind_param("ssssss",$id, $username, $pw, $email, $id, $idp); 

$stmt->execute(); 
$stmt->close(); 
+0

Können Sie Ihren tatsächlichen Quellcode veröffentlichen? Welches Objekt nennt du 'bind_param()'? – Tchoupi

+1

@GermannArlington, Kennen Sie den Unterschied zwischen Java und PHP? – Pacerier

Antwort

20

Eine vorbereitete Anweisung kann nur eine MySQL-Abfrage ausführen. Sie können so viele Aussagen vorbereiten, wie Sie in verschiedenen Variablen wollen:

$stmtUser = $sql->prepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?)"); 
$stmtProc = $sql->prepare("INSERT INTO process (id_user, idp) VALUES (?,?);"); 

Und sie später dann ausführen. Wenn Sie sicherstellen wollen, dass keiner von beiden jemals ausgeführt wird, es sei denn, beide können ausgeführt werden, dann müssen Sie in Transaktionen schauen, wie Thomas sagte.

Auch ein allgemeiner Tipp: „auf einem Nicht-Objekt-Memberfunktion aufrufen“ ist der Standardfehler erhalten Sie, wenn prepare() ausfällt und so ist $stmt nicht wirklich eine vorbereitete Erklärung Objekt. Es bedeutet in der Regel, dass Sie nach einem Fehler in Ihrer prepare() Anweisung suchen müssen und nicht später.

+0

Danke 'viel;) – Donovant

+1

Aber vielfache Vorbereitung ist kein atomarer Prozess? – Donovant

+1

Richtig, dies mit mehreren Vorbereitungsvorgängen zu tun ist nicht atomar. – octern

15

Nein, ein einzelner Aufruf der Funktion mysqli prepare() kann nicht mehrere Abfragen gleichzeitig vorbereiten. Sie können jedoch mehrere Abfragen zur Ausführung vorbereiten, indem Sie verschiedene Variablen verwenden.

Es sieht auch so aus, als ob Sie versuchen, eine Transaktion einzurichten, was eine andere Frage ist, als Sie gestellt haben. Wenn Sie das wirklich wissen möchten, müssen Sie weitere Informationen über Ihre Datenbankeinrichtung und wahrscheinlich genauere Informationen über den Anwendungsfall, den Sie zu lösen versuchen, bereitstellen.

+1

Während Sie mehr als eine Abfrage für die Ausführung vorbereiten können, indem Sie verschiedene Variablen verwenden, können Sie ** sie ** nicht überschneiden. [Es wird nicht funktionieren] (http://stackoverflow.com/questions/11632902/mysqli-can-it-prepare-multiple-queries-in-one_statement#comment50240272_11635679). – Pacerier

Verwandte Themen