# mysqli_stmt::prepare

# mysqli_stmt_prepare

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::prepare -- mysqli_stmt_prepare — Preparar una sentencia SQL para su ejecución

### Descripción

Estilo orientado a objetos

mysqli_stmt::prepare(string `$query`): mixed

Estilo por procedimientos

mysqli_stmt_prepare(mysqli_stmt `$stmt`, string `$query`): bool

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.

### Parámetros

`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).

### Valores devueltos

Devuelve `true` en caso de éxito o `false` en caso de error.

### Ejemplos

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

### Ver también

- mysqli_stmt_init() - Inicializa una sentencia y devuelve un objeto para usarlo con mysqli_stmt_prepare
- mysqli_stmt_execute() - Ejecuta una consulta preparada
- mysqli_stmt_fetch() - Obtiene los resultados de una sentencia preparadas en las variables vinculadas
- mysqli_stmt_bind_param() - Agrega variables a una sentencia preparada como parámetros
- mysqli_stmt_bind_result() - Vincula variables a una sentencia preparada para el almacenamiento de resultados
- mysqli_stmt_get_result() - Obtiene un conjunto de resultados de una sentencia preparada
- mysqli_stmt_close() - Cierra una sentencia preparada