【问题标题】:How to access all values posted to PHP server如何访问发布到 PHP 服务器的所有值
【发布时间】:2014-12-14 18:29:46
【问题描述】:

我最初以为是在$_POST 超级全局中,但如果值包含在 URL 中,则不是。

$_REQUEST 这样做了,让我惊讶的是不包括 cookie(参考 http://php.net/manual/en/reserved.variables.request.php),后来我发现我显然使用了默认的分发 php.ini 文件,它不包含 cookie 的“C”(参考http://php.net/manual/en/ini.core.php#ini.request-order)。但是,我不希望使用$_REQUEST,因为它不区分获取请求,并且更改服务器和 php.ini 文件可能会导致安全问题。

访问所有帖子值的正确方法是什么?

编辑。我添加了$real_post 部分。这是正确的做法吗?

<?php
setcookie('cookie', 'COOKIE', time() + (86400 * 30), "/");

echo('$_GET<pre>'.print_r($_GET,1).'</pre>');
echo('$_POST<pre>'.print_r($_POST,1).'</pre>');
echo('$_COOKIE<pre>'.print_r($_COOKIE,1).'</pre>');
echo('$_REQUEST<pre>'.print_r($_REQUEST,1).'</pre>');
$real_post=($_SERVER['REQUEST_METHOD'] == 'POST')?array_merge($_GET,$_POST):array(); 
echo('$real_post<pre>'.print_r($real_post,1).'</pre>');
?>

<form action='postorget.php?get=GET' method='post'>
    <input type='text' name='post' value='POST'>
    <input type='submit'>
</form>

$_GET

数组 ( [获取] => 获取)

$_POST

数组 ( [发布] => 发布)

$_COOKIE

数组 ( [cookie] => 饼干)

$_REQUEST

数组 ( [获取] => 获取 [发布] => 发布)

【问题讨论】:

  • 我很好奇 - 你为什么需要它?
  • @u_mulder 添加日志功能并希望跟踪所有 GET 和 POST 值,结果让我感到惊讶。

标签: php http


【解决方案1】:

你可以这样做:

$uVariables = array("GET" => $_GET, "POST" => $_POST, "COOKIES" => $_COOKIES, "SESSION" => $_SESSION);

然后使用 json_encode() 进行数据库存储。如果您以后决定构建一个日志查看器,您可以使用 json_decode() 并将所有内容恢复到原始状态。

【讨论】:

    【解决方案2】:

    抱歉,您的问题有点不清楚。附加到 URL 的参数(正如您在开头提到的)是 GET 参数,因此它们包含在 $_GET 超全局中。它们根本不是 POST 变量。那么你的问题是什么?您可以结合使用$_POST$_GET,或者,最好在两个 位置检查所需的参数。

    您可以在这样的事情上投入无穷无尽的时间,但一种方便的方法可能如下所示:

    $param = isset($_GET['param']) ? $_GET['param'] 
                                   : (isset($_POST['param']) ? $_POST['param'] 
                                                             : null);
    

    这行只是一个例子。它从超级全局变量$_GET $_POST 中检索一个名为“param”的参数,并将其存储在本地范围内的变量$params 中。通过这种方式,您可以访问您正在寻找的任何参数,无论它是作为 GET 还是作为 POST 参数发送的。我经常将它包装在一个方便的函数中,该函数还负责验证参数运行时值。

    您也可以将此示例包装在一个迭代循环中:

    $params = [
        'id'     => null, 
        'key'    => null, 
        'value'  => null, 
        'remark' => null
    ]; // just as examples
    foreach ($params as $key=>$null) {
        // alternative 1: store the value of param $key in a single local scalar variable
        // this results in local variables $id, $key, $value, $remark, just as examples
        $$key = isset($_GET[$key]) ? $_GET[$key] 
                                   : (isset($_POST[$key]) ? $_POST[$key] 
                                                          : null);
        // alternative 2: store the value of param $key in a general but local params array
        // this results in the above $params array, but filled with scalar values
        $params[$key] = isset($_GET[$key]) ? $_GET[$key] 
                                           : (isset($_POST[$key]) ? $_POST[$key] 
                                                                  : null);
    }
    

    这些实际上是两个示例。显然,您只需要此处循环内显示的两个语句之一。这取决于您更喜欢参数数组还是单独的局部标量变量。


    如果您正在寻找一种方法来获取 所有 GET 和 POST 参数,但实际上并不知道可能是哪个参数,那么您必须结合两个超级全局变量:

    $params = array_merge($_GET, $_POST);
    

    但是请注意,这是一个非常值得怀疑的架构。它通常会打开安全漏洞。

    【讨论】:

    • 我的理解是 GET 和 POST 请求永远不会同时发生,因此我不相信它们是 GET 值,而是真正的 POST 值,即使 PHP 将它们显示为 GET 变量。
    • 您是对的,您的请求是 GET 或 POST,而不是两者。但这确实 not 意味着您不能提供 GET POST 参数。也许你不应该,但你可以。
    • 虽然可以是 PUT/DELETE/OPTIONS
    • @DarkBee 这当然是对的,但不是这个问题的主题:-)
    • 这个解决方案只会访问一半的值。我“可以”做类似的事情并将两者合并,但这听起来不像“正确”的方式。
    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2017-03-30
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多