检查$ _POST-value是否为空

时间:2012-02-06 01:31:40

标签: php if-statement string

if(isset($_POST['submit'])) {
    if(!isset($_POST['userName'])) {
        $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}

我无法让$username成为“匿名”?它为空白或$_POST['userName']的值。

8 个答案:

答案 0 :(得分:39)

如果变量已初始化,

isset()将返回true。如果您的表单字段的name值设置为userName,则在提交该表单时,该值将始终为“已设置”,但其中可能没有任何数据。

相反,trim()字符串并测试其长度

if("" == trim($_POST['userName'])){
    $username = 'Anonymous';
}      

答案 1 :(得分:39)

如果表单已成功提交,则应始终设置$_POST['userName'],但它可能包含空字符串,这与未设置完全不同。而是检查它是否是empty()

if (isset($_POST['submit'])) {
    if (empty($_POST['userName'])) {
        $username = 'Anonymous';
    } else { 
        $username = $_POST['userName'];
    }
}

答案 2 :(得分:9)

要检查属性是否存在,无论值如何,请使用:

if (array_key_exists('userName', $_POST)) {}

要检查属性是否已设置(属性是否存在且值不是nullfalse),请使用:

if (isset($_POST['userName'])) {}

检查属性是否已设置且不为空(不是空字符串,0(整数),0.0(浮点),'0'(字符串),{{1} },nullfalse(空数组)),使用:

[]

答案 3 :(得分:4)

问题:检查$ _POST值是否为为空

翻译:检查数组键/索引是否有与之关联的值。

答案:取决于你对安全的重视。取决于允许什么作为有效输入。

1. Some people say use empty().

从PHP手册:“[Empty]确定变量是否被认为是空的。如果变量不存在或者其值等于FALSE,则该变量被认为是空的。”因此以下被认为是空的。

"" (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)

如果这些值都不适用于您的输入控件,则empty()将起作用。这里的问题是empty()可能过于宽泛一致使用(同样的原因,出于同样的原因,对$_POST或{{1}的不同输入控制提交}})。好好利用$_GET来检查整个数组是否为空(没有元素)。

empty()

2. Some people say use isset(). (语言结构)无法在整个数组上运行,如isset()中所示。它只能在变量数组元素(通过索引/键)上运行:isset($myArray)isset($var)isset($_POST['username'])语言构造做了两件事。首先,它检查变量或数组索引/键是否具有与之关联的值。其次,它检查以确保该值不等于PHP NULL值。

简而言之,使用isset()可以最好地完成最准确的检查,因为某些输入控件在未选中或选中时甚至不会注册$ _POST。我从来不知道提交PHP NULL值的表单。我没有,所以我使用isset()来检查isset()键是否没有与之关联的值(并且不是NULL)。 $_POST是一个更严格的空虚测试(在您的问题意义上),而不是isset()

empty()
  

您可以在if中测试任何评估为 true false 的内容   声明。空数组的计算结果为false,因此变量也是如此   没有设置。包含PHP NULL值的变量也会计算为   假。不幸的是,在这种情况下,与3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness. 一样,还有更多   事情也评估为假:1。空字符串'',零(0),   zero.zero(0.0),字符串零'0',布尔值false,某些为空   XML对象。

     

- Doyle,从PHP 5.3开始

总之,使用empty()并考虑将其与其他测试结合使用。例如:

由于超级全局的螺旋性可能无法正常工作,但毫无疑问可以用于其他阵列。

isset()

因此,在您确定if (is_array($_POST) && !empty($_POST)) { // Now test for your successful controls in $_POST with isset() } 代表一个数组并且根本没有存储任何值(很多人没有考虑过)之前,为什么要查找与某个键相关的值?请记住,人们可以在不使用Web浏览器的情况下将数据发送到表单。您可能有一天会到达测试点$_POST只有允许的密钥,但该会话是另一天。

有用的参考:

PHP Manual: Type Testing Comparison Tables

答案 4 :(得分:2)

改变这个:

if(isset($_POST['submit'])){

    if(!(isset($_POST['userName']))){
    $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}

对此:

if(!empty($_POST['userName'])){
     $username = $_POST['userName'];
}

if(empty($_POST['userName'])){
     $username = 'Anonymous';
}

答案 5 :(得分:2)

我对这些用例使用简单的一行比较

$username = !empty(trim(isset($_POST['userName'])?$_POST['userName']:''))?$_POST['userName']:'Anonymous';

这是针对用例,您确定错误记录已关闭,因此您不会收到有关变量未初始化的警告。

这是偏执狂版本:

$_POST

这会检查是否设置了SELECT date(timestamp) as date, ID, count(*) as cnt_downloads, sum(cnt_downloads) over (partition by ID) as total_downl, count(*) over (partition by ID) as total_appear, (sum(cnt_downloads) over (partition by ID)) / (count(*) over (partition by ID)) as avg_dowl FROM [default.download_activity] where date(timestamp) >= '2016-01-04' and date(timestamp) <= '2016-01-20' group by date,two_hour, ID 变量。在访问它之前。

答案 6 :(得分:1)

isset正在测试您在哈希(或关联数组)中检查的密钥是否为“set”。在此上下文中设置仅表示它是否知道该值。没有什么是价值。所以它被定义为一个空字符串。

因此,只要您有一个名为userName的输入字段,无论它们是否填写,都是如此。你真正想做的是检查userName是否等于空字符串''

答案 7 :(得分:1)

$username = filter_input(INPUT_POST, 'userName', FILTER_SANITIZE_STRING);
if ($username == '') {$username = 'Anonymous';}

最佳实践-始终过滤输入,清理字符串是可以的,但是最好使用自定义回调函数来真正过滤掉不可接受的内容。 然后检查now-safe变量是否为null / empty,如果是,则将其设置为Anonymous。如果第一行中存在'else'语句,则不需要它。