obtener una serie de filas con el resultado de mysqli
Necesito obtener todas las filas del objeto de resultado. Estoy intentando crear una nueva matriz que contenga todas las filas.
Aquí está mi código:
$sql = new mysqli($config['host'],$config['user'],$config['pass'],$config['db_name']);
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT domain FROM services";
$result = $sql->query($query);
while($row = $result->fetch_row());
{
$rows[]=$row;
}
$result->close();
$sql->close();
return $rows;
$rows
se supone que es la nueva matriz que contiene todas las filas, pero en su lugar obtengo una matriz vacía.
¿Alguna idea de por qué sucede esto?
Tuviste un pequeño problema de sintaxis, es decir, un punto y coma erróneo.
while($row = $result->fetch_row());
¿Notas el punto y coma al final? Significa que el siguiente bloque no se ejecutó en un bucle. Deshazte de eso y debería funcionar.
Además, es posible que desees pedirle a mysqli que informe todos los problemas que encontró:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$sql = new mysqli($config['host'], $config['user'], $config['pass'], $config['db_name']);
$query = "SELECT domain FROM services";
$result = $sql->query($query);
$rows = [];
while($row = $result->fetch_row()) {
$rows[] = $row;
}
return $rows;
Las versiones más recientes de mysqli tienen algunas mejoras que pueden simplificar dicha tarea.
En primer lugar, hay una función útil para devolver una matriz con todas las filas devueltas por una consulta.
Esto significa que, en caso de que necesite una matriz enumerada simple, el código sería mucho más simple:mysqli_fetch_all()
$query = "SELECT domain FROM services";
$result = $sql->query($query);
return $result->fetch_all(MYSQLI_ASSOC);
o incluso todo en una sola línea,
return $sql->query("SELECT domain FROM services")->fetch_all(MYSQLI_ASSOC);
Sin embargo, si necesita utilizar alguna columna para indexar la matriz resultante, aún necesitará un bucle while como este:
$query = "SELECT id, domain FROM services";
$result = $sql->query($query);
$data = [];
while ($row = $result->fetch_assoc()) {
$data[$row['id']] = $row;
}
Tenga en cuenta que siempre debe inicializar una matriz antes de llenarla, porque dicha variable podría ya existir.
Además, mysqli_result
la clase ahora es transitable. Significa que puedes usarlo en el bucle foreach de inmediato, como si fuera una matriz que contenga todas las filas de la base de datos:
$query = "SELECT domain FROM services";
$result = $sql->query($query);
foreach ($result as $row) {
echo $row['domain'];
}
Pero en realidad es solo un azúcar de sintaxis para el bucle while: no puede acceder a los valores de esta "matriz" directamente, lo que hace que esta característica sea de poca utilidad en realidad.
Notas obligatorias.
Esta pregunta tiene una década, y la forma en que se establece una conexión y se realiza la consulta, tanto en la pregunta como en la respuesta aceptada, está obsoleta y está mal vista hoy en día.
Cuando se establece una conexión, hay varias cosas a tener en cuenta. Escribí un artículo sobre cómo conectarme correctamente con mysqli que proporciona un ejemplo de conexión correcta haciendo hincapié en los siguientes temas:
- Se debe configurar un modo de informe de errores adecuado.
- se debe establecer un juego de caracteres adecuado
- Nunca se debe utilizar ningún código de informe de errores manual
die(mysqli_connect_error())
(como ) - una conexión debe realizarse solo una vez , en un archivo separado, y luego incluirse en cada script que necesite una interacción con la base de datos. en caso de que se utilice un código de base de datos en una función, se debe pasar una variable de conexión como parámetro de función.
Cuando se trata de ejecutar una consulta, también hay varias cosas a tener en cuenta:
- Cuando se utiliza incluso una sola variable en la consulta, se debe utilizar una declaración preparada en lugar de
mysqli_query()
- como resultado,
mysqli_stmt_get_result()
se debe utilizar una función especial llamada para utilizar funciones de recuperación familiares para obtener las filas resultantes. En caso de que esta función no esté disponible, probablemente debas marcar alguna casilla de verificación en tu cpanel (busca una etiquetadamysqlnd
). - Dada una declaración preparada con mysqli, aunque es obligatoria, requiere mucho código para escribir, se recomienda utilizar una función auxiliar para mysqli que realizaría la mayor parte del trabajo automáticamente y haría que una declaración preparada con mysqli fuera tan fluida como una consulta normal.
- Nunca se debe utilizar ningún código de informe de errores manual
die(mysqli_error())
(como ). Gracias al modo de error adecuado, mysqli informará todos los errores automáticamente.