【问题标题】:Checking result before using $stmt -> fetch() [duplicate]使用 $stmt -> fetch() 之前检查结果 [重复]
【发布时间】:2013-01-15 21:44:18
【问题描述】:

可能是一个愚蠢的问题。我有以下代码:

while ($stmt -> fetch()) {
    echo "<p><strong>" .$name. "</strong><br />" .$comment. "</p>";
}

我只想在 $stmt -> fetch() 返回至少一行(这是一个 SELECT 查询)时执行 while.. 但如果我这样做了

if ($stmt -> fetch())

它已经执行了一次,我想避免这种情况。有什么线索吗?

提前致谢。

【问题讨论】:

  • 那么,你只想检查返回的结果是否存在?

标签: php mysql mysqli


【解决方案1】:

http://php.net/manual/en/mysqli-stmt.num-rows.php

尝试使用$stmt-&gt;num_rows &gt; 0

$stmt->store_result();
if( $stmt->num_rows > 0 )
{
    while( $stmt->fetch() ) {
        echo "<p><strong>" .$name. "</strong><br />" .$comment. "</p>";
    }
}

为什么mysqli_resultfetchAll 函数而mysqli_stmt 没有....我不知道。


更长,但可以工作

$result = $stmt->fetch();
if( !empty( $result )
{
    do
    {
        echo "<p><strong>" .$name. "</strong><br />" .$comment. "</p>";
    } while( $result = $stmt->fetch() ); 
}

【讨论】:

  • 这总是返回 0!
  • 你已经测试了准备好的查询?
  • 我设法通过添加 $stmt -> store_result();在 $stmt -> bind_result 之后;在 IF 之前。为什么我必须存储结果才能做到这一点?你能给我解释一下吗? :)
  • 我不确定,但我认为 Tanmay Majumder 的回答可能会回答您的问题......
  • 是的,将其添加到答案中
【解决方案2】:

我认为您必须至少查询一次数据库才能获得计数。

【讨论】:

    【解决方案3】:

    通过调用

    while( $stmt->fetch() ) {
        // do stuff
    }
    

    您已经进行了正确的检查,并且do stuff 部分仅在有多个结果时才会出现。所以你已经在做你需要做的一切了。

    即你的echo只会出现numRows大于0。

    【讨论】:

    • 如果没有行,如果 OP 正在寻找该功能,这将不允许您做某事
    • 非常正确,如果这是他的问题,while 方法仍然是最好的方法。在循环之外跟着一个 numRows 检查
    【解决方案4】:

    rowCount() 返回受 DELETE、INSERT 或 UPDATE 语句影响的行数。

    <?php
    /* Delete all rows from the FRUIT table */
    $stmt= $dbh->prepare('DELETE FROM fruit');
    $stmt->execute();
    
    /* Return number of rows that were deleted */
    $count = $stmt->rowCount();
    print("Deleted $count rows.\n");
    ?>
    

    上面的例子会输出:

       Deleted 9 rows.
    

    【讨论】:

    • 抱歉,您混淆了使用的驱动程序。这会使您的答案具有误导性和错误性。
    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 2017-04-01
    • 2014-07-22
    • 2012-02-08
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多