简体   繁体   中英

PHP - mysqli_num_rows cannot be used after mysqli_stmt_execute?

I am using prepared statement and want to count the row number of the query result set:

        /* 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); 

Here the if (mysqli_num_rows($r) == 1) is wrong: mysqli_num_rows() expects parameter 1 to be mysqli_result, object given.

I checked the manual:

Procedural style int mysqli_num_rows ( mysqli_result $result )

Returns the number of rows in the result set.

The behaviour of mysqli_num_rows() depends on whether buffered or unbuffered result sets are being used. For unbuffered result sets, mysqli_num_rows() will not return the correct number of rows until all the rows in the result have been retrieved. Parameters ¶

result

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

So how to count row number of the result set if I am using Mysqli prepared statement(procedural style)??

mysqli_stmt_execute returns a boolean that indicates whether the query was successful, it doesn't return a mysqli_result . You need to call mysqli_stmt_get_result :

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

You can also simply test the result of mysqli_stmt_fetch . It returns a boolean indicating whether a row was fetched.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM