所以我试图让用户使用他们的用户名或电子邮件和密码登录。这是我的查询
SELECT * FROM users WHERE (username = ':username' OR email = ':email') AND password = :pass
问题是如何绑定值?这是我的所有代码
$st = $con->prepare("SELECT * FROM users WHERE (username = ':username' OR email = ':email') AND password = :pass");
$st->bindValue(':email', $email, PDO::PARAM_STR);
$st->bindValue(':username', $email, PDO::PARAM_STR);
$st->bindValue(':pass', $pass, PDO::PARAM_STR);
$st->execute();
$rows = $st->fetch(PDO::FETCH_NUM);
如您所见,我使用了$email
两次,$email
是
$email = htmlspecialchars($_POST['email'], ENT_QUOTES, 'UTF-8');
任何帮助都会很棒。使用我当前的代码,我收到此错误
致命错误:未捕获的异常' PDOException' with message' SQLSTATE [HY093]:参数号无效:绑定变量的数量与令牌的数量不匹配'在/Users/matt/Desktop/Mail/l.php:27堆栈跟踪:#0 /Users/matt/Desktop/Mail/l.php(27):PDOStatement-> execute()#1 {main}抛出第27行/Users/matt/Desktop/Mail/l.php
编辑在做@ Deele的建议方式时,
注意:未定义的索引:第60行的/Users/matt/Desktop/Mail/l.php中的名称
和
警告:无法修改标题信息 - 已在第60行的/Users/matt/Desktop/Mail/l.php中发送的标题(在/Users/matt/Desktop/Mail/l.php:60处开始输出)< / p>
第60行是header('Location: profile.php?username='.$_SESSION['name']);
答案 0 :(得分:2)
我会做这样的事情
// Try to find user
try {
$sth = $dbh->prepare('SELECT * FROM users WHERE username = :login OR email = :login LIMIT 1');
$sth->execute(array(':login' => $_POST['email']));
$user = $sth->fetch(PDO::FETCH_ASSOC);
}
catch (PDOException $e) {
echo 'Login error: '.$e->getMessage();
}
// If user was found, authenticate it by comparing passwords
if ($user && isset($user['password']) && md5($user['password']) == $_POST['password']) {
echo 'Login success.';
}
else {
echo 'Login failed.';
}
注意:未经过测试
如果它适合您,请将其与其他代码分开进行测试。最好为class User { public static function findByLogin($login) { /* ... */ } }
之类的用户创建一个类,或至少为user_findByLogin($login) { /* ... */ } }
创建一个单独的函数,这样可以更轻松地测试和调试自己的代码。之后,添加另一个进行身份验证处理的方法/函数,以比较密码。