由于PHP是一种动态语言,因此检查提供的字段是否为空的最佳方法是什么?
我要确保:
- null被认为是一个空字符串
- 只有空格的字符串被认为是空的
- “ 0”不被认为是空的
到目前为止,这是我得到的:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
必须有一个更简单的方法吗?
由于PHP是一种动态语言,因此检查提供的字段是否为空的最佳方法是什么?
我要确保:
到目前为止,这是我得到的:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
必须有一个更简单的方法吗?
Answers:
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
return (!isset($str) || trim($str) === '');
}
旧帖子,但有人可能像我一样需要它;)
if (strlen($str) == 0){
do what ever
}
$str
用您的变量替换。
NULL
并且""
使用时都返回0 strlen
。
if(strcmp('', $var) == 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)
有关更多详细信息,请检查清空功能
如果我做错了,我会谦虚地接受,但是我自己进行了测试,发现以下方法可以同时测试string(0)“”和NULL值变量:
if ( $question ) {
// Handle success here
}
也可以颠倒来测试成功,例如:
if ( !$question ) {
// Handle error here
}
当心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
没有更好的方法,但是由于这是您通常会经常进行的操作,因此最好将过程自动化。
大多数框架都提供了一种使参数解析变得容易的方法。您可以为此建立自己的对象。快速而肮脏的例子:
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代码。
为了更强大(制表,返回...),我定义:
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");
}
资料来源: