2

是否有分配$_GET['values']给变量的快捷方法?

我目前和其他人一样:

if(isset($_GET['type'],$_GET['case'])
   $type = $_GET['type'];
   $case = $_GET['case'];

有没有更清洁的方法来做到这一点,而不是像下面那样单独做。

 $type = $_GET['type'];
 $case = $_GET['case'];
4

8 回答 8

4

我能想到的唯一一行代码,以确保您仍然进行必要的检查,是

$type = (isset($_GET['type'])) ? $_GET['type'] : 'a default value or false';

阅读评论,我知道您可能想要这样做:

foreach($_GET as $key=>$value) {
  $$key = $value;
}

不过,我建议始终初始化您只需要的变量。上面的代码将导致获取未知变量,这实际上可能为用户提供了一种操作脚本的方法。
例子:

index.php?ExpectedVar=1&UserDefinedVar=2

将在您的代码中生成以下变量:

$ExpectedVar // 1 <- you wanted this one
$UserDefinedVar // 2 <- but what about this?

如果你有这个脚本被其他脚本调用怎么办?
然后,即使您在文件顶部有此代码,您也可能会从用户定义的 $_GET 中覆盖一些变量!

灾难案例场景:
script1.php

<?php 
  $tableToDelete = "old_products";
  include("script2.php");
?>

脚本2.php

<?php
  foreach($_GET as $key=>$value) {
    $$key = $value;
  }
  // user added &tableToDelete=users
  // DROP TABLE $table
  // will gloriously delete users
?>

相反,通过使用我发布的原始代码编写几行代码,您可以在 php 脚本的开头获取所需的变量并清楚地使用它们。

于 2013-09-26T09:04:55.063 回答
4

好吧,使用数组映射,您不仅可以获取case一次,还可以一次获取全部,您还可以同时检查isset()empty()

假设你有这个 URL:read.php?id=1&name=foo&job=student&country=Brazil

您的问题是获取$_GET类型,您可能需要检查它是否empty/isset正确?

好吧,首先你创建一个函数来遍历它。

function checkGet($val){
    return (isset($val) && !empty($val)) ? $val : null;

}

然后,您使用回调该函数array_map()

$check = array_map('checkGet', $_GET);

就是这样!

如果你var_dump($check);现在做,你会得到所有的类型和值:

array (size=4)
  'id' => string '1' (length=1)
  'name' => string 'foo' (length=3)
  'job' => string 'student' (length=7)
  'country' => string 'Brazil' (length=6)

意思是,在此之后,不做:

if(isset($_GET['something']) && !empty($_GET['something']))
$var = $_GET['something'];
echo $var; 

做就是了:

echo $check['something']
于 2013-09-26T09:11:32.600 回答
4

http://docs.php.net/extract

我认为您正在寻找extract功能。

extract($_GET); //now, all of the functions are in current symbol table

于 2013-09-26T09:05:19.703 回答
1

试试喜欢

foreach($_GET as $key=>$value) {
     $get_arr[$key] = $_GET[$key];
}
print_r($get_arr);
于 2013-09-26T09:04:46.373 回答
0

你可以通过extract()

extract($_GET, EXTR_PREFIX_ALL, 'g');

以便

$_GET['val']变成$g_val

注意第三个参数:gg_在键之前。

于 2013-09-26T09:17:02.563 回答
0

我会这样做,这样你就可以确保它只会返回 TRUE 或 FALSE

if (!isset($_GET['type']) || empty($_GET['type'])) {

// Display error

} else {    

$type = $_GET['type'];
$case = $_GET['case'];  

}

或者你也可以这样做

$type = (isset($_GET['type'])===false)?'':trim($_GET['type']);
$case = (isset($_GET['case'])===false)?'':trim($_GET['case']);
于 2013-09-26T09:09:22.813 回答
0

$_GET 是表,因此您可以轻松使用 foreach 函数

例如

foreach ($_GET as $key => $value) {
... = $value;
}

如果您想使用 $key 名称创建变量,请使用变量 variables PHP Manual Variable Variables

于 2013-09-26T09:09:53.010 回答
0

这个(未经测试的)类应该可以帮助你:

class MyGet {
    public static $myValues = array();

    public static function setMyValues($keywords, $where) {
        MyGet::$myValues = array();
        for ($index = 0; $index < count($keywords); $index++) {
            if ((!(isset($where[$keywords[$index]]))) || (empty($where[$keywords[$index]]))) {
                MyGet::$myValues = array();
                return false;
            }
            MyGet::$myValues[$keywords[$index]] = $where[$keywords[$index]];
        }
    }
}

你可以像这样使用它:

if (MyGet::setMyValues(array(0 => "type", 1 => "case"), $_GET)) {
    //the values are initialized
} else {
    //the values are not initialized
}
于 2013-09-26T09:24:11.350 回答