(PHP 5, PHP 7)
mysqli_stmt::prepare -- mysqli_stmt_prepare — Preparar una sentencia SQL para su ejecución
Estilo orientado a objetos
Estilo por procedimientos
Prepara una consulta the SQL apuntada por la consulta de cadena terminada en null.
Los marcadores de parámetros deben estar vinculados a las variables de la apliación usando mysqli_stmt_bind_param() y/o mysqli_stmt_bind_result() antes de ejecutar la sentencia u obtener filas.
Nota:
En el caso de que se pase una sentencia a mysqli_stmt_prepare() que sea más grande que max_allowed_packet del servidor, los códigos de error devueltos serán diferentes, dependiendo de si se usa el Controlador Nativo de MysQL (mysqlnd) o la biblioteca Cliente de MySQL (libmysqlclient). El comportamiento es como sigue:
mysqlnd en Linux devuelve un código de error 1153. El mensaje de error significa "obtenido un paquete mas grande que max_allowed_packet bytes".
mysqlnd en Windows devuelve un código de error 2006. Este mensaje de error significa "el servidor se ha ido".
libmysqlclient en todas las plataformas devuelve un código de error 2006. Este mensaje de error significa "el servidor se ha ido".
stmt
Sólo estilo por procediminetos: Un identificador de declaraciones devuelto por mysqli_stmt_init().
query
La consulta, como una cadena. Debe consistir en una sentencia SQL única.
Se puede incluir uno o más marcadores de parámetros en la senetencia SQL embebiendo el carácter de signo de interrogación (?) en la posición apropiada.
Nota:
No se debería añadir un punto y coma terminal o \g a la sentencia.
Nota:
Los marcadores únicamente son legales en ciertos lugares de las sentencias SQL. Por ejemplo, están permitidos en la lista de VALUES() de una sentencia INSERT (para especificar los valores de las columnas de una fila), o en una comparación en una cláusula WHERE para especificar un valor de comparación.
Sin embargo, no están permitidos en identificadores (como nombres de tablas o columnas), en la lista de selección que nombra a las columnas a ser devueltas por una sentencia SELECT), o para especificar ambos operandos de un operador binario como signo igual =. La última restricción es necesaria debido a que sería imposible determinar el tipo de parámetro. En general, los parámetros son legales únicamente en sentencias de Lenguaje de Manipulación de Datos (DML), y no en sentencias de Lenguaje de Definición de Datos (DDL).
Devuelve TRUE
en caso de éxito o FALSE
en caso de error.
Ejemplo #1 Estilo orientado a objetos
<?php
$mysqli = new mysqli("localhost", "my_usuario", "mi_contraseña", "world");
/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}
$ciudad = "Amersfoort";
/* crear una sentencia preparada */
$sentencia = $mysqli->stmt_init();
if ($sentencia->prepare("SELECT District FROM City WHERE Name=?")) {
/* vincular los parámetros para los marcadores */
$sentencia->bind_param("s", $ciudad);
/* ejecutar la consulta */
$sentencia->execute();
/* vincular las variables de resultados */
$sentencia->bind_result($distrito);
/* obtener el valor */
$sentencia->fetch();
printf("%s está en el distrito de %s\n", $ciudad, $distrito);
/* cerrar la sentencia */
$sentencia->close();
}
/* cerrar la conexión */
$mysqli->close();
?>
Ejemplo #2 Estilo por procedimientos
<?php
$enlace = mysqli_connect("localhost", "my_usuario", "mi_contraseña", "world");
/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}
$ciudad = "Amersfoort";
/* crear una sentencia preparada */
$sentencia = mysqli_stmt_init($enlace);
if (mysqli_stmt_prepare($sentencia, 'SELECT District FROM City WHERE Name=?')) {
/* vincular los parámetros para los marcadores */
mysqli_stmt_bind_param($sentencia, "s", $ciudad);
/* ejecutar la consulta */
mysqli_stmt_execute($sentencia);
/* vincular las variables de resultados */
mysqli_stmt_bind_result($sentencia, $distrito);
/* obtener el valor */
mysqli_stmt_fetch($sentencia);
printf("%s está en el distrito de %s\n", $ciudad, $distrito);
/* cerrar la sentencia */
mysqli_stmt_close($sentencia);
}
/* cerrar la conexión */
mysqli_close($enlace);
?>
El resultado de los ejemplos sería:
Amersfoort está en el distrito de Utrecht