由于PHP是动态语言,检查提供的字段是否为空的最佳方法是什么?
我想确保:
这是我到目前为止所得到的:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
必须有一种更简单的方法吗?
答案 0 :(得分:261)
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
return (!isset($str) || trim($str) === '');
}
答案 1 :(得分:104)
旧帖子,但有人可能需要它,因为我做了;)
if (strlen($str) == 0){
do what ever
}
用您的变量替换$str
。
使用NULL
时,""
和strlen
都返回0。
答案 2 :(得分:29)
使用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)
有关详细信息,请查看empty function
答案 3 :(得分:19)
如果我错了,我会谦卑地接受,但我在自己的测试结果中发现以下内容适用于测试字符串(0)“”和NULL值变量:
if ( $question ) {
// Handle success here
}
也可以通过反转来测试成功:
if ( !$question ) {
// Handle error here
}
答案 4 :(得分:7)
注意来自trim()
函数的错误否定 - 它在修剪之前执行转换为字符串,因此将返回例如如果你传给一个空数组,则为“Array”。这可能不是问题,取决于您处理数据的方式,但使用您提供的代码,可以在POST数据中提供名为question[]
的字段,并且该字段看起来是非空字符串。相反,我建议:
$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
答案 5 :(得分: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大量使用那种糖。
但是你在谈论的不仅仅是这个,而是你在这里处理错误 你正在混合两个工作:获取数据并进行处理。这根本不相同。
您可以使用其他机制来验证数据。同样,框架可以向您展示最佳实践。
创建表示表单数据的对象,然后附加进程并回退到它。这听起来更多的工作是破解快速的PHP脚本(这是第一次),但它是可重用的,灵活的,并且更不容易出错,因为使用通常的PHP进行表单验证会很快变成spaguetti代码。
答案 6 :(得分:1)
如果要检查是否为字段提供了值,则该字段可以是string
,array
或未分类。所以,以下就足够了
function isSet($param)
{
return (is_array($param) && count($param)) || trim($param) !== '';
}
答案 7 :(得分:1)
这个检查数组和字符串:
function is_set($val) {
if(is_array($val)) return !empty($val);
return strlen(trim($val)) ? true : false;
}
答案 8 :(得分:1)
为了更强大(制表,返回……),我定义:
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");
}
来源:
答案 9 :(得分:0)
empty()用于此操作,但empty()的行为已多次更改。与往常一样,php文档始终是确切行为的最佳来源,这些页面上的注释通常提供了随时间变化的良好历史记录。如果你想检查缺少对象属性,那么目前非常防御的方法是:
if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {