8
$p = (isset($_REQUEST["p"])?$_REQUEST["p"]:"");

这是我通常在我的 php 代码中使用的常用行。我一直认为是否有更好(小而快)的方式来编写相同的内容?

4

8 回答 8

19

创建自己的功能:

function getIfSet(&$value, $default = null)
{
    return isset($value) ? $value : $default;
}

$p = getIfSet($_REQUEST['p']);

没有其他干净的解决方案。

于 2012-10-17T11:49:42.480 回答
7

你想要多短?

当然,如果您每次访问请求值时都使用它,您应该在某处创建一个函数,然后使用它:

function reqVal( $val, $default = "", $no_sql = true )
{
    $var = isset( $_REQUEST[$val] ) ? $_REQUEST[$val] : $default;
    $var = $no_sql ? nosql( $var ) : $var;
    return $var;
}

function getVal( $val, $default = "", $no_sql = true )
{
    $var = isset( $_GET[$val] ) ? $_GET[$val] : $default;
    $var = $no_sql ? nosql( $var ) : $var;
    return $var;
}

function postVal( $val, $default = "", $no_sql = true )
{
    $var = isset( $_POST[$val] ) ? $_POST[$val] : $default;
    $var = $no_sql ? nosql( $var ) : $var;
    return $var;
}

现在添加 sql 注入检查:

function nosql( $var )
{
    if ( is_array( $var ) ) {
        foreach ( $var as $key => $elem ) $var[$key] = nosql( $elem );
    } else if ( $var === null ) {
        return null;
    } else {
        if ( get_magic_quotes_gpc() ) $var = stripslashes( $var );
        $var = mysql_real_escape_string( $var );
    }
    return $var;
}

并且总是像这样简单地访问它:

$p = reqVal( 'p', 0 );
$p = getVal( 'p', 'something', false );
$p = postVal( 'p' ); // or just forget the 2nd and 3rd parameter
于 2012-10-17T11:49:31.730 回答
5

编辑:PHP 7 添加了一个空合并运算符(“??”)

$p = $_REQUEST["p"] ?? '';

https://www.php.net/manual/en/migration70.new-features.php


原来的:

如果您想要更短的内容,并且满足于空(字符串)默认值,则可以使用以下方法:

$p = @$_REQUEST['p'];

@ 是错误抑制运算符,如果未设置该值,它将阻止表达式发出警告。

http://www.php.net/manual/en/language.operators.errorcontrol.php

于 2014-01-17T16:50:13.967 回答
2

我通常利用 PHP 类型松散的事实,然后简单地执行以下操作:

$p = (string) $_REQUEST['p'];

这样,即使$_REQUEST['p']未设置,空字符串仍会存储到$p. 请记住,这仅在您的错误处理程序忽略通知时才有效,因为访问未设置的键将触发类似于E_NOTICEundefined index”的行。

于 2012-10-17T11:50:42.030 回答
0

这确实很常见,我想知道在 PHP 中没有本地方法。大多数开发人员编写自己的函数来安全地从数组中读取。

/**
 * Gets the value associated with the specified key from an array.
 * @param array $array The array to search for the key.
 * @param mixed $key The key of the value to get.
 * @param mixed $default The default value to return, if the
 *   specified key does not exist.
 * @return mixed Value that is associated with the specified
 *   key, or the default value, if no such key exists.
 */
function getValueFromArray($array, $key, $default = null)
{
  $containsKey = isset($array[$key]);
  if ($containsKey)
    return $array[$key];
  else
    return $default;
}

/**
 * Gets the value associated with the specified key from an array.
 * @param array $array The array to search for the key.
 * @param mixed $key The key of the value to get.
 * @param mixed $value Retrieves the found value, or is set to null
 *   if the key could not be found.
 * @return bool Returns true if the key could be found, otherwise false.
 */
public function tryGetValueFromArray($array, $key, &$value)
{
  $containsKey = isset($array[$key]);
  if ($containsKey)
    $value = $array[$key];
  else
    $value = null;
  return $containsKey;
}
于 2012-10-17T11:52:34.183 回答
0

您可以在http://php.net/manual/en/function.isset.phpUser Contributed Notes部分找到许多不同解决方案的示例。

试试这个:

function get_if_set( $varname, $parent=null ) { 
    if ( !is_array( $parent ) && !is_object($parent) ) { 
        $parent = $GLOBALS; 
    }
    return array_key_exists( $varname, $parent ) ? $parent[$varname] : null; 
} 
于 2012-10-17T12:01:43.530 回答
0

将现有代码包装在函数中的答案很好——如果你有一堆代码,它们确实会整理代码。

然而,更好的解决方案是在开始之前根据一组预期值清理整个请求数组。

例如:

function sanitiseRequest() {
    $expected = array(
        'p' => '',
        'id' => 0,
        //etc
    );

    //throw away any input that wasn't expected...
    foreach($_REQUEST as $key=>$value) {
        if(!isset($expected[$key]) { unset $_REQUEST[$key]; }
    }
    //and for any expected values that weren't passed, set them to the defaults.
    foreach($expected as $key=>$defvalue) {
        if(!isset($_REQUEST[$key]) { $_REQUEST[$key] = $defvalue; }
    }
}

然后只需在代码的开头添加对该函数的调用,您就不必担心isset($_REQUEST[..])在代码中的其他任何地方做任何事情。

可以扩展此概念以强制传入的参数也是正确的数据类型,或者您可能想要执行的任何其他数据清理。这可以让您完全相信传入的数据是按预期填充的。

希望有帮助。

于 2012-10-17T12:08:40.327 回答
0

这个对我很有效。而且你不必写两次名字。如果已设置,它不会更改 var。因此,使用 register_globals 对旧应用程序进行快速 n 脏转换是安全的。

function getIfSet($key, $default = null)
{
    global $$key;

    if(!isset($$key)){
        if(isset($_REQUEST[$key])){
            $$key=$_REQUEST[$key];
        }else{
            if(!is_null($default)){
                $$key = $default;
            }
        }
    }
}
function getIfSetArray($list){
    foreach($list as $item){
        getIfSet($item);
    }
}

getIfSet('varname');
getIfSetArray(['varname_1','varname_2']);

echo $varname;
echo $varname_1;
于 2015-05-12T17:16:03.067 回答