En mysql CLI he preparado una declaración como esta:
PREPARE registrarUser FROM 'INSERT INTO Users (Users_name,Email,pass) values (?,?,?)'En mi base de datos, las declaraciones preparadas deben hacerse de esta manera, en lugar de usar un método php como este:
$conn->prepare("INSERT INTO Users (Users_name,Email,pass) VALUES (?, ?, ?)");Entonces no puedo usar la declaración preparada o vincular argumentos.
Probé esta consulta que imita las declaraciones requeridas en mysql CLI
$query = sprintf(' SET @Users_name = "%s"; SET @Email= "%s"; SET @pass = "%s"; EXECUTE registrarUser USING @Users_name, @Email, @pass;',$Users_name,$Email,$pass);Pero devuelve el siguiente error de sintaxis:
Errormessage: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @Email= "eds@gmail.com"; SET @pass = "Thinkshap2"; EXECUTE registrar' at line 2¿Alguien sabe si hay una manera de hacerlo? Muchas gracias por adelantado;
No es posible.
Del manual de MySQL
El alcance de una declaración preparada es la sesión dentro de la cual se crea...
- Una declaración preparada creada en una sesión no está disponible para otras sesiones.
No, no es posible. Las declaraciones preparadas tienen el alcance de la sesión. Cada vez que abre una nueva conexión en PHP, abre una nueva sesión de MySQL. Puede usar PREPARE y EXECUTE en PHP, pero ambas operaciones deben realizarse en la misma sesión.
En otras palabras, las declaraciones creadas con PREPARE no persisten en el servidor de la base de datos. Solo existen durante el tiempo de vida de la sesión actual.
La razón por la que obtiene un error de sintaxis en PHP es porque ha concatenado varias declaraciones SQL juntas. No puede hacer eso de forma predeterminada en PHP debido a consideraciones de seguridad. Ejecute cada uno por separado. Por ejemplo, esto funciona:
$stmt = $mysqli->query("PREPARE registrarUser FROM 'SELECT ?'"); $stmt = $mysqli->query("EXECUTE registrarUser USING 32"); Advertencia El uso de PREPARE y EXECUTE desde PHP anula el propósito principal del uso de declaraciones preparadas en PHP. La principal ventaja es que puede separar las variables de la sintaxis SQL. No puedes hacer eso con PREPARE y EXECUTE . Es por eso que tanto PDO como mysqli han preparado declaraciones. Use mysqli::prepare() y mysqli_stmt::execute()