【问题标题】:Find last loop of while($stmt->fetch())查找 while($stmt->fetch()) 的最后一个循环
【发布时间】:2013-07-19 13:57:20
【问题描述】:

是否有可能找到最后一个循环是什么时候:

$stmt = $connection->stmt_init();

if ($stmt->prepare("SELECT `ProductId` FROM Products"))
{
    $stmt->execute();
    $stmt->bind_result($product_id);

    while($stmt->fetch())
    {
       if ($lastloop)
       {
          echo 'The last id is -> ';
       }

       echo $product_id.'<br />';
    }
}

我想输出类似:

1
2
...
9
最后一个id是-> 10

【问题讨论】:

    标签: php mysqli while-loop prepared-statement


    【解决方案1】:
    1. 您可以使用$stmt-&gt;num_rows^,但仅当您$stmt-&gt;store_result() 结果集并继续计算活动行偏移量时。 存储结果对于大型集合是不可行的。
    2. 使用 SELECT SQL_CALC_FOUND_ROWS ProductId FROM Products; 就像在 this answer here^ 中一样。然后使用FOUND_ROWS() 了解行号不存储结果集需要一个额外的查询...这是一个很小的代价。

    这就是你所拥有的所有可行且简单的解决方案。

    【讨论】:

    • 关于solotuion 1.如果我的查询中限制为100,是否会被视为一个大集合?
    • @zPuls3 如果您有 TEXT/BLOB 列,其中包含 KB/MB 的数据,并且您使用了 SELECT *... 它是。 如果你只SELECT特定的小列,像这里...不是。
    • @zPuls3 只是一个额外的评论。如果你 SELECT 特定的小列在合理的范围内......最好总是存储,因为这限制了到服务器的往返行程。否则,对于每个fetch... 都需要与服务器进行新的通信。这对大集合有好处,但对较小的集合不太好。
    【解决方案2】:

    你可以保持计数并比较行数

    $stmt->store_result();
    $rows = $stmt->num_rows;
    $count = 1;
    while( $stmt->fetch() ) {
        if( $count == $rows ) {
            echo 'The last id is -> ';
        }
        $count ++;
        echo $product_id . '<br />';
    }
    

    【讨论】:

    • 这不起作用。编辑它确实需要一个 $stmt->store_result();
    • 已编辑。抱歉,我更熟悉 PDO,它的做法略有不同
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2017-06-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多