Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP if语句检查变量为空问题_Php_Mysql_If Statement_Pdo - Fatal编程技术网

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

PHP if语句检查变量为空问题,php,mysql,if-statement,pdo,Php,Mysql,If Statement,Pdo,这让我抓狂,我有一个登录功能,可以检查用户的凭据是否正确,还可以检查该用户的“激活”字段是否为空(如果不是,则意味着他们尚未激活,因此不能登录)。如果所有这些条件都正常,它将在变量中返回一个用户id,如果没有,它将返回false 作用 函数一直正确运行,直到我添加if语句,该语句使用empty()检查变量$activation是否为空。如果该字段真的为空,它会像预期的那样返回用户id,但是如果该字段不是空的,并且仍然包含40个字符的激活码,那么它还允许用户登录。这太荒谬了 以下是登录功能(删除不

这让我抓狂,我有一个登录功能,可以检查用户的凭据是否正确,还可以检查该用户的“激活”字段是否为空(如果不是,则意味着他们尚未激活,因此不能登录)。如果所有这些条件都正常,它将在变量中返回一个用户id,如果没有,它将返回
false

作用 函数一直正确运行,直到我添加if语句,该语句使用
empty()
检查变量
$activation
是否为空。如果该字段真的为空,它会像预期的那样返回用户id,但是如果该字段不是空的,并且仍然包含40个字符的激活码,那么它还允许用户登录。这太荒谬了

以下是登录功能(删除不相关部分):

}

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();
} 
$login=loginCheck($email,$password);
如果($login==false){
$errors[]=“无法登录”;
}
如果(!empty($errors)){
foreach($errors作为$error){
echo$error,“
”; } }否则{ $\u会话['user\u id']=$login; 标题('Location:you/default.php'); 退出(); }
我看了又看,没有发现任何错误。究竟为什么会发生这种情况

编辑 mymysql表中的activation字段设置为
varchar(40)
,排序规则为
utf8\u general\u ci
,由于activation字段中填充了数字和字母,所以我假设它是一个字符串


是的,返回的用户id是与用户登录相关的id,因此这是正确的

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

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

}
干杯


Prasad。

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

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

}
干杯

普拉萨德。

你可以在这里看到:

如果使用,则无法从同一行返回另一列 PDOStatement::fetchColumn()检索数据

这是因为每次调用fetchColumn时,它都会应用于上一次调用所应用行旁边的行

 $salt = $stmt->fetchColumn(0);
$activation = $stmt->fetchColumn(1);
对fetchColumn()的第二个调用正在处理第一个调用旁边的行。在您的例子中,由于只有一行,fetchColumn()返回NULL,所以激活显示为空

使用fetch()检索包含该行所有值的数组:

   $row=$stmt->fetch();
   $salt=$row[0];
   $activation=$row[1];
正如你在这里看到的:

如果使用,则无法从同一行返回另一列 PDOStatement::fetchColumn()检索数据

这是因为每次调用fetchColumn时,它都会应用于上一次调用所应用行旁边的行

 $salt = $stmt->fetchColumn(0);
$activation = $stmt->fetchColumn(1);
对fetchColumn()的第二个调用正在处理第一个调用旁边的行。在您的例子中,由于只有一行,fetchColumn()返回NULL,所以激活显示为空

使用fetch()检索包含该行所有值的数组:

   $row=$stmt->fetch();
   $salt=$row[0];
   $activation=$row[1];

考虑一下这种方法

`activation_code` varchar(40) not null,
`activated` tinyint(1) not null default '0',
现在,在别处创建一个activate函数,一旦用户完成update activated==1

进行登录检查时,请考虑:

  • 检查用户名
  • 检查密码
  • 检查激活===1

  • 考虑一下这种方法

    `activation_code` varchar(40) not null,
    `activated` tinyint(1) not null default '0',
    
    现在,在别处创建一个activate函数,一旦用户完成update activated==1

    进行登录检查时,请考虑:

  • 检查用户名
  • 检查密码
  • 检查激活===1

  • 当允许登录时,
    $\u SESSION['user\u id']
    是否仍然等于正确的用户id?它只能在3个位置返回FALSE。既然你说已经到了$salt,剩下2个。什么数据类型是
    $activation
    ?我在我的问题中添加了一个额外的部分,回答了这些问题。当允许登录时,
    $\u会话['user\u id']
    是否仍然等于正确的用户id?只有3个位置可以返回FALSE。既然你说已经到了$salt,剩下2个。什么数据类型是
    $activation
    ?我在我的问题中添加了一个额外的部分来回答这些问题。
    empty
    函数解释空字符串,因此,据我所知,他的声明和您的解决方案是等效的。我希望首先找到字符串返回时带空格的原因-这表明某些内容没有在其他地方正常工作。如果使用“char”(40)数据类型。对于其余字符,它总是有“空格”。无论如何,这取决于您的插入查询。当我说空字符串时,我的意思是
    ,而不是充满空格的字符串。我知道Prasad现在在做什么了(
    trim
    )。是的。我使用trim删除了所有空格。
    empty
    函数解释了空字符串,因此据我所知,他的语句和您的解决方案是等效的。我更愿意首先找出字符串返回时带空格的原因-这表明某些内容没有在其他地方正常工作。如果使用“char”(40)数据类型。对于其余字符,它总是有“空格”。无论如何,这取决于您的插入查询。当我说空字符串时,我的意思是
    ,而不是充满空格的字符串。我知道Prasad现在在做什么了(
    trim
    )。是的。我用trim删除了所有空白。谢谢你的解释