更好的方法来检查variables为空或空string?

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

我想确保:

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

这是我到目前为止:

$question = trim($_POST['question']); if ("" === "$question") { // Handle error here } 

必须有一个更简单的方法来做到这一点?

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

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

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

用你的variablesreplace$strNULL""都使用strlen时返回0。

使用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) 

有关更多详情,请查看空白function

我会虚心接受,如果我错了,但我testing了我自己的一端,发现以下作品testingstring(0)“”和NULL值variables:

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

也可以倒过来来testing成功的原因:

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

注意trim()函数的假阴性 – 在修剪之前它会执行一个cast-to-string,因此如果传递一个空数组,它将返回例如“Array”。 这可能不是问题,具体取决于您如何处理数据,但是使用您提供的代码,可以在POST数据中提供名为question[]的字段,并且显示为非空string。 相反,我会build议:

 $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 

没有更好的方法,但由于这是一个你经常做的操作,所以你最好自动化一下这个过程。

大多数框架提供了一个方法来parsing一个简单的任务参数。 你可以build立你自己的对象。 快速和肮脏的例子:

 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大量使用那种糖。

但是你说的比这更多,用你的“//处理错误在这里”。 您正在混合2个工作:获取数据并处理它。 这完全不一样。

还有其他的机制可以用来validation数据。 再次,框架可以展示给你最好的实践。

创build表示表单数据的对象,然后附加处理并回退。 这听起来有更多的工作要攻击一个快速的PHP脚本(这是第一次),但它是可重用的,灵活的,而且更不容易出错,因为使用通常的PHP进行表单validation往往会变成spaguetti代码。

这个检查数组string:

 function is_set($val) { if(is_array($val)) return !empty($val); return strlen(trim($val)) ? true : false; } 

当你想检查一个字段是否提供了一个值时,这个字段可能是一个string ,一个array ,或者是未定义的。 所以,以下就足够了

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

empty()用于为此工作,但empty()的行为已经多次更改。 与往常一样,PHP文档始终是确切行为的最佳来源,并且这些页面上的评论通常提供了随时间变化的良好历史logging。 如果你想检查对象属性的缺乏,目前一个非常防御的方法是:

 if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {