W3docs

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 consultaEn caso de éxitoEn caso de fallo
SELECT, SHOW, DESCRIBE, EXPLAINun objeto mysqli_resultfalse
INSERT, UPDATE, DELETE, CREATE, ...truefalse

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 SELECT devuelve un mysqli_result que puedes iterar con fetch_assoc(); otras sentencias devuelven true; cualquier fallo devuelve false.
  • Lee affected_rows después de una escritura, e insert_id después de un INSERT.
  • Cambia a sentencias preparadas en el momento en que intervienen datos del usuario.

Práctica

Práctica
¿Qué devuelve $mysqli->query() para una sentencia SELECT exitosa?
¿Qué devuelve $mysqli->query() para una sentencia SELECT exitosa?
Was this page helpful?