Query=>Array=>Output = PHP Advertencia: tipo de desplazamiento ilegal

Query=>Array=>Output = PHP Advertencia: tipo de desplazamiento ilegal

Intento seleccionar datos mysql, guardarlos en una matriz bidimensional y generar los datos. Recibo el mensaje de error mencionado anteriormente para cada columna y fila.

¿Podría alguien señalar mi error? ¿Cómo puedo hacer que funcione?

Este es el código:

// connect database
    $db_connection = new mysqli (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);

    // execute query 
    $query_result = $db_connection->query($sql_career);

    // save carrer data
    while( $row = $query_result->fetch_assoc() )
    {
        $career[]['id'] = $row['career_id'];
        $career[]['season'] = $row['career_season'];
        $career[]['matches'] = $row['career_matches'];
        $career[]['goals'] = $row['career_goals'];
        $career[]['team_name'] = $row['career_team_name'];
    }

    // output
    echo '<table border="1">';
    foreach ($career as $i)
    {
      echo "<tr>";
      echo "<td>". $career[$i]['id'] . "</td>";
      echo "<td>". $career[$i]['season'] . "</td>";
      echo "<td>". $career[$i]['team_name'] . "</td>";
      echo "<td>". $career[$i]['matches'] . "</td>";
      echo "<td>". $career[$i]['goals'] . "</td>";
      echo "</tr>";
    }
    echo "</table>";
Mostrar la mejor respuesta

El error es hacer dos bucles. No.

Cada [] en su while loop crea un nuevo índice de matriz. Para mantener cada registro en el mismo índice de matriz, use una variable incremental, como en - $career[$i]['id'];, luego haga $i++; antes del final de cada iteración.

Solo reemplaza este código,

Ya habías usado foreach , que dio la matriz actual.

foreach ($career as $i)
    {
      echo "<tr>";
      echo "<td>". $i['id'] . "</td>";
      echo "<td>". $i['season'] . "</td>";
      echo "<td>". $i['team_name'] . "</td>";
      echo "<td>". $i['matches'] . "</td>";
      echo "<td>". $i['goals'] . "</td>";
      echo "</tr>";
    }

La eliminación de "carrera" dentro del ciclo funcionó. Recibí un mensaje de error porque faltaba el índice, pero pude resolverlo con un contador adicional como el propuesto por Karlo Kokkak.

Puedes probar este...

while( $row = $query_result->fetch_assoc() )
{
    $career[] = $row;
}

// output
echo '<table border="1">';
foreach ($career as $i)
{
  echo "<tr>";
  echo "<td>". $i['id'] . "</td>";
  echo "<td>". $i['season'] . "</td>";
  echo "<td>". $i['team_name'] . "</td>";
  echo "<td>". $i['matches'] . "</td>";
  echo "<td>". $i['goals'] . "</td>";
  echo "</tr>";
}
echo "</table>";

matriz multidimensional de $carrera

Pero no es un requisito de multidimensional.

Buen consejo para almacenar la matriz completa en una línea. Quiero mantener la opción de usar diferentes nombres de variables, pero lo tendré en cuenta.

@Christian puede usar alias en su consulta para administrar eso. Escribe alias con AS.

@DilipSolanki Debe ajustar el nombre de su clave para que se adapte a los nombres de las columnas del conjunto de resultados.

Si tiene una consulta exitosa con filas, implosione las filas y haga un bucle solo una vez.

if (!$query_result = $db_connection->query($sql_career)) {
    // check error
} elseif (!$query_result->num_rows) {
    // no rows
} else {
    echo '<table border="1">';

        // I assume you have column headings in mind, add them here

        while($row = $query_result->fetch_assoc()) {
            echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
        }
    echo "</table>";
}

O si tiene un requisito real para almacenar el conjunto de resultados como una matriz multidimensional, puede usar Comentario más votado de Miller en el manual.

for ($set = array (); $row = $query_result->fetch_assoc(); $set[] = $row);

De la línea anterior, puede aplicar la misma lógica de "bucle e implosión" como esta:

if (sizeof($set)) {
    echo '<table border="1">';
        foreach ($set as $row) {
            echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
        }
    echo "</table>";
}

O puedes escribirlo todo:

echo '<table border="1">';
    foreach ($set as $row){
        echo "<tr>";
            echo "<td>{$row['career_id']}</td>";
            echo "<td>{$row['career_season']}</td>";
            echo "<td>{$row['career_team_name']}</td>";
            echo "<td>{$row['career_matches']}</td>";
            echo "<td>{$row['career_goals']}</td>";
        echo "</tr>";
    }
echo "</table>";

