我正在尝试编写一个脚本,当用户上传文件但不输入名称时,会返回错误。我尝试过使用 is_null、empty 和 isset,但它们都不起作用。例如,在下面,即使输入了名称,is_null 也会返回错误。任何人都可以帮忙吗?
$caption = $_REQUEST[$name_input_name];
if(is_null($caption)) {
$file->error = 'Please Enter a Title';
return false;
}
我正在尝试编写一个脚本,当用户上传文件但不输入名称时,会返回错误。我尝试过使用 is_null、empty 和 isset,但它们都不起作用。例如,在下面,即使输入了名称,is_null 也会返回错误。任何人都可以帮忙吗?
$caption = $_REQUEST[$name_input_name];
if(is_null($caption)) {
$file->error = 'Please Enter a Title';
return false;
}
is_null()
isset()
如果变量未设置,但不设置,则发出警告empty()
。
$a - variable with not null value (e.g. TRUE)
$b - variable with null value. `$b = null;`
$c - not declared variable
$d - variable with value that cast to FALSE (e.g. empty string, FALSE or empty array)
$e - variable declared, but without any value assigned
$a->a - declared, but not assigned object property. (`public $a;`)
A::$a - declared, but not assigned static class property.
| $a | $b | $c | $d | $e | $a->a | A::$a |
---------+-------+-------+-------+-------+-------+-------+-------+
is_null()| FALSE | TRUE |TRUE*W | FALSE | TRUE*W| TRUE | TRUE |
---------+-------+-------+-------+-------+-------+-------+-------+
isset() | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
---------+-------+-------+-------+-------+-------+-------+-------+
empty() | FALSE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE |
---------+-------+-------+-------+-------+-------+-------+-------+
null === | FALSE | TRUE |TRUE*W | FALSE | TRUE*W| TRUE | TRUE |
---------+-------+-------+-------+-------+-------+-------+-------+
null == | FALSE | TRUE |TRUE*W | TRUE | TRUE*W| TRUE | TRUE |
---------+-------+-------+-------+-------+-------+-------+-------+
TRUE*W - function return TRUE, but same time emits WARNING.
在empty() 函数文档页面上,您可以阅读:
以下内容被认为是空的:
……
$var; (声明的变量,但没有值)
代码$var;
正在定义一个变量,但没有为它分配任何值,这可能会产生误导,但这是错误的。变量$var
仍然是未定义的并且类型识别函数,例如is_null()
如果您$var
作为参数传递,则会发出警告。
但它不适用于未确定的类或对象属性。声明它们而不分配某些值会自动分配 NULL。
PHP 7.4 中的UPD类型属性默认情况下不分配为 NULL。如果您没有为它们设置任何值,它们将被视为未分配。
一些低级描述:
isset()
和empty()
是核心函数,将根据zval类型直接编译成特定的操作码:
ZEND_ISSET_ISEMPTY_THIS
ZEND_ISSET_ISEMPTY_CV
ZEND_ISSET_ISEMPTY_VAR
ZEND_ISSET_ISEMPTY_DIM_OBJ
ZEND_ISSET_ISEMPTY_PROP_OBJ
ZEND_ISSET_ISEMPTY_STATIC_PROP
此外,它们将通过相同的功能进行编译zend_compile_isset_or_empty
函数is_null()
是类型识别函数,如is_numeric
, is_recource
,is_bool
等。将像用户定义的函数一样使用操作码等调用INIT_FCALL_BY_NAME/DO_FCALL_BY_NAME
。
/* {{{ proto bool is_null(mixed var)
Returns true if variable is null
Warning: This function is special-cased by zend_compile.c and so is usually bypassed */
PHP_FUNCTION(is_null)
{
php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL);
}
isset()
will check if the variable is set, ie
<?php
echo isset($var); // false
$var = 'hello';
empty()
will check if the variable is empty, ie
<?php
$emptyString = '';
echo empty($emptyString); // true
is_null()
will check for NULL
which is different from empty, because it's set to NULL
not an empty string. (NULL might be a confusing concept)
Since your title is a string, I think you want to be using empty()
if (!isset($_REQUEST[$name_input_name]) || empty($_REQUEST[$name_input_name])) {
$file->error = 'Please Enter a Title';
return false;
}
PHP empty()
vs is_null()
vs isset()
:
“”</th> | “富”</th> | 无效的 | 错误的 | 0 | 不明确的 | |
---|---|---|---|---|---|---|
empty() |
真的 | 错误的 | 真的 | 真的 | 真的 | 真的 |
is_null() |
错误的 | 错误的 | 真的 | 错误的 | 错误的 | 真 (错误) |
isset() |
真的 | 真的 | 错误的 | 真的 | 真的 | 错误的 |
如果要检查是否存在除或undefined以外的任何值,请使用(因为会在未定义的变量上生成警告。)null
isset($var)
!is_null()
如果您想检查该值是非空白文本还是包括零在内的任何数字,它会变得更加棘手:
if (!empty($v) || (isset($v) && ($v === 0 || $v === '0'))) {
// $v is non-blank text, true, 0 or '0'
// $v is NOT an empty string, null, false or undefined
}
来自 PHP 手册 – isset():
isset — 确定变量是否已设置且不为 NULL
换句话说,只有当变量不为空时它才返回真。
来自 PHP 手册 – empty():
empty — 确定变量是否为空
换句话说,如果变量是一个空字符串,它会返回真,假,array(),NULL,“0?,0,和一个未设置的变量。
来自 PHP 手册 – is_null():
is_null — 查找变量是否为 NULL
换句话说,只有当变量为空时它才返回真。is_null()
与 相反isset()
,除了isset()
可以应用于未知变量的一个差异,但is_null()
只能应用于已声明的变量。
我认为您打算在将其分配给某物isset
之前使用:
if(!isset($_REQUEST[$name_input_name]))
{
$file->error = 'Please Enter a Title';
return false;
}
$caption = $_REQUEST[$name_input_name];
和 和之间isset()
的区别并不容易。它比我们愿意相信的更微妙。is_null()
empty()
因为,用文字很难清楚地解释差异,我建议看看这个页面:有一个包含每个函数行为的详细表格。它清楚而充分地解释了这些差异。
顺便说一句,由于对行为的误解,我确信许多 PHP 脚本包含安全漏洞。
这是一个很好的解释:
我用strlen来统计字符数
if (strlen($_REQUEST['name_input_name']) < 1) {
$file->error = 'Please Enter a Title';
return false;
}
你可以试试这个:
if(!isset($_REQUEST['name_input_name']))
{
$file->error = 'Please Enter a Title';
return false;
}
$caption = $_REQUEST['name_input_name'];
注意:$_REQUEST 是一个全局数组,将数据存储在 key=>value 对中。将“name_input_name”视为从服务器提取的值。
如果 name_input_name 设置为某个值,代码将跳过 if 块并将值存储到变量 $caption。
我写了这个 php 页面,希望对你有所帮助。如果您运行它,它会显示这些特定类型的变量与这些函数的交互(加上我为自己制作的一个),并且它还使用 == 运算符将它们相互比较: https ://pastebin.com/whPFMams
<!doctype html>
<html>
<head>
<style>
td.first{
font-weight: bold;
}
h3 {
text-align: center;
}
</style>
</head>
<body>
<h3>FUNCTIONS COMPARISON</h3><br>
<pre>
<h4>Variables</h4>
class obj{};
$n;
Array:
"a" => -1,
"b" => 0,
"c" => 0.0,
"d" => '',
"e" => ' ',
"f" => '0',
"g" => "\0",
"h" => true,
"i" => false,
"j" => null,
"k" => array(),
"l" => new obj(),
"m" => new stdClass(),
"n" => $n (undefined)
z = (undeclared)
<h4>My function</h4>
function isvalid($value,$strict=false){
if( !is_null($value) && value!==false && (!empty($value) || $value == 0) ){
if($strict)
{
if(is_bool($value) || is_array($value) || is_object($value))
{return false;}
else
{return true;}
}
else
{return true;}
}
else
{return false;}
}
<h4>Var_dump</h4>
<?php
error_reporting(E_ERROR | E_PARSE);
class obj{};
function isvalid($value,$strict=false){
if( !is_null($value) && $value!==false && (!empty($value) || $value == 0) ){
if($strict)
{
if(is_bool($value) || is_array($value) || is_object($value))
{return false;}
else
{return true;}
}
else
{return true;}
}
else
{return false;}
}
$n;
$values = [
"a" => -1,
"b" => 0,
"c" => 0.0,
"d" => '',
"e" => ' ',
"f" => '0',
"g" => "\0",
"h" => true,
"i" => false,
"j" => null,
"k" => array(),
"l" => new obj(),
"m" => new stdClass(),
"n" => $n
//"z"
];
echo var_dump($values)."\n z = "; echo var_dump($z)."\n";
?>
</pre><br />
<table border = "1">
<tr>
<th>== and other</th>
<?php
echo "<th>"; echo var_dump($values["a"]); echo "<br> : a = -1 </th>";
echo "<th>"; echo var_dump($values["b"]); echo "<br> : b = 0 </th>";
echo "<th>"; echo var_dump($values["c"]); echo "<br> : c = 0.0 </th>";
echo "<th>"; echo var_dump($values["d"]); echo "<br> : d = '' </th>";
echo "<th>"; echo var_dump($values["e"]); echo "<br> : e = ' ' </th>";
echo "<th>"; echo var_dump($values["f"]); echo "<br> : f = '0' </th>";
echo "<th>"; echo var_dump($values["g"]); echo "<br> : g = '/0' </th>";
echo "<th>"; echo var_dump($values["h"]); echo "<br> : h = true </th>";
echo "<th>"; echo var_dump($values["i"]); echo "<br> : i = false </th>";
echo "<th>"; echo var_dump($values["j"]); echo "<br> : j = null </th>";
echo "<th>"; echo var_dump($values["k"]); echo "<br> : k = empty array </th>";
echo "<th>"; echo var_dump($values["l"]); echo "<br> : l = empty object (Notices with numbers)</th>";
echo "<th>"; echo var_dump($values["m"]); echo "<br> : m = empty stdClass (Notices with numbers)</th>";
echo "<th>"; echo var_dump($values["n"]); echo "<br> : n = undefined </th>";
echo "<th>"; echo var_dump($z); echo "<br> : z = undeclared (Notices)</th>";
?>
</tr>
<?php
foreach ($values as $key => $val){
echo '
<tr>
<td class="first">'; echo var_dump($val); echo '<br> : '.$key.'</td>';
foreach ($values as $key2 => $val2){
echo '<td>'; echo $val==$val2 ? var_dump($val==$val2) : /*var_dump($val==$val2).*/''; echo'</td>';
}
echo '<td>'; echo $val==$z ? var_dump($val==$z) : /*var_dump($val==$z).*/''; echo'</td>';
echo '</tr>';
}
//z
echo '
<tr>
<td class="first">'; echo var_dump($z); echo '<br> : z (Notices)</td>';
foreach ($values as $key2 => $val2){
echo '<td>'; echo $z==$val2 ? var_dump($z==$val2) : /*var_dump($z==$val2).*/''; echo'</td>';
}
echo '<td>'; echo $z==$z ? var_dump($z==$z) : /*var_dump($z==$z).*/''; echo'</td>';
echo '</tr>';
//!empty || ==0
echo '
<tr>
<td class="first"> !empty || ==0 </td>';
foreach ($values as $key => $val){
echo '<td>'; echo !empty($val) || $val==0 ? var_dump(!empty($val) || $val==0) : /*var_dump(!empty($val) || $val==0.*/''; echo'</td>';
}
echo '<td>'; echo !empty($z) || $z==0 ? var_dump(!empty($z) || $z==0) : /*var_dump(!empty($z) || $z==0).*/''; echo'</td>';
echo '</tr>';
//isvalid
echo '
<tr>
<td class="first"> isvalid() </td>';
foreach ($values as $key => $val){
echo '<td>'; echo isvalid($val) ? var_dump(isvalid($val)) : /*var_dump(isvalid($val)).*/''; echo'</td>';
}
echo '<td>'; echo isvalid($z) ? var_dump(isvalid($z)) : /*var_dump(isvalid($z)).*/''; echo'</td>';
echo '</tr>';
//isvalid strict
echo '
<tr>
<td class="first"> isvalid(strict) </td>';
foreach ($values as $key => $val){
echo '<td>'; echo isvalid($val,true) ? var_dump(isvalid($val,true)) : /*var_dump(isvalid($val,true)).*/''; echo'</td>';
}
echo '<td>'; echo isvalid($z,true) ? var_dump(isvalid($z,true)) : /*var_dump(isvalid($z,true)).*/''; echo'</td>';
echo '</tr>';
//!is_null
echo '
<tr>
<td class="first"> !is_null </td>';
foreach ($values as $key => $val){
echo '<td>'; echo !is_null($val) ? var_dump(!is_null($val)) : /*var_dump(!is_null($val)).*/''; echo'</td>';
}
echo '<td>'; echo !is_null($z) ? var_dump(!is_null($z)) : /*var_dump(!is_null($z)).*/''; echo'</td>';
echo '</tr>';
//isset
echo '
<tr>
<td class="first"> isset (No Notices)</td>';
foreach ($values as $key => $val){
echo '<td>'; echo isset($val) ? var_dump(isset($val)) : /*var_dump(isset($val)).*/''; echo'</td>';
}
echo '<td>'; echo isset($z) ? var_dump(isset($z)) : /*var_dump(isset($z)).*/''; echo'</td>';
echo '</tr>';
//!empty
echo '
<tr>
<td class="first"> !empty (No Notices) </td>';
foreach ($values as $key => $val){
echo '<td>'; echo !empty($val) ? var_dump(!empty($val)) : /*var_dump(!empty($val)).*/''; echo'</td>';
}
echo '<td>'; echo !empty($z) ? var_dump(!empty($z)) : /*var_dump(!empty($z)).*/''; echo'</td>';
echo '</tr>';
// if
echo '
<tr>
<td class="first"> if </td>';
foreach ($values as $key => $val){
echo '<td>'; echo $val ? var_dump(true) : /*var_dump(false).*/''; echo'</td>';
}
echo '<td>'; echo $z ? var_dump(true) : /*var_dump(false).*/''; echo'</td>';
echo '</tr>';
?>
<tr>
<th>functions</th>
<?php
echo "<th>"; echo var_dump($values["a"]); echo "<br> : a = -1 </th>";
echo "<th>"; echo var_dump($values["b"]); echo "<br> : b = 0 </th>";
echo "<th>"; echo var_dump($values["c"]); echo "<br> : c = 0.0 </th>";
echo "<th>"; echo var_dump($values["d"]); echo "<br> : d = '' </th>";
echo "<th>"; echo var_dump($values["e"]); echo "<br> : e = ' ' </th>";
echo "<th>"; echo var_dump($values["f"]); echo "<br> : f = '0' </th>";
echo "<th>"; echo var_dump($values["g"]); echo "<br> : g = '/0' </th>";
echo "<th>"; echo var_dump($values["h"]); echo "<br> : h = true </th>";
echo "<th>"; echo var_dump($values["i"]); echo "<br> : i = false </th>";
echo "<th>"; echo var_dump($values["j"]); echo "<br> : j = null </th>";
echo "<th>"; echo var_dump($values["k"]); echo "<br> : k = empty array </th>";
echo "<th>"; echo var_dump($values["l"]); echo "<br> : l = empty object (Notices with numbers)</th>";
echo "<th>"; echo var_dump($values["m"]); echo "<br> : m = empty stdClass (Notices with numbers)</th>";
echo "<th>"; echo var_dump($values["n"]); echo "<br> : n = undefined </th>";
echo "<th>"; echo var_dump($z); echo "<br> : z = undeclared (Notices)</th>";
?>
</tr>
</table>
<br>
(Notices) : This line is full of Notices. <br>
(Notices with numbers) : This line has Notices about number types interactions. <br>
(No Notices) : This line has absolutely no Notices.
</body>
</html>
参考:PHP 中 isset、is_null、empty 之间的区别
is_null 是 isset 的对偶,除了 isset 在变量为 null 时不打印通知。
>$ciao;
>var_export(is_null($ciao));
>PHP Notice: Undefined variable: ciao in php shell code on line 1
>true
>var_export(!isset($ciao));
>true
isset() — 确定变量是否已设置且不为 NULL
empty() - 确定变量是否为空。
is_null() - 确定变量是否为空
在这些 php 函数empty(),isset() & is_null
中主要用于测试变量。但每个函数都有不同的功能主义者。