2

我正在使用数据库中的条目来填充表中的一行和一列。但是我不能使用两次访问 SQL 返回的数据mysqli_fetch_array()两次。我需要多次循环 mysqli 结果。这不起作用:

//Copy the result
$db_res = mysqli_query( $db_link, $sql );
$db_res2=$db_res;

//Top row
while ($row = mysqli_fetch_array( $db_res, MYSQL_ASSOC))
{
        echo "<td>". $row['Title'] . "</td>";
}

//leftmost column
while ($row = mysqli_fetch_array( $db_res2, MYSQL_ASSOC))
{
                    echo "<tr>";
        echo "<td>". $row['Title'] . "</td>";
                    .....
                    echo "</tr>";
}

我怎样才能mysqli_fetch_array对相同的结果申请两次?

4

4 回答 4

12

您应该始终将数据操作与输出分开。

首先选择您的数据:

$db_res = mysqli_query( $db_link, $sql );
$data   = array();
while ($row = mysqli_fetch_assoc($db_res))
{
    $data[] = $row;
}

请注意,从 PHP 5.3 开始,您可以使用fetch_all()而不是显式循环:

$db_res = mysqli_query( $db_link, $sql );
$data   = $db_res->fetch_all(MYSQLI_ASSOC);

然后根据需要多次使用它:

//Top row
foreach ($data as $row)
{
    echo "<td>". $row['Title'] . "</td>";
}

//leftmost column
foreach ($data as $row)
{
    echo "<tr>";
    echo "<td>". $row['Title'] . "</td>";
    .....
    echo "</tr>";
}
于 2013-09-10T13:44:47.753 回答
10

是的。mysqli_fetch_array()每次调用时指针都会向前移动。您需要mysqli_data_seek()将指针设置回起点,然后mysqli_fetch_array()再次调用。

因此,在第二次调用该函数之前,请执行以下操作:

mysqli_data_seek($db_res, 0);
于 2013-09-10T13:43:02.503 回答
1

你不需要while循环,你根本不需要使用mysqli_fetch_array()

您可以简单地循环mysqli_result对象本身多次。它实现Traversable了允许它在foreach.

//Top row
foreach($db_res as $row) {
    echo "<td>". $row['Title'] . "</td>";
}

//leftmost column
foreach($db_res as $row) {
    echo "<tr>";
    echo "<td>". $row['Title'] . "</td>";
    .....
    echo "</tr>";
}

但是,您应该将您的数据库逻辑与您的显示逻辑分开,为了实现这一点,最好fetch_all(MYSQLI_ASSOC)在您的数据库逻辑中使用将所有记录检索到一个数组中。

如果您将所有数据提取到一个数组中,您可以根据需要多次循环该数组。

$data = $db_res->fetch_all(MYSQLI_ASSOC);

foreach($data as $row) {
    // logic here...
}
于 2020-04-03T18:35:53.230 回答
0
$squery = mysqli_query($con,"SELECT * FROM table");

while($s = mysqli_fetch_array($query)){
 ....
}
// add this line
mysqli_data_seek( $query, 0 );

while($r = mysqli_fetch_array($query)){
 ...
}

试试看.....

于 2013-09-10T13:52:14.040 回答