Ejecutar sentencias

Las sentencias se pueden ejecutar 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 sentencia de ejecucución con su conjunto de resultados obtenido de un buffer, si lo hubiera, en una llamada. Llamar a mysqli_query() es idéntico que llamar a mysqli_real_query() seguido de mysqli_store_result().

Ejemplo #1 Conectando a MySQL

<?php
$mysqli
= new mysqli("ejemplo.com", "usuario", "contraseña", "basedatos");
if (
$mysqli->connect_errno) {
echo
"Falló la conexión con MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!
$mysqli->query("DROP TABLE IF EXISTS test") ||
!
$mysqli->query("CREATE TABLE test(id INT)") ||
!
$mysqli->query("INSERT INTO test(id) VALUES (1)")) {
echo
"Falló la creación de la tabla: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>

Conjuntos de resultados almacenados en buffer

Después de la ejecución de sentencias, los resultados pueden recuperarse de una sola vez para que sean almacenados en buffer por el cliente o leyendo fila a fila. El almacenamieno en buffer de conjuntos de resultados en el lado del cliente permite al servidor liberar recursos asociados con los resultados de la sentencia tan pronto como sea posible. Generalmente hablando, los clientes son lentos consumiendo conjuntos de resultados. Por lo tanto, se recomienda usar conjuntos de resultados almacenados en buffer. mysqli_query() combina la ejecución de sentencias y el almacenamiento en buffer de conjuntos de resultados.

Las aplicaciones de PHP pueden navegar libremente a través de resultados almacenados en buffer. La navegación es más rápida debido a que los conjuntos de resultados se mantienen en la memoria del cliente. Tenga en cuenta que a menudo es más fácil procesar datos en el cliente que hacerlo el servidor.

Ejemplo #2 Navegación a través de resultados almacenados en buffer

<?php
$mysqli
= new mysqli("ejemplo.com", "usuario", "contraseña", "basedatos");
if (
$mysqli->connect_errno) {
echo
"Falló la conexión a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!
$mysqli->query("DROP TABLE IF EXISTS test") ||
!
$mysqli->query("CREATE TABLE test(id INT)") ||
!
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)")) {
echo
"Falló la creación de la tabla: (" . $mysqli->errno . ") " . $mysqli->error;
}

$resultado = $mysqli->query("SELECT id FROM test ORDER BY id ASC");

echo
"Orden inverso...\n";
for (
$num_fila = $resultado->num_rows - 1; $num_fila >= 0; $num_fila--) {
$resultado->data_seek($num_fila);
$fila = $resultado->fetch_assoc();
echo
" id = " . $fila['id'] . "\n";
}

echo
"Orden del conjunto de resultados...\n";
$resultado->data_seek(0);
while (
$fila = $resultado->fetch_assoc()) {
echo
" id = " . $fila['id'] . "\n";
}
?>

El resultado del ejemplo sería:

Orden inverso...
 id = 3
 id = 2
 id = 1
Orden del conjunto de resultados...
 id = 1
 id = 2
 id = 3

Conjuntos de resultados no almacenados en buffer

Si la memoria del cliente es un recurso escaso y no es necesaria la liberación de recursos del servidor tan pronto como sea posible para mantener la carga del servidor baja, se pueden usar conjuntos de resultados no almacenados en buffer. Recorrer resultados no almacenados en buffer no es posible antes de que todas las filas hayan sido leídas.

Ejemplo #3 Navegación a través de resultados no almacenados en buffer

<?php
$mysqli
->real_query("SELECT id FROM test ORDER BY id ASC");
$resultado = $mysqli->use_result();

echo
"Orden del conjunto de resultados...\n";
while (
$fila = $resultado->fetch_assoc()) {
echo
" id = " . $fila['id'] . "\n";
}
?>

Tipos de datos de los valores del conjunto de resultados

Las funciones mysqli_query(), mysqli_real_query() y mysqli_multi_query() se usan para ejecutar sentencias no preparadas. Al nivel del Protocolo Cliente Servidor de MySQL, el comando COM_QUERY y el protocolo de texto se usan para la ejecución de sentencias. Con el protocolo texto, el servidor MySQL convierte todos los datos de los conjuntos de resultados en cadenas antes de enviarlos. Esta conversión se realiza sin considerar el tipo de datos de las columnas del conjunto de resultados SQL. Las bibliotecas cliente de mysql reciben todos los valores de las columnas como cadenas. No se realiza ninguna conversión del lado del cliente pava volver a convertir las columnas a susu tipos nativos. En su lugar, todos los valores son proporcionados como cadenas de PHP.

