2012-07-24 6 views
14

Vorrei sapere se posso preparare una dichiarazione mysqli che esegue più query:mysqli: può preparare più query in un'unica istruzione?

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); 

In tal modo si rendono errore: chiamata a un bind_param funzione membro() su un non-oggetto in ... funzione

$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

Puoi pubblicare il tuo codice sorgente attuale? Su quale oggetto stai chiamando 'bind_param()'? – Tchoupi

+1

@GermannArlington, conosci la differenza tra Java e PHP? – Pacerier

risposta

20

Un'istruzione preparata può eseguire solo una query MySQL. Potete preparare il maggior numero di affermazioni che vuoi in diverse variabili:

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

E poi eseguire in un secondo momento. Se vuoi assicurarti che nessuno dei due venga mai eseguito, a meno che entrambi non siano in grado di funzionare, allora devi esaminare le transazioni, come ha detto Thomas.

Inoltre, un suggerimento generale: "invito alla funzione di membro su un non-oggetto" è l'errore standard si ottiene quando prepare() fallisce e così $stmt non è in realtà un oggetto istruzione preparata. Di solito significa che devi cercare un errore nella tua istruzione prepare() piuttosto che in seguito.

+0

Grazie mille;) – Donovant

+1

Ma la preparazione dei multipli non è un processo atomico? – Donovant

+1

Corretto, farlo con più preparativi non è atomico. – octern

15

No, una sola chiamata al mysqli preparare() non è in grado di preparare più query in una sola volta. Tuttavia, è possibile preparare più di una query per l'esecuzione utilizzando variabili diverse. The documentation for this function is available here.

Sembra anche che si stia tentando di impostare una transazione, che è una domanda diversa da quella richiesta. Se è quello che vuoi veramente sapere, dovrai fornire ulteriori informazioni sulla configurazione del tuo database e probabilmente più specifiche sul caso d'uso che stai cercando di risolvere.

+1

Mentre è possibile preparare più di una query per l'esecuzione utilizzando variabili diverse, non è ** possibile intersecare **. [Non funzionerà] (http://stackoverflow.com/questions/11632902/mysqli-can-it-prepare-multiple-queries-in-one-statement#comment50240272_11635679). – Pacerier