我有以下代码:
$a=$_POST['dsaghgjjkhfdsfdsfsdfdsjhkhkhgj'];
if(isset($a))
{
echo"exists";
}
else
{
echo"does not exist";
}
回显“不存在”的值,但是当我将trim应用于$ _POST变量时,
$a=trim($_POST['dsaghgjjkhfdsfdsfsdfdsjhkhkhgj']);
if(isset($a))
{
echo"exists";
}
else
{
echo"does not exist";
}
代码将回显“存在”。为什么将一个不存在的$ _POST变量传递给trim()会神奇地使它存在?
答案 0 :(得分:4)
这正是一步一步发生的事情。
当您在第二个代码段中引用$_POST['...']
时,会发出此通知:
注意:未定义的索引:......在线...
由于error_reporting
级别不包含E_NOTICE
,您无法收到通知。评估中间$_POST['...']
NULL
,trim(NULL)
返回空字符串。因此为$a
分配了一个空字符串。
如果您在脚本中添加error_reporting(E_ALL)
和ini_set("display_errors", "on")
,则会看到发出的实际错误/警告/通知。
答案 1 :(得分:3)
因为trim返回一个字符串,无论其输入如何,请参阅http://ch2.php.net/manual/en/function.trim.php。
php > var_dump(NULL);
NULL
php > var_dump(trim(NULL));
string(0) ""
字符串,即使它是空的,也被声明为“已定义”。这就是isset
然后返回true
的原因。
答案 2 :(得分:2)
这是isset
的作用:
如果 var 存在并且其值不是
TRUE
,则返回NULL
,否则为FALSE
。
在第一个示例中,$_POST
变量不存在。 Non-existing variables have the value null
:
如果符合以下情况,则变量被视为 null :
- 已为其分配常量
NULL
。- 尚未设置为任何值。
- 已经
unset()
。
所以$a
也等于null
。虽然$a
存在,但其值为null
,因此isset
会返回false
。
在第二个示例中,null
传递给trim
,后者返回一个空字符串:
var_dump(trim(null)); // string(0) ""
所以$a
也等于一个空字符串。由于$a
存在并且其值不是null
,isset
会返回true
。
答案 3 :(得分:1)
您可以尝试empty()
功能。 trim()
返回一个空字符串!= NULL:
$a=trim($_POST['dsaghgjjkhfdsfdsfsdfdsjhkhkhgj']);
if(empty($a))
{
echo"does not exist";
}
else
{
echo"exists";
}
来自php.net:
以下内容被认为是空的:
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)