因此,我试图让用户使用其用户名或电子邮件以及密码登录。这是我的查询
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');
任何帮助都会很棒。用我当前的代码我得到这个错误
致命错误:/Users/matt/Desktop/Mail/l.php中的消息“ SQLSTATE [HY093]:未捕获的异常” PDOException”:无效的参数编号:绑定变量的数量与令牌的数量不匹配: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)
60行是 header('Location: profile.php?username='.$_SESSION['name']);
我会做这样的事情
// 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) { /* ... */ } }
这样将更容易测试和调试您自己的代码。之后,添加另一个执行身份验证过程的方法/函数以比较密码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句