1

Ayuda, debe ser simple pero nunca he realizado algo así y no encuentro documentación de como hacerlo

Tengo un query al cual saco 3 filas aleatorias ejemplo

SELECT * from tabla ORDER by rand() LIMIT 3

Ahora busco en php tomar las 3 filas de datos y almacenarlas en variables, no use un WHILE porque no se como podria tomar la fila despues de ejecutarlo

while ($result = $query ->fetch_object()) {
$variableid =$result->id            //Esto haria que los datos se sobrescribieran y no podria llamarlos despues
$variablenombre =$result->nombre 
}

//Como guardo las tres filas separadas para poder manipularlas a gusto?

Si aun no se logra entender bien lo que busco es tener en variables diferentes y separadas los datos de la fila1 - fila2 y fila3. Pense usar tres consultas independientes, pero esta el tema que al tomar una fila aleatoria podría repetirse la fila entre las consultas y no quiero eso.

De antemano gracias

  • Vas bien así, pero puedes usar otro método `fetch` que te cree una array asociativo con los datos, dentro del `while` llenas el array y luego lo lees donde lo necesites, es la forma en que se suele hacer en estos casos. Una aclaración: esto sólo sería útil en caso de necesitar la información **fuera de ese contexto**, si es para ese mismo contexto lo lógico es imprimirlo con `echo` o ir concatenando datos dentro del `while`. – A. Cedano Jan 30 '19 at 01:49
  • 1
    Sería algo así: `while ($result = $query ->fetch_assoc()) { $arrDatos[] =$result; }` Hacemos una prueba del resultado: `var_dump($arrDatos);` El código meterá en `$arrDatos` todos los resultados ordenados en un array. Para leerlo luego: `foreach ($arrDatos as $row) {echo $row["columna"].PHP_EOL;}` – A. Cedano Jan 30 '19 at 01:56
  • Recomendado: https://www.tutorialspoint.com/php/php_and_mysql.htm – fredyfx Jan 30 '19 at 02:46
  • Como seria el codigo para obtener un dato preciso del array al que apunto? veo que usando foreach ($rows as $row) {echo $row["modelo"].PHP_EOL;} obtengo como resultado los 3 datos juntos – Sebastian Ismael Jan 30 '19 at 04:16

3 Answers3

1

Podes hacerlo de la siguiente manera

$data = [];
while ($result = $query ->fetch_object()) {
  $data[] = [
     'id' => $result->id,
     'nombre' => $result->nombre 
  ];
}
  • 1
    responder con solo código se considera de baja calidad, no es solo poner ese fragmento y ya, debes explicar donde usarlo y el por que –  Jan 30 '19 at 20:32
0

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:

  1. Fila por fila, aplicando uno de los métodos fetch_* existentes
  2. 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

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
0

Tienes una opción directa desde MYSQL y PHP que es convertir lo que has leido de MySQL en array para recorerlo tantas veces como necesites:

$array_de_filas = mysqli_fetch_array($query, MYSQLI_ASSOC);
O
$array_de_filas = $query->fetch_array(MYSQLI_ASSOC);

// Después simplemente puedes recorer el array con:

foreach($array_de_filas AS $numero_fila => $fila) {
    // Incluso puedes recorer cada uno de los campos de la fila
    foreach($fila AS $campo => $valor_campo) {
        // Colocas el valor o el campo donde quieras
    }
}

Espero que te sirva.

Pau Vidal
  • 28
  • 3