mysql的num行在服务器而不是本地主机上给出错误



我创建了一个辅助函数,我在我的代码中使用了很多,得到以下错误:

但我不明白的是我有zend服务器和我的代码在本地主机上运行良好。

警告:mysqli_ num_rows()期望参数1是mysqli_result, boolean在第26行

这是第26行

function row_count($result){   
    global $connection;
    return mysqli_num_rows($result);
}

登录代码
function login_user($email, $password){
    
    $active = 1;
    
    $connection = dbconnect();
    $stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?');
    $stmt->bind_param('ss', $email, $active);
    $stmt->execute();
    $result = $stmt->fetch();      
    
    if (row_count($result) == 1) {
        
        $row = fetch_array($result);
        
        $db_password = $row['user_pwd'];
        
        if (password_verify($password, $db_password)) {
            
            $_SESSION['email'] = $email;
            $_SESSION['user_id'] = $row['user_id'];
            $_SESSION['username'] = $row['username'];
            
            return true;
        
        } else {
            
            return false;
        }
        
        return true;
    
    } else {
        
        return false;
    }
}

看这里的语句,

$result = $stmt->fetch();

从mysqli_stmt::fetch的文档中,

                                    Return Values 
    Value    Description
    TRUE     Success. Data has been fetched
    FALSE    Error occurred
    NULL     No more rows/data exists or data truncation occurred

首先,->fetch()在成功时不返回任何结果集。其次,此方法用于从准备好的语句中获取结果到绑定变量中,而您没有这样做。

解决方案是,首先使用->store_result()然后使用->num_rows来获得SELECT查询返回的总行数。然后从准备好的语句中获取结果到绑定变量中,以便稍后在代码中使用这些绑定变量。所以你的代码应该是这样的:

function login_user($email, $password){
    $active = 1;
    $connection = dbconnect();
    $stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?');
    $stmt->bind_param('ss', $email, $active);
    $stmt->execute();
    $stmt->store_result();     
    if ($stmt->num_rows == 1) {
        $stmt->bind_result($db_password, $user_id, $username);
        $stmt->fetch();
        if (password_verify($password, $db_password)) {
            $_SESSION['email'] = $email;
            $_SESSION['user_id'] = $user_id;
            $_SESSION['username'] = $username;
            return true;
        } else {
            return false;
        }
        return true;
    } else {
        return false;
    }
}

或者,您也可以使用->get_result()方法来达到期望的结果。你的代码应该是这样的:

function login_user($email, $password){
    $active = 1;
    $connection = dbconnect();
    $stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?');
    $stmt->bind_param('ss', $email, $active);
    $stmt->execute();
    $result = $stmt->get_result();     
    if ($result->num_rows == 1) {
        $row = $result->fetch_array();
        $db_password = $row['user_pwd'];
        if (password_verify($password, $db_password)) {
            $_SESSION['email'] = $email;
            $_SESSION['user_id'] = $row['user_id'];
            $_SESSION['username'] = $row['username'];
            return true;
        } else {
            return false;
        }
        return true;
    } else {
        return false;
    }
}

注意: ->get_result()方法只适用于MySQL本地驱动程序(mysqlnd),所以如果你没有特定的驱动程序安装,它将无法工作。


同样,从你的问题中:

但我不明白的是我有zend服务器和我的代码在本地主机上运行良好。

这是因为您的本地服务器可能关闭了错误报告。在PHP脚本的最顶部添加这些行,以打开错误报告ini_set('display_errors', 1); error_reporting(E_ALL);。另外,使用mysqli::$error.

最新更新