这让我疯了,我有一个登录功能,检查以确保用户凭据是正确的,并检查该用户的“激活”字段是否为空(如果不是,它意味着它们尚未激活,因此无法登录)。如果所有这些条件都检查正常,则会在变量中返回用户ID,如果不是,则返回false
。
该函数正确运行,直到我使用$activation
添加if语句来检查变量empty()
是否为空。如果该字段确实为空,则返回user_id,就像它应该的那样,但如果该字段不为空且仍包含40个字符激活码 - 它也允许用户登录。这是荒谬的。
这是登录功能(删除了不相关的部分):
function loginCheck($email, $password) {
$stmt = $dbh->prepare("SELECT `salt`,`activation` FROM `users` WHERE `email`= :email LIMIT 1");
$stmt->bindParam(':email', $email);
$stmt->execute();
if ($stmt->rowCount() == 1) {
$salt = $stmt->fetchColumn(0);
$activation = $stmt->fetchColumn(1);
if (empty($activation)) {
// another few unrelated tasks and query here to grab user id which is returned below
if ($stmt->execute()) {
return $stmt->fetchColumn(1); // the returned user ID
} else {
return false;
}
} else {
return false; // It should return this false here because the field IS NOT empty!
}
} else {
return false;
}
}
1)我手动执行了第一个查询,实际上确实选择了字段salt
和activation
完美无缺。
2)我已经检查过以确保提取并应用于var $activation
的列是正确的,它是第二列,因此$activation = $stmt->fetchColumn(1)
很好。
现在在调用上述函数的login.php
页面上,这是与调用函数和登录有关的代码:
$login = loginCheck($email, $password);
if ($login === false) {
$errors[] = 'Unable to log you in';
}
if (!empty($errors)) {
foreach ($errors as $error) {
echo $error, '<br />';
}
} else {
$_SESSION['user_id'] = $login;
header('Location: you/default.php');
exit();
}
我看了看,发现没有任何错误。为什么发生这种情况呢?
我的MySQL表中的激活字段设置为varchar(40)
,排序为utf8_general_ci
,并且由于激活字段填充了数字和字母,我假设它是一个字符串。
是的,返回的user_id是与登录用户相关的那个,所以这是正确的。
答案 0 :(得分:4)
正如您在此处所见:http://php.net/manual/en/pdostatement.fetchcolumn.php,
如果使用,则无法从同一行返回另一列 PDOStatement :: fetchColumn()来检索数据。
这是因为每次调用fetchColumn时,它都将应用于上一次调用所应行的行旁边的行。
$salt = $stmt->fetchColumn(0);
$activation = $stmt->fetchColumn(1);
第二次调用fetchColumn()正在处理第一次调用旁边的行。在你的情况下,因为只有一行,fetchColumn()返回NULL,这就是激活显示为空的原因。
使用fetch()检索包含该行的所有值的数组:
$row=$stmt->fetch();
$salt=$row[0];
$activation=$row[1];
答案 1 :(得分:1)
考虑这种方法..
<强>列强>
`activation_code` varchar(40) not null,
`activated` tinyint(1) not null default '0',
现在在其他地方创建激活功能,一旦完成更新激活=== 1为用户
当您登录时,请考虑:
答案 2 :(得分:0)
我认为您在数据库中使用'char'数据类型进行激活。所以你最好试试这段代码。
if (trim($activation)!= "")
{
}
干杯!
普拉萨德。