mysqli num rows在服务器而不是localhost上给出错误

时间:2016-10-20 15:40:19

标签: php mysql

我创建了一个帮助函数,我在整个代码中使用了很多这个错误。

但我不明白的是我有zend服务器,我的代码在本地主机上正常运行。为什么对现场服务器感到悲痛。

  

警告:mysqli_ num_rows()要求参数1为mysqli_result,第26行为boolean

这是第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;
    }
}

1 个答案:

答案 0 :(得分:2)

请看这里的陈述,

$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 Native驱动程序(mysqlnd),因此如果您没有那就不能使用 / em>安装了特定的驱动程序。

另外,从你的问题:

  

但我不明白的是我有zend服务器,我的代码在本地主机上正常运行。为什么对现场服务器感到悲伤。

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