【问题标题】:Included PHP scripts can't access $_POST when output buffering?输出缓冲时,包含的 PHP 脚本无法访问 $_POST?
【发布时间】:2010-08-07 06:53:10
【问题描述】:

我有一个 HTML 表单 POST 到以下 index.php:

<?php require_once("/home/full/path/to/included/file.php"); ?>

在 file.php 中,我正在尝试访问 $_POST:

ob_start();
session_start();
var_dump($_POST);
$contents = ob_get_contents();
ob_end_clean();
echo $contents;

但是 var_dump($_POST) 返回一个空数组。

将ob函数移动到index.php没有任何效果。

如果我将 var_dump($_POST) 放在 ob_start() 之前,或者如果我完全删除输出缓冲,问题就会消失,但我需要输出缓冲。因此,为了解决问题,我尝试将表单数据发布到 test.php:

ob_start();
$session_start;
var_dump($_POST);
$contents = ob_get_contents();
ob_end_clean();
echo $contents;

它显示一切正常。所以我的 file.php 的问题似乎是它既包含在内,又使用输出缓冲。你看到我的设置有问题吗?为什么 $_POST 不能被包含的输出缓冲脚本访问?您是否看到解决此问题的方法或替代方法?谢谢。

编辑: 另一个可能的因素: 我的 HTML 表单标签是这样的:

<form action="/" method="POST">

我使用 mod_rewrite 将其重定向到 index.php。我尝试了 action="/index.php" 并没有任何变化,所以没关系。

【问题讨论】:

  • 您不使用 HTTP url 而不是文件系统路径“包含”它吗?路径看起来不错,但这是最可能的原因
  • 我使用文件系统路径包含它,因为它位于文档根目录之外(它包含敏感数据,我不希望它被公开访问,无论是否受 .htaccess 保护)。跨度>

标签: php forms post include output-buffering


【解决方案1】:

我意识到我的问题的原因。删除输出缓冲后,我仔细查看了错误消息,并意识到我的 file.php 中有一个 header("Location: ...") 调用。我正在重定向到另一个我试图调用 $_POST 信息的脚本。但是 $_POST 信息显然不会与 header() 重定向一起传输。

有趣的是,我有一个 var_dump($_POST) header() 调用之前。而且我猜测输出缓冲导致首先发送 header() 调用,因此在缓冲区中没有显示之后的输出,因为 header("Location") 重定向而不显示任何脚本输出。听起来对吗?

(回答我自己的问题https://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions

【讨论】:

  • 有道理。这就是为什么我总是在 var_dump 之后放一个 die() 以确保我能看到我想看到的输出 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2017-04-06
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多