Y si desea manipular las claves asociativas por adelantado, puede ajustar su cláusula SELECT como:

SELECT career_id AS 'id', career_season as 'season', career_team_name AS 'team_name', career_matches AS 'matches', career_goals AS 'goals' FROM ...

Esta es mi solución preferida. Verifique mi respuesta a continuación para ver cómo me di cuenta en mi propio código.

Si bien esta no es la mejor práctica, resuelve el problema de advertencia que era mi pregunta original.

// save carrer data
$row_counter = 0;
while( $row = $query_result->fetch_assoc() )
{
    $row_counter++;
    $career[$row_counter]['id'] = $row['career_id'];
    $career[$row_counter]['season'] = $row['career_season'];
    $career[$row_counter]['matches'] = $row['career_matches'];
    $career[$row_counter]['goals'] = $row['career_goals'];
    $career[$row_counter]['team_name'] = $row['career_team_name'];
}

// output
echo '<table border="1">';
foreach ($career as $i)
{
  echo "<tr>";
  echo "<td>". $i['id'] . "</td>";
  echo "<td>". $i['season'] . "</td>";
  echo "<td>". $i['team_name'] . "</td>";
  echo "<td>". $i['matches'] . "</td>";
  echo "<td>". $i['goals'] . "</td>";
  echo "</tr>";
}
echo "</table>";

Después de algunas pruebas adicionales con la propuesta de @mickmackusa, llegué a la siguiente solución. La función de salida es solo para probar. El enfoque principal es preparar y proporcionar los datos para un uso posterior.

function get_career($player_id) {

    // sql placeholder to save code here
    $sql_career = "...";

    // connect database
    $db_connection = new mysqli (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);

    if (!$query_result = $db_connection->query($sql_career)) {
        // check error
    } elseif (!$query_result->num_rows) {
        // no rows
    } else {
        for (
            $career = array (); 
            $row = $query_result->fetch_assoc(); 
            $career[] = $row);
    }

    return $career;     

} // function end

function output_career($player_id) {

    // function call, get career data
    $career = get_career($player_id);

    // output
    echo '<table border="1">';
    foreach ($career as $career)
    {
      echo "<tr>";
      echo "<td>". $career['id'] . "</td>";
      echo "<td>". $career['season'] . "</td>";
      echo "<td>". $career['team_id'] . "</td>";
      echo "<td>". $career['team_name'] . "</td>";
      echo "<td>". $career['country_name'] . "</td>";
      echo "<td>". $career['country_abbreviation'] . "</td>";
      echo "<td>". $career['league_name'] . "</td>";
      echo "<td>". $career['matches'] . "</td>";
      echo "<td>". $career['goals'] . "</td>";
      echo "<td>". $career['status_name'] . "</td>";
      echo "</tr>";
    }
    echo "</table>";

} // function end

No completamente. ¿Usted genera directamente el resultado de la consulta? ¿Cómo se hace el orden de las columnas? En mi pregunta puse todo junto para hacer la pregunta más simple. En mi aplicación, solo tengo el procesamiento de datos en mis archivos modelo y quiero preparar los datos para un uso posterior. Pero no estoy seguro si eso hace la diferencia.

El orden de las columnas está dictado por el orden de las columnas SELECCIONAR de su consulta. Cómo escribes tu cláusula SELECT es cómo la obtienes. Si necesita almacenar el conjunto de resultados como una matriz multidimensional, eso es lo que hace mi bucle for y eso es lo que $set está en mi fragmento inferior.

¡Entendido! Mis ejemplos de código anteriores están simplificados y no dan exactamente lo que pretendo hacer en la aplicación. Solo intenté entender por qué la matriz no funcionó. Soy un novato de PHP y estoy agradecido por todos los consejos y los probaré para mejorar la forma en que manejo el procesamiento de datos.

Realmente aprecio tus esfuerzos. Todavía no estoy lo suficientemente lejos como para hacer una pregunta, aún trato de entender qué sucede y cómo puedo usarlo para mejorar mi código. Por favor, dame un poco de tiempo, te informaré. Ty!

@mickmackusa: su ejemplo funciona bien, consulte el código anterior. Pero me pregunto cuál es la diferencia entre "for ($carrera = matriz (); $fila = $resultado_consulta->fetch_assoc(); $carrera[] = $fila);" y la variante anterior "while( $fila = $resultado_consulta->fetch_assoc() ) {$carrera[] = $fila;}"

Esas dos variaciones proporcionan la misma salida usando diferentes sintaxis. El del manual está escrito con sensatez como una sola línea (a algunos desarrolladores les encantan las líneas compactas). El otro es más de 3 líneas.