Php 它没有';不要停止转到其他部分,发出if语句
我输入了10万次登录名和密码,但它没有停止到其他部分。错误在哪里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
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行。