【问题标题】:How can I use mysqli_fetch_array() twice?如何使用 mysqli_fetch_array() 两次?
【发布时间】:2013-09-14 06:15:05
【问题描述】:

我正在使用数据库中的条目来填充表格中的一行和一列。但是我无法使用mysqli_fetch_array() 两次访问 SQL 返回的数据。我需要多次循环 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

【问题讨论】:

    标签: php mysql mysqli mysqli-fetch-array


    【解决方案1】:

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

    首先选择您的数据:

    $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>";
    }
    

    【讨论】:

    • 只要不使用mysqli_free_result(),此解决方案只会使查询使用的内存增加一倍。
    【解决方案2】:

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

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

    mysqli_data_seek($db_res, 0);
    

    【讨论】:

    • 当您调用mysqli_data_seek($db_res, 0); 同时仍在循环遍历结果时,答案可能会出现问题。然后它将“永远”运行。
    • @powtac 他们没有把它放在循环中,而是放在它之后。
    【解决方案3】:

    您不需要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...
    }
    

    【讨论】:

      【解决方案4】:
      $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)){
       ...
      }
      

      试试看……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 1970-01-01
        • 2017-04-01
        相关资源
        最近更新 更多