在PHP中自动处理POST和GET

时间:2012-04-18 09:00:19

标签: php function post get

是否有一种方法或一段代码可以查找POST和GET数据并将其转换为普通变量?

我的意思是:

$_POST["hello"] = "Wow."

$hello = "Wow."

但也可以自动完成并使用许多POSTS和GETS,所以这样:

$_POST["name"]="John"; 
$_GET["email"]="john@john.com"; 
$_POST["sex"]="male";

$name="John"; 
$email="john@john.com"; 
$sex="male";

我知道第二个例子是不可能的(你不能同时获得GET和POST数据(或者我知道),但是想法是该页面是获取GET还是POST变量它应该转为它自动变成变量。

那么有什么功能可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您可以使用extract()extract($_REQUEST);$_REQUEST合并$_POST$_GET

但我会将其视为不良做法,因为它会为您的代码添加一些黑魔法,从而导致不可预测的情况。它也很容易被利用:

考虑你有一个变量:$secret = 100;,任何人都不应该改变 现在是一个变态的用户,并在表单提交中注入以下POST变量:$_POST['secret'] = 200;
在那里你有剥削!

答案 1 :(得分:1)

您可以使用Extract,它适用于所有类型的数组。

<?php

/* Suppose that $var_array is an array returned from
   wddx_deserialize */

$size = "large";
$var_array = array("color" => "blue",
                   "size"  => "medium",
                   "shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");

echo "$color, $size, $shape, $wddx_size\n";

?>
  

编辑:我不认为这是一个好习惯

答案 2 :(得分:0)

我意识到这是一篇非常古老的帖子,但如果有人在看,这里就是答案。

有一种安全的方法可以自动执行此操作,而无需在$ _POST上使用提取,这是一个安全风险,如上所述。如果您为它提供了一个简单的键数组,这个函数将适用于$ _POST。

function post_params($arr){

    $pp = array();
    foreach($arr AS $key){
        if(isset($_POST[$key])){
            $pp[$key] = $_POST[$key];
        }
    }

    return $pp;
}

然后当您调用该函数时,请执行以下操作:

$expected_post_keys = array('firstname','lastname');
$safe_post_arr = post_params($expected_post_keys);
extract($safe_post_arr);

对于$ _GET你可以采取一些额外的措施(你也可以这样做,也可以用$ _POST):

function get_params($arr){
    // arr predefined explicitly - do not call with _GET as argument
    $gp = array();
    foreach($arr as $key){

        if(isset($_GET[$key])){
            $gp[$key] = htmlspecialchars($_GET[$key]);
        }else{
            $gp[$key] = 0;
        }

    }
    return $gp;
}

当你调用这个函数时:

$valid_get_keys = array('id','action');
$safe_get_arr = get_params($valid_get_keys);
extract($safe_get_arr );

此方法为您提供您期望的每个变量/键,但如果它们未在$ _GET中定义,则它们的值为0.

如果你必须经常这样做,只需将两个方法放在一个类中,就可以实现自动化。您需要检索_GET或_POST的任何脚本,您可以调用该类,然后通过提供必要的密钥来调用您需要的任何方法。