Las consultas pueden ser ejecutadas con las funciones mysqli::query(), mysqli::real_query() y mysqli::multi_query(). La función mysqli::query() es la más común, y combina la ejecución de la consulta con una recuperación de su juego de resultados en memoria tamponada, si lo hay, en una sola llamada. Llamar a la función mysqli::query() es idéntico a llamar a la función mysqli::real_query() seguida de una llamada a la función mysqli::store_result().
Ejemplo #1 Ejecución de consultas
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
Juegos de resultados en memoria tamponada
Después de la ejecución de la consulta, los resultados pueden ser recuperados completamente de una vez o bien ser leídos línea por línea. La memoria tamponada del juego de resultados del lado-cliente permite al servidor liberar los recursos asociados con el resultado de la consulta tan pronto como sea posible. En general, los clientes son lentos para recorrer los juegos de resultados. Sin embargo, se recomienda utilizar la memoria tamponada de los juegos de resultados. La función mysqli::query() combina tanto la ejecución de la consulta como la memoria tamponada del juego de resultados.
Las aplicaciones PHP pueden navegar libremente en los resultados en memoria tamponada. La navegación es rápida ya que los juegos de resultados están almacenados en la memoria del cliente. Tenga en cuenta que a menudo es más sencillo realizar esta operación por el cliente que por el servidor.
Ejemplo #2 Navegación en resultados en memoria tamponada
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");
$result = $mysqli->query("SELECT id FROM test ORDER BY id ASC");
echo "Orden inverso...\n";
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);
$row = $result->fetch_assoc();
echo " id = " . $row['id'] . "\n";
}
echo "Orden del juego de resultados...\n";
foreach ($result as $row) {
echo " id = " . $row['id'] . "\n";
}
El resultado del ejemplo sería:
Orden inverso... id = 3 id = 2 id = 1 Orden del juego de resultados... id = 1 id = 2 id = 3
Juegos de resultados no en memoria tamponada
Si la memoria del cliente es un recurso limitado, y la liberación de los recursos del servidor tan pronto como sea posible para mantener una carga del servidor baja no es necesaria, los resultados no en memoria tamponada pueden ser utilizados. La navegación a través de resultados no en memoria tamponada no es posible hasta que todas las líneas no hayan sido leídas.
Ejemplo #3 Navegación en resultados no en memoria tamponada
<?php
$mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
$result = $mysqli->use_result();
echo "Orden del juego de resultados...\n";
foreach ($result as $row) {
echo " id = " . $row['id'] . "\n";
}
Tipos de datos de los valores del juego de resultados
Las funciones mysqli::query(), mysqli::real_query()
y mysqli::multi_query() se utilizan para ejecutar consultas no preparadas. A nivel del protocolo cliente-servidor MySQL, la orden
COM_QUERY
así como el protocolo texto son utilizados para
la ejecución de la consulta. Con el protocolo texto, el servidor MySQL convierte
todos los datos de un juego de resultados en cadenas de caracteres antes de enviarlos.
La biblioteca cliente mysql recibe todos los valores de las columnas en forma
de cadena de caracteres. Ninguna otra conversión del lado-cliente se realiza
para recuperar el tipo nativo de las columnas. En su lugar, todas las valores son
proporcionados en la forma de cadena de caracteres PHP.
Ejemplo #4 El protocolo texto devuelve cadenas de caracteres por omisión
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");
$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
El resultado del ejemplo sería:
id = 1 (string) label = a (string)
Es posible convertir columnas de tipo enteros y números de punto flotante
en números PHP definiendo la opción de conexión
MYSQLI_OPT_INT_AND_FLOAT_NATIVE
, si se utiliza la biblioteca
mysqlnd. Si está definida, la biblioteca mysqlnd verificará las metadatos de los tipos
de las columnas en el juego de resultados y convertirá las columnas SQL numéricas
en números PHP, si el valor está dentro del intervalo permitido de PHP.
De esta manera, por ejemplo, las columnas SQL INT son devueltas en la forma
de entero.
Ejemplo #5 Tipos nativos de datos con mysqlnd y la opción de conexión
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");
$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
El resultado del ejemplo sería:
id = 1 (integer) label = a (string)
Ver también