使用用户名或电子邮件登录

时间:2014-06-26 13:52:06

标签: php html mysql sql email

所以我试图让用户使用他们的用户名或电子邮件和密码登录。这是我的查询

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']);

1 个答案:

答案 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) { /* ... */ } }创建一个单独的函数,这样可以更轻松地测试和调试自己的代码。之后,添加另一个进行身份验证处理的方法/函数,以比较密码。