Cuando se consulta a la base de datos con APIs como mysqli
o PDO
, lo que recibimos es una referencia al conjunto de resultados, algo así como un puntero el cual puede ser leído de dos formas:
- Fila por fila, aplicando uno de los métodos
fetch_*
existentes
- Todo de golpe, aplicando el método
fetch_all
(mysqli) o fetchAll
(PDO)
La forma más común es la primera, sobre todo porque si la consulta trae demasiados datos y se intenta traerlos todos de golpe podría haber problemas de memoria.
Si los datos vienen en un puntero, significa que hay que ir moviendo el puntero, para ir desgranando los datos fila por fila, por eso siempre vemos un estilo como este cuando se leen los datos:
while ($result = $query ->fetch_object()) {
//Mostrar cada dato o guardarlo
}
Tanto en mysqli como en PDO hay varios métodos fetch_*
, es importante siempre usar el más adecuado según lo que necesitemos.
Para tu caso, lo más conveniente sería utilizar el método fetch_assoc
, el cual crea por cada fila obtenida un arreglo asociativo cuya clave es el nombre de la columna y el valor el dato que tenga esa columna. De ese modo, al llenar el arreglo no habría que poner de forma explícita cada nombre de columna, sino que se hace de forma automática.
Por ejemplo:
Supongamos que tu consulta selecciona dos columnas:
SELECT colOne, colTwo from tabla ORDER by rand() LIMIT 3
Podemos llenar un $arrDatos
de forma automática haciendo esto:
while ($result = $query->fetch_assoc()) {
$arrDatos[] =$result;
}
Luego, si quieres obtener un dato en específico puedes hacer esto:
echo $arrDatos[0]["colOne"]; //Valor de la columna "colOne" en la 1ª fila
echo $arrDatos[2]["colTwo"]; //Valor de la columna "colTwo" en la 3ª fila
Si quieres guardar cada dato en variables como dices en la pregunta:
$colOne_row1=$arrDatos[0]["colOne"];
$colTwo_row1=$arrDatos[0]["colTwo"];
# ... etc
$colOne_row3=$arrDatos[2]["colOne"];
$colTwo_row3=$arrDatos[2]["colTwo"];
Aquí, el número entre []
representa la fila del array que se ha creado a partir de los resultados. ¿Por qué para acceder a la 1ª fila tengo que poner [0]
y no [1]
? Por una razón muy simple: los índices de los arreglos en PHP empiezan por 0
, por tanto un arreglo que guarde tres filas de resultados empezará por 0
y terminará por 2
.
NOTA:
Puedes hacer esto con cualquier otro de los métodos fetch_*
que
existen, pero siempre es importante usar métodos que automaticen el
trabajo lo más posible y que en la lectura sepas lo que estás
obteniendo por su nombre. Existe por ejemplo un método fetch_row
que
haría que la obtención sea algo así: echo $arrDatos[0][0];
en un
programa grande, cuando tengas millones de líneas de código y entre
ellas veas algo como $arrDatos[0][0]
no tendrás ni idea de lo que
representa.
Referencias
Si estás empezando con mysqli
recomiendo que leas estas preguntas y sus respuestas para entender mejor los métodos fetch