PHP:isset的一个捷径而且是空的?

时间:2011-03-22 01:48:33

标签: php function

我想知道下面的问题是否有更好的想法,

我有一个包含许多输入字段的表单,例如

<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,我的数据库记录将为该列留出一个空的空间。

谢谢: - )

11 个答案:

答案 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;