PHP if语句检查变量为空问题
这让我抓狂,我有一个登录功能,可以检查用户的凭据是否正确,还可以检查该用户的“激活”字段是否为空(如果不是,则意味着他们尚未激活,因此不能登录)。如果所有这些条件都正常,它将在变量中返回一个用户id,如果没有,它将返回PHP if语句检查变量为空问题,php,mysql,if-statement,pdo,Php,Mysql,If Statement,Pdo,这让我抓狂,我有一个登录功能,可以检查用户的凭据是否正确,还可以检查该用户的“激活”字段是否为空(如果不是,则意味着他们尚未激活,因此不能登录)。如果所有这些条件都正常,它将在变量中返回一个用户id,如果没有,它将返回false 作用 函数一直正确运行,直到我添加if语句,该语句使用empty()检查变量$activation是否为空。如果该字段真的为空,它会像预期的那样返回用户id,但是如果该字段不是空的,并且仍然包含40个字符的激活码,那么它还允许用户登录。这太荒谬了 以下是登录功能(删除不
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
进行登录检查时,请考虑:
考虑一下这种方法 列
`activation_code` varchar(40) not null,
`activated` tinyint(1) not null default '0',
现在,在别处创建一个activate函数,一旦用户完成update activated==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删除了所有空白。谢谢你的解释