检查变量是否为空或空字符串的更好方法?


173

由于PHP是一种动态语言,因此检查提供的字段是否为空的最佳方法是什么?

我要确保:

  1. null被认为是一个空字符串
  2. 只有空格的字符串被认为是空的
  3. “ 0”不被认为是空的

到目前为止,这是我得到的:

$question = trim($_POST['question']);

if ("" === "$question") {
    // Handle error here
}

必须有一个更简单的方法吗?


1
我会说使用empty($ question),但这也认为0为空。
Powerlord

2
yoda的状况很糟糕
user3791372'5

Answers:


277
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}

7
尽管这可以解决问题,但是我不确定它是否更简单。无论如何+1
Allain Lalonde

4
由于OP要求的是极其简单的操作的“简化”版本,因此我要说的是“更好”是实际需要的。
混乱

2
我把它变成一个函数。这应该使您的验证代码更简单
Michael Haren'Dec

7
!isset()的目的是什么?与is_null()有何不同?
尼克

2
还返回(!empty($ question)|| trim($ question)==='');
SpYk3HH

109

旧帖子,但有人可能像我一样需要它;)

if (strlen($str) == 0){
do what ever
}

$str用您的变量替换。 NULL并且""使用时都返回0 strlen


4
而且总有:if(strcmp('', $var) == 0)...
彼得2012年

12
为什么== 0而不是if(strlen($ str))?
Noumenon

14
@Noumenon因为那样会削弱可读性,而不解决任何问题。将您的建议读为“是否有长度”是很容易的,而(当然)表示相反的意思。
MattiasÅslund'13年

10
如果有人在意字符串,只会
帮不上忙

4
如果未设置该变量,则会产生警告
Konstantin Pereiaslov 2014年

26

使用PHP的empty()函数。以下内容被认为是空的

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

有关更多详细信息,请检查清空功能


6
Poster说他们不想将“ 0”视为空
dougd_in_nc

19

如果我做错了,我会谦虚地接受,但是我自己进行了测试,发现以下方法可以同时测试string(0)“”和NULL值变量:

if ( $question ) {
  // Handle success here
}

也可以颠倒来测试成功,例如:

if ( !$question ) {
  // Handle error here
}

我可以建议“ if(trim($ n))..”,否则,如果一个$ _POST var(例如)只是“”,它将被视为有效,而在大多数情况下,它和一个空字符串一样好
StartupGuy 2014年

如果“”对于特定功能而言不是可接受的值,那么使用trim将是一个好主意。
Adal 2014年

2
对于“ 0”,数字0或0.0和FALSE,这将返回false。
Vedmant

7

当心trim()函数的假阴性-在修剪之前它执行强制转换为字符串,因此,如果将空数组传递给它,则将返回例如“ Array”。根据您处理数据的方式,这可能不是问题,但是使用您提供的代码,question[]可以在POST数据中提供一个名为的字段,该字段似乎是非空字符串。相反,我建议:

$question = $_POST['question'];

if (!is_string || ($question = trim($question))) {
    // Handle error here
}

// If $question was a string, it will have been trimmed by this point

同上说如果您在期望字符串的地方得到一个数组,那应该是一个错误。如果希望使用数组,则应该为此使用单独的过滤功能。
OIS,

该代码不是将其视为错误吗?如果在其他地方进行过滤,则必须注意不要将args验证规则的知识复制到单独的位置。
grantwparks 2011年

3

没有更好的方法,但是由于这是您通常会经常进行的操作,因此最好将过程自动化。

大多数框架都提供了一种使参数解析变得容易的方法。您可以为此建立自己的对象。快速而肮脏的例子:

class Request
{

    // This is the spirit but you may want to make that cleaner :-)
    function get($key, $default=null, $from=null)
    {
         if ($from) :
             if (isset(${'_'.$from}[$key]));
                return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
         else
             if isset($_REQUEST[$key])
                return sanitize($_REQUEST[$key]);

         return $default;
    }

    // basics. Enforce it with filters according to your needs
    function sanitize($data)
    {
          return addslashes(trim($data));
    }

    // your rules here
    function isEmptyString($data)
    {
        return (trim($data) === "" or $data === null);
    }


    function exists($key) {}

    function setFlash($name, $value) {}

    [...]

}

$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

Symfony大量使用这种糖。

但是您所谈论的不止于此,您的“ // Handle error here”。您正在混合2个工作:获取数据并进行处理。这根本不一样。

您可以使用其他机制来验证数据。同样,框架可以向您展示最佳实践。

创建代表表单数据的对象,然后附加进程并回退到它。窃听一个快速的PHP脚本(这是第一次)听起来要做的工作要多得多,但是它具有可重用性,灵活性和错误率要低得多,因为使用常规PHP进行表单验证往往会很快成为spaguetti代码。


21
您所做的与他想要的完全相反...简单。
TravisO

2

这个检查数组字符串:

function is_set($val) {
  if(is_array($val)) return !empty($val);

  return strlen(trim($val)) ? true : false;
}

不错。PHPst的答案虽然相同,但更为简洁。
艾伦·拉隆德

2

为了更强大(制表,返回...),我定义:

function is_not_empty_string($str) {
    if (is_string($str) && trim($str, " \t\n\r\0") !== '')
        return true;
    else
        return false;
}

// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
    var_export($value);
    if (is_not_empty_string($value)) 
        print(" is a none empty string!\n");
    else
        print(" is not a string or is an empty string\n");
}

资料来源:


1

当你想检查是否提供了一个字段中的值,该字段可能是一个string,一个array,或undifined。所以,以下就足够了

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}

0

empty()曾用于此目的,但是empty()的行为已更改了数次。与往常一样,php文档始终是精确行为的最佳来源,这些页面上的注释通常提供了一段时间内变化的良好历史记录。如果要检查是否缺少对象属性,目前一种非常防御的方法是:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.