为什么foreach从查询结果中跳过2行?

For 10 rows in the query it only returns 8 rows but i get the fields right:

For Query data which returns less than 2 rows I get an error.

//create table to display all data
echo "<table border="1"> ";
echo "<tr>";
$row = mysqli_fetch_assoc($result);
    foreach($row as $key => $value) 
        {
            echo "<th>$key</th>";
        }
echo "</tr>";

while (($row = $result->fetch_assoc()) !== null) 
{
  $output = array();
  $i=1;

  echo "<tr>";

    foreach ($row as $columnName => $columnValue) 
        {
            $output[] = $columnName."=>". $columnValue;
            echo "<td>".$columnValue."</td>";
        }

  echo "</tr>";
}
echo "</table>";

Edit: Thanks to @Michael Berkowski for his comments on the question.


Here is a modified version of your code that should work:

//create table to display all data
echo "<table border=1 >";
echo "<tr>";
//echo "<th> ## </th>";

$row = $result->fetch_assoc();  // stick to the object-oriented form. It is cleaner.
foreach ($row as $key => $value) 
{
    echo "<th>$key</th>";
}
echo "</tr>";

do
{
    $output = array();
    echo "<tr>";
    foreach ($row as $columnName => $columnValue) 
    {
        $output[$columnName] = $columnValue;  // this is neater.
        echo "<td>" . $columnValue . "</td>";
    }
    echo "</tr>";
} while ($row = $result->fetch_assoc());

echo "</table>";

You can use your first foreach() loop to print the keys and then use a do-while() loop to get your desired output.

Additional reading:

You need to use

mysqli_fetch_assoc($result);