如果是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在文件之间传递数据是合法的?
答案 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";
您还需要确保避免任何安全风险,使用stripslashes
和mysql_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等)