Ver índice
Consultas preparadas (MySQLi)

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Declaraciones preparadas (Prepare statement)

Mediante MySQLi disponemos de una nueva alternativa de consultas que conviene conocer. Requiere realizar el proceso de consulta en los dos pasos siguientes:

$actuacion=mysqli_prepare($conexion,SENTENCIA)
o
$actuacion= $objeto->prepare(SENTENCIA)

El método prepare prepara la SENTENCIA para su ejecución devolviendo el resultado como un objeto $actuacion. Este método no ejecuta la sentencia, solo la prepara.

mysqli_stmt_execute($actuacion)
o
$actuacion-> execute()

El método execute es propio de los objetos resultantes$actuacion de la preparación una sentencia. Devuelve el objeto resultado de la ejecución de esa sentencia. Este objeto permite extraer los resultados mediante:

$resultado=mysqli_stmt_get_result($actuacion)
o
$resultado=$actuacion->get_result()

El método get_result() cuando se trata de objetos o su equivalente mysqli_stmt_get_result producen un bloque de información idéntico al que se podría obtener mediante el método query o su equivalente mysqli_query. Por tanto es susceptible de ser leido mediante cualquiera de los procedimientos comentados en el epígrafe Los resultados de la sentencia SELECT de la página anterior. Aquí tienes un ejemplo en ambas versiones.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Existe una opción alternativa de lectura del objeto resultante de la ejecución del método execute. Se trata de utilizar una de las siguientes funciones:

mysqli_stmt_bind_result($actuacion, $var1, $var2, $var3, ...)
o
$actuacion->bind_result($var1, $var2, $var3, ...)

dónde $actuacion es el nombre del objeto resultante del método execute (o de mysqli_execute) $var1, $var2, $var3,.. son nombres válidos cualesquiera de variables PHP a través de las que se vincularán los campos de la consulta. Han de crearse –obligatoriamente– tantas variables como campos intervengan en la consulta.

Las funciones anteriores organizan los resultados de la consulta por registros (filas) que pueden ser leidas secuencialmente de una en una y a través de llamadas reiterativas por medio de una de estas funciones:

mysqli_stmt_fetch($actuacion)
o
$actuacion->fetch()

que irán asignando a las variables $var1, $var2, $var3,.. los valores de los campos correspondientes al registro contenido en la fila actual. La lectura comienza por el primer registro resultante de la consulta y continúa secuencialmente (la lectura completa requiere la realización de un bucle tal como puedes ver en los ejemplos) en las sucesivas llamadas a estas funciones. Como es obvio, en cada iteración se modificarán los valores de las variables $var1, $var2, $var3,...

Las páginas oficiales de PHP justifican la utilización de este procedimiento cuando se trate de ahorrar recursos de memoria (el resultado de la consulta no es almacenado en ningún buffer) y, a la vez, admiten una mayor lentitud en el procesamiento de la información

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

A la sintaxis ya conocida:

$actuacion= $objeto->prepare(SENTENCIA)
$actuacion-> execute()

puede hacérsele una modificación incluyendo entre ambas un nuevo método (bind_param) que tiene como finalidad enlazar el valor de una variable con un identificador incluido en la sentencia SQL. Una sintaxis como esta:

$actuacion=mysqli_prepare($conexion,'SELECT * FROM tabla WHERE (Nombre=? and Apellido1=? and edad=?)')
mysqli_stmt_bind_param($actuacion,'ssi', $var1, $var2, $var3);
$var1='Jose'; $var2='Alonso'; $var3=25;
mysqli_stmt_execute($actuacion)
o
$actuacion= $objeto->prepare('SELECT * FROM tabla WHERE (Nombre=? and Apellido1=? and edad=?)')
$actuacion-> bind_param('ssi', $var1, $var2, $var3);
$var1='Jose'; $var2='Alonso'; $var3=25;
$actuacion-> execute()

en la que hacemos las siguientes modificaciones:

Veamos un primer ejemplo en el que las variables son de tipo numérico

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

En este otro ejemplo ya hemos incluido variables tanto numéricas como cadena y dónde conjugamos el uso de bind_param con el de bind_result.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente