PHP if语句检查变量是空问题

时间:2011-12-29 05:21:40

标签: php mysql if-statement pdo

这让我疯了,我有一个登录功能,检查以确保用户凭据是正确的,并检查该用户的“激活”字段是否为空(如果不是,它意味着它们尚未激活,因此无法登录)。如果所有这些条件都检查正常,则会在变量中返回用户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)我手动执行了第一个查询,实际上确实选择了字段saltactivation完美无缺。

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是与登录用户相关的那个,所以这是正确的。

3 个答案:

答案 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为用户

当您登录时,请考虑:

  1. 检查用户名
  2. 检查密码
  3. 检查已激活=== 1

答案 2 :(得分:0)

我认为您在数据库中使用'char'数据类型进行激活。所以你最好试试这段代码。

if (trim($activation)!= "") 
{

}

干杯!

普拉萨德。