$p = (isset($_REQUEST["p"])?$_REQUEST["p"]:"");
这是我通常在我的 php 代码中使用的常用行。我一直认为是否有更好(小而快)的方式来编写相同的内容?
创建自己的功能:
function getIfSet(&$value, $default = null)
{
return isset($value) ? $value : $default;
}
$p = getIfSet($_REQUEST['p']);
没有其他干净的解决方案。
你想要多短?
当然,如果您每次访问请求值时都使用它,您应该在某处创建一个函数,然后使用它:
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
编辑: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
我通常利用 PHP 类型松散的事实,然后简单地执行以下操作:
$p = (string) $_REQUEST['p'];
这样,即使$_REQUEST['p']
未设置,空字符串仍会存储到$p
. 请记住,这仅在您的错误处理程序忽略通知时才有效,因为访问未设置的键将触发类似于E_NOTICE
“ undefined index
”的行。
这确实很常见,我想知道在 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;
}
您可以在http://php.net/manual/en/function.isset.php的User 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;
}
将现有代码包装在函数中的答案很好——如果你有一堆代码,它们确实会整理代码。
然而,更好的解决方案是在开始之前根据一组预期值清理整个请求数组。
例如:
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[..])
在代码中的其他任何地方做任何事情。
可以扩展此概念以强制传入的参数也是正确的数据类型,或者您可能想要执行的任何其他数据清理。这可以让您完全相信传入的数据是按预期填充的。
希望有帮助。
这个对我很有效。而且你不必写两次名字。如果已设置,它不会更改 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;