Ejemplo #4 El protocolo de texto devuelve cadenas de manera predeterminado

<?php
$mysqli
= new mysqli("ejemplo.com", "usuario", "contraseña", "basedatos");
if (
$mysqli->connect_errno) {
echo
"Falló la conexión a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!
$mysqli->query("DROP TABLE IF EXISTS test") ||
!
$mysqli->query("CREATE TABLE test(id INT, etiqueta CHAR(1))") ||
!
$mysqli->query("INSERT INTO test(id, etiqueta) VALUES (1, 'a')")) {
echo
"Falló la creación de la tabla: (" . $mysqli->errno . ") " . $mysqli->error;
}

$resultado = $mysqli->query("SELECT id, etiqueta FROM test WHERE id = 1");
$fila = $resultado->fetch_assoc();

printf("id = %s (%s)\n", $fila['id'], gettype($fila['id']));
printf("etiqueta = %s (%s)\n", $fila['etiqueta'], gettype($fila['etiqueta']));
?>

El resultado del ejemplo sería:

id = 1 (string)
etiqueta = a (string)

Es posible convertir valores de columnas de tipo integer y float a números de PHP estableciendo la opción de conexión MYSQLI_OPT_INT_AND_FLOAT_NATIVE, si se esta´utilizando la biblioteca mysqlnd. Si se establece, la biblioteca mysqlnd comprobará los tipos de columna de los metadatos del conjunto de resultados y convertirá las columnas númerocas de SQL a números de PHP, si el rango de valores del tipo de datos de PHP lo permite. De esta forma, por ejemplo, las columnas INT de SQL son devueltas como enteros.

Ejemplo #5 Tipos de datos nativos con mysqlnd y la opción de conexión

<?php
$mysqli
= mysqli_init();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("ejemplo.com", "user", "contraseña", "basedatos");

if (
$mysqli->connect_errno) {
echo
"Falló la conexión a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!
$mysqli->query("DROP TABLE IF EXISTS test") ||
!
$mysqli->query("CREATE TABLE test(id INT, etiqueta CHAR(1))") ||
!
$mysqli->query("INSERT INTO test(id, etiqueta) VALUES (1, 'a')")) {
echo
"Falló la creación de la tabla: (" . $mysqli->errno . ") " . $mysqli->error;
}

$resultado = $mysqli->query("SELECT id, etiqueta FROM test WHERE id = 1");
$fila = $resultado->fetch_assoc();

printf("id = %s (%s)\n", $fila['id'], gettype($fila['id']));
printf("etiqueta = %s (%s)\n", $fila['etiqueta'], gettype($fila['etiqueta']));
?>

El resultado del ejemplo sería:

id = 1 (integer)
etiqueta = a (string)

Véase también

add a note add a note

User Contributed Notes 1 note

up
-50
developer at 4seasonsconsulting dot com
11 years ago
When accessing columns of type ENUM or SET, your results may not always come back as expected. Given:

SQL:
CREATE TABLE `items` (
  `item_key` char(4) NOT NULL DEFAULT 'xxxx',
  `item_id` smallint(5) unsigned NOT NULL,
  `item_media` enum('pdf','tape','cd','dvd','mp3','mp4')  NOT NULL DEFAULT 'mp3',
  `item_file` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`item_key`,`item_id`,`item_media`)
) ENGINE=MyISAM;

INSERT INTO `items` (`item_key`, `item_id`, `item_media`) VALUES
('A1B2', 1, 'mp3'),
('A1B2', 2, 'mp4'),
('A1B2', 3, 'pdf'),
('A1B2', 4, 'dvd'),
('A1B2', 5, 'mp3');

<?php
...
$result = mysql_query("SELECT `item_id`, `item_media`+0 FROM `items`
WHERE `item_key`='A1B2' ORDER BY `item_media`"
;
while (
$row = mysql_fetch_array($result) )
echo
'id=' . $row[0] . ', media=' . $row[1] . "\r\n";
...
?>

When just the query is run in phpMyAdmin,
you most likely will get:

id=3, media=1
id=4, media=4
id=1, media=5
id=5, media=5
id=2, media=6

but php will give you:

id=1, media=0
id=2, media=0
id=3, media=0
id=4, media=0
id=5, media=0

This is because the translation of <enum or set>+0
is evaluated as a string (converted to zero)+0,

This does need further research for a fix.
To Top