将 $_POST 写入是不良实践吗?

10
如果这是 file_1.php 文件。
<?php

  $_POST["test_message"] = "Hello, world";    

  header("Location: http://localhost/file_2.php");
?>

这是file_2.php文件。

<html>
<head>
</head>
<body>

<?php

  if (!(isset($_POST["test_message"])))
    echo "Test message is not set";
  else
    echo $_POST["test_message"];
?>

</body>
</html>

输出是Test message is not set

这使我想知道是否可以写入$_POST,然后我想知道这样做是否是不好的做法。我应该让带有提交按钮和method=post的表单为我写入$_POST,还是可以将数据写入$_POST以在文件之间传递数据?


更不用说这是一种不好的做法了:这根本不是你将数据发布到另一个文件的方式,这行不通。 - oezi
1
如果您正在使用应用程序的一部分过滤帖子数据,然后另一部分获取该数据并且这两个部分需要完全解耦,那么这可能不是一个坏习惯。否则,您可能有更好的方法来完成您正在进行的任何操作。 - Dagg Nabbit
7个回答

18

你应该使用 $_SESSION

$_POST 是用于存储通过 POST 方法提交到当前页面的数据,它在页面间没有保持状态的能力。只有在重定向时,如果你实际上提交了一些数据到第二个文件,那么它才会被填充。如果你是在包含第二个文件而不是通过 HTTP 头进行重定向的话,那么你所做的就可以工作,因为 $_POST 变量仍然会被设置。

$_SESSION 将维护变量的状态,所以当你需要重定向时,使用它可以实现你想要的效果。

要正确地使用 $_SESSION,你需要首先调用 session_start(); 来开始会话. 更多信息可以查看PHP 手册


6
在file2.php中,$_POST["test_message"]为空,因为您实际上没有向该脚本提交任何内容。 $_POST数组是通过POST表单数据填充的,您可以通过将GET变量附加到标头重定向来填充$_GET,或者在需要页面之间的数据持久性时将数据存储在$_SESSION中。

你是在说$_POST只能从使用“method=post”的HTML表单中写入吗? - Mawg says reinstate Monica
1
正如PHP手册所述,$_POST是“...通过HTTP POST方法传递给当前脚本的变量的关联数组。”http://php.net/manual/en/reserved.variables.post.php - robjmills

3
从Web服务器的角度来看:它接收到一个请求,请求的是file_1.php文件,运行该PHP文件并返回结果,其中包括一个Location:头。然后一段时间后,它接收到另一个请求,请求的是file_2.php文件,因此加载并运行该文件并返回结果,这是一个HTML页面。重点是,这两个文件在完全不同的HTTP请求中使用。每个文件都在单独的环境中运行,因此例如,在一个文件中对变量所做的任何更改不会反映在另一个文件中。对于file_1.php请求中的$_POSTfile_2.php请求中的$_POST而言,它们是不同的变量。
至于您实际的问题:我认为您可以写入$_POST,但这可能并不推荐。那不是这个变量的真正用途。

+1 感谢让我思考; 这使得问题变得非常清晰。 - Mawg says reinstate Monica

3

一般来说,$_POST 只是一个常规的 PHP 数组,在每次请求时都会填充 POST 数据。因此,您可以将自己的值写入 $_POST

但是...

1) 您的代码不起作用,因为在 file_1.php 中的 header() 调用指示浏览器发出新的请求,这会导致在 file_2.php 中完全新的(且为空的)$_POST 数组。数组将为空,因为您没有向 file_2.php 提交任何内容。

2) 在我看来,这确实是不好的实践... 从 $_POST(或 $_GET$_REQUEST)中获取数据表示您正在检索应该谨慎处理的用户数据(过滤、净化、转义等)。将内部数据写入这些数组将混淆内部和外部数据,从而导致混乱和可能的安全漏洞。


2

完全可以这样做。如果你看一下所有大型的php框架(如CI,cake,joomla等),它们都通过控制器通过index.php页面发布到最终目的地(通常使用一些辅助代码)。因此,$_POST变量被深埋在很多层中。记住,$_POST变量只在http请求活动期间有效,因此当请求完成时,所有变量都会重置为null。

如果您想要在请求之间保持状态,则可以使用$_SESSION变量-但这取决于您的要求和场景。


1

$_POST 应该只用于表单,而不是像这样的情况:

$_POST["test_message"] = "Hello, world";

您还需要确保避免任何安全风险,使用函数如 stripslashesmysql_real_escape_string(插入数据库时)

为了在页面之间维护状态,您需要使用 sessions


1

你的示例无法工作,请查看其他人的答案,其中解释了原因。

此外,在我的看法中,使用 $_POST 超全局变量作为数据存储是一个相当糟糕的想法。如果需要,使用特定的变量共享解决方案(如数据库、内存注册表、会话、cookie 等)。


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