query
En este artículo se explica la función mysqli_query() en PHP para ejecutar sentencias SQL contra una base de datos MySQL.
$mysqli->query() ejecuta una única sentencia SQL contra una base de datos MySQL a través de una conexión MySQLi abierta. Es la forma más sencilla de comunicarse con MySQL desde PHP, por lo que es el punto de partida ideal — aunque, como verás a continuación, en el momento en que tu consulta contenga datos del usuario deberías usar sentencias preparadas en su lugar.
Esta página explica qué devuelve query(), cómo leer un conjunto de resultados, cómo se comporta en consultas de escritura y la trampa de la inyección SQL que debes evitar.
Sintaxis
// Object-oriented style
$result = $mysqli->query($sql);
// Procedural style
$result = mysqli_query($mysqli, $sql);Ambas formas hacen lo mismo; el estilo orientado a objetos se utiliza a lo largo de esta página.
Qué devuelve query()
El valor de retorno depende del tipo de sentencia que ejecutes:
| Tipo de consulta | En caso de éxito | En caso de fallo |
|---|---|---|
SELECT, SHOW, DESCRIBE, EXPLAIN | un objeto mysqli_result | false |
INSERT, UPDATE, DELETE, CREATE, ... | true | false |
Como el fallo siempre devuelve false, puedes ramificar según el valor de retorno con un simple if. Nunca asumas que una consulta tuvo éxito — un nombre de columna mal escrito o una tabla inexistente devuelven false.
Ejecutar una consulta SELECT
Para un SELECT, itera sobre el resultado devuelto y obtén cada fila con fetch_assoc() (o fetch_array()), y luego libera el resultado cuando hayas terminado:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// Stop early if the connection failed.
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$result = $mysqli->query("SELECT id, name FROM users");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo $row["id"] . ": " . $row["name"] . "\n";
}
$result->free(); // release the result set's memory
} else {
echo "Query failed: " . $mysqli->error;
}
$mysqli->close();
?>El bucle while termina cuando fetch_assoc() devuelve null (no hay más filas). $result->free() libera el conjunto de resultados, lo que importa en scripts de larga ejecución que lanzan muchas consultas.
Ejecutar INSERT, UPDATE y DELETE
Las consultas de escritura no devuelven un conjunto de resultados — devuelven true en caso de éxito. Para saber cuántas filas fueron afectadas, lee $mysqli->affected_rows; para obtener el id auto-incrementado de una fila recién insertada, lee $mysqli->insert_id:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->query("UPDATE users SET active = 1 WHERE active = 0")) {
echo $mysqli->affected_rows . " rows updated";
} else {
echo "Query failed: " . $mysqli->error;
}
$mysqli->close();
?>Nunca insertes datos del usuario directamente en una consulta
query() recibe una cadena SQL sin procesar, por lo que concatenar datos del usuario en ella abre la puerta a la inyección SQL — el fallo de seguridad de bases de datos más común en la web:
// DANGEROUS — do NOT do this
$id = $_GET['id'];
$result = $mysqli->query("SELECT * FROM users WHERE id = $id");Si un visitante envía id=0 OR 1=1, esa consulta devuelve todos los usuarios. La solución es una sentencia preparada, que envía el SQL y los valores por separado para que los valores nunca puedan interpretarse como SQL:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $_GET['id']); // "i" = integer
$stmt->execute();
$result = $stmt->get_result();Usa query() solo para SQL fijo sin datos del usuario; usa sentencias preparadas para todo lo que contenga valores que provengan del exterior de tu código. Consulta sentencias preparadas de MySQL para un recorrido completo.
Resumen
$mysqli->query()ejecuta una sentencia SQL en una conexión MySQLi abierta.- Un
SELECTdevuelve unmysqli_resultque puedes iterar confetch_assoc(); otras sentencias devuelventrue; cualquier fallo devuelvefalse. - Lee
affected_rowsdespués de una escritura, einsert_iddespués de unINSERT. - Cambia a sentencias preparadas en el momento en que intervienen datos del usuario.