我正在尝试将我的代码从mysql_connect更改为PDO,我遇到了一些问题。我是PHP的新手,我被告知mysql_connect已经过时了,所以这里是我的代码。我似乎无法验证用户。即使我输入了错误的用户,它也不会输出无效的用户。
$_GET['errorCode'];
$errors = array(
1 => 'Invalid User',
2 => 'Incorrect Password');
if(isset($_GET['errorCode'])){
$code = $_GET['errorCode'];
print isset($errors[$code]) ? $errors[$code] : 'Unknown error';
}
if($_SERVER['REQUEST_METHOD']== 'POST'){
$username = $_POST['username'];
$password = $_POST['password'];
if(isset($_POST['username']) && isset($_POST['password'])){
$stmt = $dbh->prepare("SELECT password, salt FROM user WHERE username = :user_name");
$stmt->execute(array(':user_name' => "$username"));
$stmt->bindParam(':user_name', $username, PDO::PARAM_STR);
if(!$stmt->rowCount() > 0)
{
header('Location: index.php?errorCode=1');
exit;
}
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$hash = hash('sha256', $result['salt'] . hash('sha256', $password) );
if($hash != $result['password']) //incorrect password
{
header('Location: index.php?errorCode=2');
exit;
}
else
{
validateUser(); //sets the session data for this user
Header("Location: index.php");
exit;
}
}
}
答案 0 :(得分:2)
您忘记执行该语句 - 您只需在绑定参数后运行$stmt->execute();
。
- 编辑 -
并删除以下行:$userData = $dbh->query($stmt);
;您的行将使用当前代码提取到$result
。
答案 1 :(得分:1)
除了缺少execute
语句之外,这永远不会起作用:
Header("Location: index.php");
$errmessage = "Invalid user";
print "<p id\"errmessage\"> $errmessage </p>";
exit;
一旦重定向,浏览器就会加载index.php
,因此您永远不会看到错误消息。您应或重定向或显示错误消息,但不能同时显示错误消息。