【问题标题】:Is it bad practice to write to $_POST?写 $_POST 是不好的做法吗?
【发布时间】:2010-07-13 08:13:23
【问题描述】:

如果这是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 以在文件之间传递数据是否合法?

【问题讨论】:

  • 更不用说这是否是不好的做法:这根本不是您可以将数据发布到另一个文件的方式,这是行不通的。
  • 如果您在应用程序的另一部分获取帖子数据之前使用应用程序的一部分过滤帖子数据并且这两个部分需要完全解耦,这可能不是一个坏习惯。否则,可能有更好的方法来做你正在做的任何事情。

标签: php


【解决方案1】:

您想改用$_SESSION

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

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

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

【讨论】:

  • 这看起来像是答案+1
【解决方案2】:

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

但是……

1) 您的代码不起作用,因为您在 file_1.php 中的 header() 调用指示浏览器发出一个新请求,这会在 file_2.php 中生成一个全新的(和空的)$_POST 数组。该数组将为空,因为您没有向 file_2.php 发布任何内容。

2) 在我看来,这确实是一种不好的做法...从$_POST(或$_GET$_REQUEST)获取数据表明您正在检索用户数据,应该非常小心地处理(过滤、清理,转义,...)。将内部数据写入这些数组会混淆内部和外部数据,从而导致混乱和可能的安全漏洞。

【讨论】:

    【解决方案3】:

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

    就您的实际问题而言:我认为您可以写信给$_POST,但可能不建议这样做。这不是变量的真正用途。

    【讨论】:

    • +1 感谢您让我思考;这很清楚。
    【解决方案4】:

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

    【讨论】:

    • 您是说 $_POST 只能从带有“emthod=post”的 HTML 表单写入?
    • 正如 PHP 手册所说,$_POST 是“...通过 HTTP POST 方法传递给当前脚本的变量关联数组。” php.net/manual/en/reserved.variables.post.php
    【解决方案5】:

    这样做绝对没问题。如果您查看所有大型 php 框架(CI、cake、joomla 等),它们都通过 index.php 页面通过控制器发布到最终目的地(通常使用一些帮助代码)。因此,$_POST 变量被深埋了好几层。请记住,$_POST 变量仅在 http 请求处于活动状态时的过渡时刻有效,因此当请求完成时,所有变量都将重置为 null。

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

    【讨论】:

      【解决方案6】:

      $_POST 只能用于不这样的表单:

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

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

      要保持页面之间的状态,您需要改用sessions

      【讨论】:

        【解决方案7】:

        您的示例无法正常工作,请参阅其他答案以解释原因。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多