【问题标题】:Is there a way in PHP to capture ALL the information passed using the POST methodPHP中有没有办法捕获使用POST方法传递的所有信息
【发布时间】:2012-07-12 20:29:44
【问题描述】:

不久前,我问了一个关于在一个页面中多次使用相同的输入名称/隐藏名称的问题,但得到的答案不起作用,因为它表明我必须使用在字段名称后面加上括号,比如partno[]

我不能在我的表单中使用它,因为它被发送到的购物车只能识别某些字段名称,例如:partno、item、price、qty 等(我不能使用partno[], item[] 等)所以我真的需要能够获得多次使用的每个相同字段名称的所有值。当我使用方法GET 时,它将显示地址栏中使用的每个字段名称的所有值。您可以尝试this 并提交表单。查看地址栏中的网址。

我的新问题是:PHP 中有没有办法捕获使用POST 方法传递的所有信息? (就像上面示例中地址栏中显示的内容,但使用POST,而不是GET)。如果我能找到捕获它的方法,我可以解析它。

谢谢, 凯莉

【问题讨论】:

  • 只在您的表单中使用method="post"
  • @harakiri op 多次使用相同的参数,5x PartNo 等,正如您在他的示例网址中看到的那样。这不适用于 get 或 post。您仍然需要每个输入的唯一名称。
  • 这个限制和 name="brackets[]" 语法纯粹是 PHP 的事情,拥有多个同名输入是完全合法的。
  • 也许我没抓住重点,但是 PHP 在一个名为 $_REQUEST 的全局变量中加入了 $_GET 和 $_POST。我只用了几年(?),从来没有想过再次获取/发布
  • 我才意识到这确实是一个非常好的问题!

标签: php post get http-post


【解决方案1】:

您只需使用$_POST 而不是$_GET

因此,如果您以以下方式使用 get:

?something=somevalue

如果使用$_GET['something'] 捕获它,您现在将使用$_POST['something']

【讨论】:

  • 我相信 OP 问题的重点是访问具有相同名称的字段的值,而不使用像 name="items[]" 这样的括号表示法,从 post/get 切换不会有什么不同。 OP 已经在询问如何使用POST 执行此操作,所以我看不出这个答案的用途。我知道人们倾向于回答问题标题而不是阅读全文。
  • 我的回答没有让他使用names="items[]" 格式。您显然没有完全理解他尝试的原始方法,因为它与我提供的答案完全不同。我很确定他也是我回答的第一个投票者,所以是的。
  • 仔细阅读问题(另外,新用户在达到 15 代表之前不能投票,并且从个人资料中我看到 0 票投)。
【解决方案2】:

您可以直接从输入流中获取未污染的数据:

file_get_contents('php://input');

所以如果你有这样的事情:

<input name="type" value="val1">
<input name="type" value="val2">
<input name="type" value="val3">

你会得到这样的字符串:

type=val1&type=val2&type=val3

然后您可以将此字符串解析为一个数组并创建您自己的“原始帖子数据”。

http://php.net/manual/en/wrappers.php.php

php://input 是一个只读流,允许您读取原始数据 从请求正文。在 POST 请求的情况下,最好 使用 php://input 而不是 $HTTP_RAW_POST_DATA 因为它没有 依赖于特殊的 php.ini 指令。此外,对于那些情况 $HTTP_RAW_POST_DATA 默认不填充,它是一个潜在的 激活时内存占用较少的替代方案 always_populate_raw_post_data。 php://input 不适用于 enctype="multipart/form-data"。

【讨论】:

  • 我看了 php:// 但我不知道如何实现它。有了你提供的,我能够解决我的问题......非常感谢。凯利
  • 就像这样:$my_data = file_get_contents('php://input');,然后解析 $my_data 以获取您的变量(您表示您可以处理该部分,如果不能,请随时询问)。
【解决方案3】:

由于 PHP 中的 POST 只不过是一个数组,因此只需对其进行迭代。

foreach($_POST as $k => $v) {
   echo($k . ': '. $v . '<br>');
}

【讨论】:

  • 这样做的问题是,当创建$_POST 时,具有相同名称的多个输入将覆盖前一个输入,除非您使用bracketed[] 名称,OP 说他们不能这样做。跨度>
【解决方案4】:

如果您想查看所有 $_POST 发送的内容,请使用 var_dump($_POST) 或 echo print_r($_POST)。这将向您显示所有字段名称和数据,即使字段名称包含数组,例如您的 partno[]。

【讨论】:

    【解决方案5】:

    无法发布与字符串同名的 2 个输入。您应该修改购物车以将数组转换为字符串。

    如果您使用 GET,您可以查看parse_url() 函数。

    【讨论】:

    • 很可能多次使用参数名称,只有php解析请求的方式不允许您使用$_POST访问多个这样的参数,所以你有自己解析请求
    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多