Php 它没有';不要停止转到其他部分,发出if语句

Php 它没有';不要停止转到其他部分,发出if语句,php,mysql,prepared-statement,rowcount,Php,Mysql,Prepared Statement,Rowcount,我输入了10万次登录名和密码,但它没有停止到其他部分。错误在哪里 if (!empty($user) AND !empty($password)) { $sql = $this->_db->prepare("SELECT * FROM users WHERE user = :user AND password = :password"); $sql->execute(array('user' => $user, 'password' => $pass

我输入了10万次登录名和密码,但它没有停止到其他部分。错误在哪里

if (!empty($user) AND !empty($password)) {
    $sql = $this->_db->prepare("SELECT * FROM users WHERE user = :user AND password = :password");
    $sql->execute(array('user' => $user, 'password' => $password));

    if ($sql->rowCount()) {
        $data = $sql->fetch();
        $_SESSION['id'] = $data['id'];
        $_SESSION['id'] = true;
        header('location:client.php');
    } else {
        echo "user or password are wrong";
    }
}

返回受相应PDOStatement对象执行的最后一条DELETE、INSERT或UPDATE语句影响的行数。它对于
SELECT
语句没有用处

相反,使用
fetch()
(用于返回一行)获取结果,然后检查它是否为空

$sql = $this->_db->prepare("SELECT * FROM users WHERE user = :user AND password = :password");
$sql->execute(array('user' => $user, 'password' => $password));

$data = $sql->fetch();

if(!empty($data)) {
    $_SESSION['id'] = $data['id'];
    header('location:client.php');
    die();
}
//this line will only execute if the query returns nothing
echo "user or password are wrong";
注意:
die()
函数将使PHP停止执行代码,但是
header()
已设置,因此它仍将重定向。这意味着如果登录成功,它将不会在if语句之后执行任何操作


更安全
警告:密码应使用散列格式。如果它是散列的,它将永远不会匹配数据库中的内容。相反,您需要仅选择用户,如果存在,则使用验证密码

如果密码存储正确,查询将如下所示:

$sql = $this->_db->prepare("SELECT * FROM users WHERE user = :user");
if(!empty($data)) {
    //user exists
    if(password_verify($password, $data['password'])) {
        //password verified
        $_SESSION['id'] = $data['id'];
        header('location:client.php');
        die();
    }
}
//this line will only execute if the username doesn't exist or the password is incorrect
echo "user or password are wrong";
您的IF语句如下所示:

$sql = $this->_db->prepare("SELECT * FROM users WHERE user = :user");
if(!empty($data)) {
    //user exists
    if(password_verify($password, $data['password'])) {
        //password verified
        $_SESSION['id'] = $data['id'];
        header('location:client.php');
        die();
    }
}
//this line will only execute if the username doesn't exist or the password is incorrect
echo "user or password are wrong";
如果查询返回0行,PDOStatement::fetch()将返回false


密码应使用哈希值进行散列。如果它是散列的,它将永远不会匹配数据库中的内容。相反,您需要选择用户,如果用户存在,则使用来匹配它。PDOStatement::rowCount()返回受相应PDOStatement对象执行的上一个DELETE、INSERT或UPDATE语句影响的行数。它对
SELECT
语句没有用处……为了完成格鲁比克劳顿的观点,您没有运行任何一个,而是运行一个SELECT。所以rowCount不是这里使用的合适函数。(正如它所说,一些数据库可能返回SELECT生成的行数,但您不能依赖它)。这:应该对您有帮助如果这对您没有帮助(可能是因为rowCount实际上返回了一个有效值),那么唯一的其他解释是查询没有返回任何行(可能是因为您输入的数据与任何行都不匹配,或者根本不存在任何行)。它转到“用户或通行证错误”这与我现有的答案基本相同。@kebyzak您的查询必须返回0行。