写入$ _POST是不好的做法?

时间:2010-07-13 08:13:23

标签: php

如果是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,并且想知道,我想知道这样做是不好的做法。我应该让提交按钮和方法的表单为我写邮件给$ _POST,还是写入$ _POST在文件之间传递数据是合法的?

7 个答案:

答案 0 :(得分:15)

您想改用$_SESSION

$_POST用于已发布到当前页面的信息,并且不会在页面加载之间保持状态,只有在重定向时实际将某些内容发布到第二个文件时才会填充它。如果你要包含第二个文件,而不是通过标题重定向,那么你所做的就可以了,因为$_POST变量仍然会被设置。

$_SESSION将保持页面之间的状态,因此在重定向时将完成您想要的操作。

要正确使用$_SESSION,您需要先致电session_start();才能开始会话。 PHP manual中有更多信息。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

这样做绝对没问题。如果你看看所有大的PHP框架(CI,蛋糕,joomla等),他们都会通过index.php页面发送一个控制器到最终目的地(通常使用一些帮助代码)。因此,$ _POST变量埋藏了很多层。请记住,当http请求处于活动状态时,$ _POST变量仅对该短暂时刻有效,因此当请求完成时,所有变量都将重置为null。

如果你想在请求之间保持持久性,可以使用$ _SESSION变量 - 这取决于你的要求和场景。

答案 3 :(得分:2)

从Web服务器的角度来看:它接收file_1.php的请求,运行该PHP文件,然后发回结果,该结果恰好包含Location:标头。然后一段时间后,它收到file_2.php的单独请求,因此它加载并运行该文件并发回结果,这是一个HTML页面。关键是,这两个文件用于完全独立的HTTP请求。每个都在一个单独的环境中运行,因此,例如,对一个变量所做的任何更改都不会反映在另一个环境中。 $_POST请求中的file_1.php是与$_POST请求中file_2.php的单独变量。

就你的实际问题而言:我认为你可以写信给$_POST,但可能不推荐。这不是变量的用途。

答案 4 :(得分:1)

$_POST只能与不是这样的表单一起使用:

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

您还需要确保避免任何安全风险,使用stripslashesmysql_real_escape_string等功能(在数据库中插入数据时)

要维护页面之间的状态,您需要使用 sessions

答案 5 :(得分:1)

通常说$_POST只是一个常规的PHP数组,每个请求都填充了POST数据。因此,可以将自己的值写入$_POST

但是...

1)您的代码无效,因为header()中的file_1.php调用指示浏览器发出新请求,从而导致一个全新的(并且为空)$_POST数组file_2.php。数组将为空,因为您没有向file_2.php发布任何内容。

2)在我看来,这确实是不好的做法......从$_POST(或$_GET$_REQUEST)获取数据表明您正在检索应该使用的用户数据极端谨慎(过滤,消毒,逃避......)。将内部数据写入这些阵列会混淆内部和外部数据,从而导致混淆和可能的安全漏洞。

答案 6 :(得分:1)

你的例子无法奏效,请参阅解释原因的其他答案。

此外,使用$ _POST超全局作为数据存储是一个非常糟糕的主意。如果需要,可以使用特定的变量共享解决方案(如数据库,内存注册表,会话,cookie等)