代码:
public function login($email , $password){
$stmt =$this->pdo->prepare("SELECT 'user_id' FROM 'users' WHERE 'email' = :email AND 'password' =: password");
$stmt->bindParam(":email", $email, PDO::PARAM_STR);
$stmt->bindParam(":password", md5($password), PDO::PARAM_STR);
$stmt->execute();
$users = $stmt->fetch(PDO::FETCH_OBJ);
$count = $stmt->rowCount();
if($count > 0) {
$_SESSION['user_id'] = $user->user_id;
header('Location : home.php');
}else {
return false;
}
}
}
错误:
注意:在第18行的C:\ xampp8 \ htdocs \ social \ core \ classes \ user.php中只能通过引用传递变量
警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:绑定变量数与C:\ xampp8 \ htdocs \ social \ core \ classes \ user.php中的令牌数量不匹配19
答案 0 :(得分:2)
如果这是您的实际代码,则您的命名占位符=: password
和标题Location : home.php
中会有空格,这些空格会在列名称周围计算并使用单引号(错误的identifier qualifiers)而不是刻度,但不管怎样它们都是不需要的,因为SQL会抱怨没有任何列名称。
注意:$user->user_id;
- $user
没有引用且未定义,您希望在此处使用$users
。您的代码末尾还有一个额外的}
大括号,并且不确定您是否还有其他任何内容。如果没有,请将其删除。
请参阅有关密码参考的“编辑”。
public function login($email , $password){
$stmt =$this->pdo->prepare("SELECT user_id FROM users
WHERE email = :email AND password =:password");
$stmt->bindParam(":email", $email, PDO::PARAM_STR);
$stmt->bindParam(":password", $password, PDO::PARAM_STR);
$stmt->execute();
$users = $stmt->fetch(PDO::FETCH_OBJ);
$count = $stmt->rowCount();
if($count > 0) {
$_SESSION['user_id'] = $users->user_id;
header('Location: home.php');
exit; // added to prevent further execution
}else {
return false;
}
}
} // << that brace should probably not be there.
如Magnus的评论中所述,请勿使用MD5。使用password_hash()
,因为旧方法陈旧且不安全。当您使用更安全的方法时,请确保密码长度足以容纳哈希值。
还要确保会话数组具有值。如果没有,那么您可能无法使用session_start();
启动会话。
修改强>
如下面的评论中所述,将变量指定给md5($password)
,而不是将其作为参考传递。
$password = md5($password); // wherever this is coming from.
然后
$stmt->bindParam(":password", $password, PDO::PARAM_STR); // in the code above
如果您还没有这样做,请使用正确的错误处理。