我怎么能两次使用mysqli_fetch_array()?

时间:2013-09-10 13:40:16

标签: php sql pointers mysqli

我正在使用db的条目来填充表中的行和列。但我无法使用mysqli_fetch_array()两次访问SQL返回的数据两次。这不起作用:

//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两次?

5 个答案:

答案 0 :(得分:8)

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

首先选择您的数据:

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

请注意,在最近的PHP版本中,您可以使用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>";
}

答案 1 :(得分:2)

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

所以在第二次调用函数之前,请执行:

mysqli_data_seek($db_res, 0);

答案 2 :(得分:1)

您完全不需要while循环,也不需要使用mysqli_fetch_array()

您可以简单地在mysqli_result对象本身上循环多次。

//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)将所有记录检索到一个数组中。

答案 3 :(得分:0)

是的。我有同样的问题并使用了

mysqli_data_seek($db_res, 0);

两个之间

mysqli_fetch_row();

while 循环和第二个 while 循环与第一个一样完美地工作。

答案 4 :(得分:-2)

$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)){
 ...
}
试试吧.....