2012-07-24 30 views
14

me gustaría saber si puedo preparar una declaración mysqli que ejecuta varias consultas:mysqli: ¿puede preparar múltiples consultas en una sola declaración?

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

De esa manera se hacen de error: Llamada a una función miembro bind_param() en un no-objeto en ...

$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

¿Puedes publicar tu código fuente actual? ¿A qué objeto llama 'bind_param()' en? – Tchoupi

+1

@GermannArlington, ¿Conoces la diferencia entre Java y PHP? – Pacerier

Respuesta

20

Una declaración preparada solo puede ejecutar una consulta MySQL. Puede preparar tantas declaraciones como desee en diferentes variables:

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

Y luego ejecútelas más tarde. Si quiere asegurarse de que ninguno de los dos se ejecute a menos que ambos puedan ejecutarse, entonces debe examinar las transacciones, como dijo Thomas.

Además, un consejo general: "invocar a la función de miembro en un no objeto" es el error estándar que se obtiene cuando prepare() falla y $stmt no es realmente un objeto de declaración preparado. Por lo general, significa que debe buscar un error en su declaración prepare() en lugar de algo más adelante.

+0

Muchas gracias;) – Donovant

+1

¿Pero la preparación de los múltiplos no es un proceso atómico? – Donovant

+1

Correcto, hacer esto con múltiples preparaciones no es atómico. – octern

15

No, una sola llamada a la función mysqli prepare() no puede preparar varias consultas a la vez. Sin embargo, puede preparar más de una consulta para la ejecución mediante el uso de diferentes variables. The documentation for this function is available here.

También parece que está intentando configurar una transacción, lo cual es una pregunta diferente a la que ha planteado. Si eso es lo que realmente desea saber, tendrá que proporcionar más información sobre la configuración de su base de datos y, probablemente, más detalles sobre el caso de uso que está tratando de resolver.

+1

Si bien puede preparar más de una consulta para la ejecución mediante el uso de diferentes variables, ** no puede interceptar ** ellos. [No funcionará] (http://stackoverflow.com/questions/11632902/mysqli-can-it-prepare-multiple-queries-in-one-statement#comment50240272_11635679). – Pacerier

Cuestiones relacionadas