PHP:是否能够自动获取所有的POST数据?

67

简单问题:是否可以获取页面上所有已发布的数据,即使您不知道所有字段?

例如,我想编写一个简单的脚本,收集任何已发布的数据并通过电子邮件发送。我预见到表单中的字段随着时间的推移可能会经常变化,因此为了长远考虑节省时间,我想知道是否可以编写自动收集所有数据的代码?

这种方式是否可行?


2
当然,只需使用全局数组 $_POST、$_GET、$_SERVER 等即可。 - Khurram Ijaz
3
可能是如何在PHP中获取所有POST变量的重复问题。 - mario
9个回答

127
当然。只需要遍历$_POST数组即可:
foreach ($_POST as $key => $value) {
    echo "Field ".htmlspecialchars($key)." is ".htmlspecialchars($value)."<br>";
}

6
请注意,未被选中的复选框不会出现在 $_POST 数组中,因此如果您使用复选框,您需要使用 isset 等方法进行不同的处理。 - jeroen
如果有文件,它会随之而来吗? - bhawin
$_GET可以使用相同的方法吗? - Kaspar L. Palgi

49

没有人提到原始发布数据(Raw Post Data),但需要知道的是,如果发布的数据没有键(key),只有值(value),请使用原始发布数据(Raw Post Data)

$postdata = file_get_contents("php://input");

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"时不可用。


8
是的,你可以简单地使用。
     $input_data = $_POST;

或者使用extract()函数可能对你有用。

6
extract($_POST)将模拟register_globals,不要这样做。 - netcoder
1
@netcoder;我只是建议他,这也是一个有用的选项。你能否给我一个例子,让你的评论更有价值? - xkeshav
1
在未过滤/未经消毒的用户提供数据上使用extract是非常糟糕的想法。请为自己着想,不要将不安全因素融入到您的代码中。 - mickmackusa

5

4
只要您不需要任何特殊格式:是的。
foreach ($_POST as $key => $value) 
    $body .= $key . ' -> ' . $value . '<br>';

显然,需要更多的格式化处理,但这是“简单”的方法。除非我误解了问题。
您也可以像这样做(如果您喜欢这种格式,它肯定更容易):
$body = print_r($_POST, true);

+1 后面的建议($body = print_r($_POST, true);)对我来说是最简单的,而且不需要遍历子元素。在开发 Webhook 应用程序时,我只需要暂时查看原始的 POST 内容。 - SteveCinq

2
您可以使用array_keys()来检索$_POST数组的所有键,然后使用这些键的值构造电子邮件消息。 var_dump($_POST)还可以为您转储有关$_POST中所有信息的信息。

1

您可以使用$_REQUEST$_POST来获取所有的数据,包括Post、Get和Cookie数据。


1

补充一下,var_export 也可能很方便:

$email_text = var_export($_POST, true);

0

只需回显 $_POST 的所有数据。

echo json_encode($_POST);

你也可以这样做以获得更好的视觉效果。

echo var_dump($_POST);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接