Debo admitir, mysqli_query()
la entrada manual no contiene un ejemplo limpio sobre cómo obtener varias filas. Puede ser porque la rutina es tan rutinaria, conocida por la gente de PHP durante décadas:
$result = $link->query("DESCRIBE students");
while ($row = $result->fetch_assoc()) {
// to print all columns automatically:
foreach ($row as $value) {
echo "<td>$value</td>";
// OR to print each column separately:
echo "<td>",$row['Field'],"</td><td>",$row['Type'],"</td>\n";
}
}
En caso de que desee imprimir los títulos de las columnas, primero debe seleccionar sus datos en una matriz anidada y luego usar las teclas de la primera fila:
// getting all the rows from the query
// note that handy feature of OOP syntax
$data = $link->query("DESC students")->fetch_all(MYSQLI_ASSOC);
// getting keys from the first row
$header = array_keys(reset($data));
// printing them
foreach ($header as $value) {
echo "<td>$value</td>";
}
// finally printing the data
foreach ($data as $row) {
foreach ($row as $value) {
echo "<td>$value</td>";
}
}
Es posible que algunos hosts no admitan fetch_all()
función. En tal caso, complete el $data
matriz de la forma habitual:
$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
$data[] = $row;
}
Dos notas importantes que debo añadir.
-
Debe configurar mysqli para arrojar errores automáticamente en lugar de verificarlos manualmente para cada declaración de mysqli. Para hacerlo, agregue esta línea antes
mysqli_connect()
:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
-
La nota más importante: a diferencia de
mysql_query()
,mysqli_query()
tiene un uso muy limitado. Puede usar esta función solo si no se van a usar variables en la consulta. Si se va a usar alguna variable de PHP, nunca debe usarmysqli_query()
, pero siempre apéguese a declaraciones preparadas , así:$stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?"); $stmt->bind_param('i', $class); $stmt->execute(); $data = $stmt->get_result()->fetch_all();
Es un poco prolijo, tengo que admitirlo. Para reducir la cantidad de código, puede usar PDO o adoptar una función auxiliar simple para hacer todo el trabajo de preparación/vinculación/ejecución dentro:
$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();