【问题标题】:PHP - mysqli_num_rows cannot be used after mysqli_stmt_execute?PHP - mysqli_stmt_execute 后不能使用 mysqli_num_rows?
【发布时间】:2014-02-08 02:23:07
【问题描述】:

我在使用prepared statement,想统计查询结果集的行数:

        /* create a prepared statement */  
        // Note: mysqli can only use placeholder ? in prepared statement!
        $q = "SELECT user_id, first_name, DATE_FORMAT(last_login_time, '%a, %b %e at %l:%i%p') as f_last_login_time, last_login_time FROM users WHERE (email=? AND pass=SHA1(?)) AND active IS NULL";                
        $stmt = mysqli_prepare($dbc, $q);  

        /* bind parameters for markers */
        mysqli_stmt_bind_param($stmt, "ss", $e, $p);

        /* execute query */
       $r =  mysqli_stmt_execute($stmt);


       if (mysqli_num_rows($r) == 1) { // A match was made in the user table

                /* bind result variables */
                mysqli_stmt_bind_result($stmt, $user_id, $first_name, $f_last_login_time, $last_login_time);

                /* fetch value */
                // Fetch the result from a prepared statement into the variables bound by mysqli_stmt_bind_result(). 
                mysqli_stmt_fetch($stmt); 

这里if (mysqli_num_rows($r) == 1) 是错误的:mysqli_num_rows() expects parameter 1 to be mysqli_result, object given.

我查了手册:

程序风格 int mysqli_num_rows (mysqli_result $result)

返回结果集中的行数。

mysqli_num_rows() 的行为取决于是缓冲的还是 正在使用无缓冲的结果集。对于无缓冲的结果集, mysqli_num_rows() 将不会返回正确的行数,直到所有 结果中的行已被检索。参数¶

结果

Procedural style only: A result set identifier returned by mysqli_query(), mysqli_store_result() or mysqli_use_result().

如果我使用Mysqli准备好的语句(过程式),那么如何计算结果集的行数??

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    mysqli_stmt_execute 返回一个布尔值,指示查询是否成功,它不返回 mysqli_result。您需要拨打mysqli_stmt_get_result:

    $r = mysqli_stmt_execute($stmt);
    if ($r) {
        $result = mysqli_stmt_get_result($stmt);
        if (mysqli_num_rows($result) == 1) {
            ...
        }
    }
    

    您也可以简单地测试mysqli_stmt_fetch 的结果。它返回一个布尔值,指示是否提取了一行。

    $r = mysqli_stmt_execute($stmt);
    if (mysqli_stmt_fetch($stmt)) {
        ...
    }
    

    【讨论】:

    • 为什么要麻烦结果集?为什么不简单地使用mysqli_stmt_fetch 来获取值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多