我想知道下面的问题是否有更好的想法,
我有一个包含许多输入字段的表单,例如
<input name="pg_title" type="text" value="" />
<input name="pg_subtitle" type="text" value="" />
<input name="pg_description" type="text" value="" />
<input name="pg_backdate" type="text" value="" />
etc
但有时我的表单中不需要上面的某些输入字段,例如,我只需要我的数据库注入的页面标题,
<input name="pg_title" type="text" value="" />
etc
我还有另一个php页面来处理$_POST
数据,
$pg_title = null;
$pg_subtitle = null;
$pg_description = null;
$pg_backdate = null;
if(isset($_POST['pg_title']) && !empty($_POST['pg_title']) ) $pg_title = $_POST['pg_title'];
if(isset($_POST['pg_subtitle']) && !empty($_POST['pg_subtitle']) ) $pg_subtitle = $_POST['pg_subtitle'];
if(isset($_POST['pg_description']) && !empty($_POST['pg_description']) ) $pg_description = $_POST['pg_description'];
if(isset($_POST['pg_backdate']) && !empty($_POST['pg_backdate']) ) $pg_backdate = $_POST['pg_backdate'];
每次我必须检查某个输入字段的$_POST
是否已设置且not empty
,否则其变量将设置为null
,这样我就不会注入进入我的数据库的空白区域。
当我有一长串要处理的变量时,我发现if条件中的isset
和!empty
非常重复。
上面的过程有“缩短”的默认php功能吗?或者我是否必须编写用户定义函数来处理这个问题?
或许还有另一种方法可以做到这一点?
感谢。
修改
非常感谢大家的帮助。
我的php页面中有一些额外的代码可以处理$ _POST数据,
$sql = "
UPDATE root_pages
SET
pg_url = ?,
pg_title = ?,
pg_subtitle = ?,
pg_backdate = ?,
pg_description = ?,
...
updated_by = ?
WHERE pg_id = ?
";
$result = $connection->run_query($sql,array(
$pg_url,
$pg_title,
$pg_subtitle,
$pg_backdate,
$pg_description,
...
$pg_id
));
如您所见,$pg_subtitle, $pg_backdate, $pg_description, etc
始终出现在我的查询中。所以当我没有数据时,如果我得到$pg_subtitle = ''
而不是$pg_subtitle = null
,我的数据库记录将为该列留出一个空的空间。
谢谢: - )
答案 0 :(得分:20)
isset && !empty
是多余的。 empty
语言构造基本上是!isset($foo) || !$foo
的简写,!empty
等同于isset($foo) && $foo
。因此,您可以通过省略isset
检查来缩短代码。
更简单的方法是:
$values = array('pg_title' => null, 'pg_subtitle' => null, …);
$values = array_merge($values, $_POST);
// use $values['pg_title'] etc.
如果您不希望 falsey 值覆盖默认的null
值,例如''
,您可以这样做:
$values = array_merge($values, array_filter($_POST));
请注意,'0'
也是 falsey 。
答案 1 :(得分:5)
您可以使用简单的功能
function post_value_or($key, $default = NULL) {
return isset($_POST[$key]) && !empty($_POST[$key]) ? $_POST[$key] : $default;
}
然后使用:
$pg_title = post_value_or('pg_title');
// OR with a default
$pg_title = post_value_or('pg_title', 'No Title');
答案 2 :(得分:5)
empty($var)
是!( isset($var) && $var )
的缩写。
所以!empty($_POST['...'])
足以满足您的需求 - 您目前的isset
电话是多余的。
答案 3 :(得分:2)
用户定义的功能,我担心。但它们足够短。如果你想看看,我有一个人躺在某个地方,但你可以想象它真的很小。
<强>更新强>
这是我发现的一个:
define('PARAM_INT', 0);
define('PARAM_STR', 1);
function get_param($name, $default = null, $type = PARAM_INT) {
$value = $default;
if (isset($_POST[$name])) {
$value = $_POST[$name];
}
else if (isset($_GET[$name])) {
$value = $_GET[$name];
}
switch($type) {
case PARAM_INT:
$value = (int)$value;
break;
case PARAM_STR:
break;
default:
// error your heart out here
}
return $value;
}
当然现在所有很酷的孩子都用filter_var
来做,但想法是一样的。
答案 4 :(得分:1)
array_merge()
的+1,但我认为这仍是简短形式:
if (isset($_POST['some_var']) and !empty($_POST['some_var'])) $some_var = $_POST['some_var'];
else $some_var = NULL;
应该是:
$some_var = $_POST['some_var'] ? $_POST['some_var'] : NULL;
是的,它会导致“未定义的索引”通知,但它会检查存在和空白
编辑:并且当然返回NULL,因为OP问。
在一项小型研究中,我发现了一个有趣的“控制流功能”,我之前从未使用过:NULLIF()
因此,您可以在没有PHP的情况下执行此任务。只需将所有变量包装在其中:
NULLIF('".$_REQUEST['some_var']."', '')
在您的查询中而不是'".$_REQUEST['some_var']."'
如果变量为空或不存在,则NULLIF('', '')
为'' == ''
,它将返回NULL。否则它将首先返回arg ==你的变量。
答案 5 :(得分:0)
考虑使用默认的filter extension filter_input
函数。您将避免缺少索引通知和同时进行数据清理。
答案 6 :(得分:0)
我总是把自己搞得那么无礼。但最好的方法是克服微优化咒语并使用为@
设计的语法结构。
isset()
。 (但至少我知道它不是很明亮。)
对于新项目,我现在使用object-oriented superglobals,它将过滤和隐式isset测试结合到$ _POST,$ _GET,$ _REQUEST包装器中。 $_REQUEST->ascii["title"]
或$_GET["raw"]
不再显示调试消息。
答案 7 :(得分:0)
此函数检查变量是否设置,不为空,最终是否有任何值。
/**
* @param var - testing variable
* @param value
* @return boolean
*/
function is(&$var, $value = null){
if(!is_null($value)){ return IsSet($var) && $var == $value; }
return IsSet($var) && !empty($var);
}
echo $_GET['id']; // this produce Warning
echo is($_GET['id'])?'1':'0'; // return false
echo $_GET['id']; // after first using function is(), will not be produce Warning!!!
is($_GET['id']); // return false
IsSet($_GET['id']); // return false
$_GET['id'] = 7;
is($_GET['id'], 7); // return true;
答案 8 :(得分:0)
我没有足够的代表发表评论。但是,vladkras使用的建议:
$some_var = $_POST['some_var'] ? $_POST['some_var'] : NULL;
不符合E_ALL。您应该在使用empty()或isset()访问它们之前检查数组键,就像其他人建议的那样。特别是对于用户输入。
另外,他的第二个建议是使用MySQL函数&#34; NULLIF()&#34;按以下方式:
NULLIF('".$_REQUEST['some_var']."', '')
更糟糕。将未经过处理的用户输入直接插入SQL查询是SQL注入攻击的主要载体。
答案 9 :(得分:0)
您可以创建一个小函数来为您简单地完成这项工作。
function sc_post_isset(...$args) {
$exists = true;
foreach($args as $arg) {
if ( !isset($_POST[$arg]) || empty($_POST[$arg]) ) {
$exists = false;
}
}
return $exists;
}
使用,
if(sc_post_isset('key')) {
// it exists.
}
或
if(sc_post_isset('key1', 'key2', 'key3')) {
// it exists.
}
它只是简单地检查所有提供的键是否存在于 $_POST 中并且不为空
答案 10 :(得分:-1)
这是一个有趣的问题,我等待答案。
但是,小技巧,你可以内联:
$pg_title = isset($_POST['pg_title']) && !empty($_POST['pg_title']) ? $_POST['pg_title'] : null;