session_start()导致表单提交后$_POST为空

3

我正在测试一个非常简单的表单页面:

<form action="script/check.php" method = "post">
    <input type = "text" name = "email">
    <input type = "submit">
</form>

当我的check.php文件包含以下代码时,它能很好地工作:
<? 
var_dump($_POST);
?>

输出结果为array(1) { ["email"]=> string(5) "hello" },与预期相符。
check.php包含session_start()时,$_POST变为空。
<?
session_start();
var_dump($_POST);
?>

输出现在是array(0) { }
很难搜索这个问题,不幸的是,我在使用这些搜索词时找到的大多数结果都是关于空的$_SESSION变量,而这对我来说不是一个问题。问题是$_POST为空。
有一个小问题:当我从存储服务器的网络上的本地机器测试页面时,$_POST可以正确传递。但是对于其他地方,情况并非如此,网站无法正常工作。这非常奇怪,因为我已经使用了这种类型的脚本几个月了,没有任何问题,并且外部用户也能够连接而没有问题。我认为这可能是目录权限问题,但如果没有更多信息,我不能确定。

display_errors 已关闭。服务器在线,并且有许多使用相同代码的工作页面。 - Joey
3
开始一个会话可能会导致重定向,这将通过GET完成,这意味着POST数据将丢失。您可以使用类似Firefox的Firebug Nettab或HTTPFox扩展轻松验证此内容,并查看是否发生任何重定向。 - Marc B
好的,所以我在session_start();下面的行中添加了ini_set('register_globals', '1');ini_set('display_errors', '1');,现在页面可以正常工作了。显然我需要这两个设置,没有它们就无法正常工作。如果有人能够解释一下原因,我会接受它作为答案...但现在谜团解开了?我猜...?谢谢大家。 - Joey
4
请永远不要启用register_globals。它并不需要,而且是一个重大的安全漏洞,已经被弃用,并将停止使用。register_globals与$_POST没有任何关系,但会为任何发布的内容创建全局变量。http://www.php.net/manual/en/security.globals.php - ToBe
只需在表单所在的脚本中添加session_start();即可。您还可以在php.ini中启用会话自动启动并关闭register_globals。 - onehalf
显示剩余8条评论
3个回答

1

我也遇到了同样的问题。导致$_SESSION变量为空的原因是/var/lib/php/session目录中权限设置不正确:755 owner + group应该是运行http服务的用户(如apache、www-data或cherokee)


@SaurabhSinha:请不要没有理由地重复使用NAA和invalid。更加具体明确,才能真正发挥作用。 - László Papp
@Laszlo Papp:这个回答是否与上下文相关? - Kumar Saurabh Sinha
1
@SaurabhSinha:你声称了什么,你应该解释清楚。 - László Papp
@Laszlo Papp:好的,现在我明白你的意思了。我需要在评论中加以解释,不是吗?下次会注意的。谢谢。 - Kumar Saurabh Sinha

0

发生的事情是由于会话,您需要检查会话是否已经开始。

<?
if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
  var_dump($_POST);
}else{
    var_dump($_POST);
}  ?>

0

你检查了你的php.ini文件中的短标签吗?因为你正在使用不推荐使用的php短标签。请检查你的php.ini文件,并启用--enable-short-tags选项,如果你想使用短标签<? ?>。我强烈建议你使用<?php ?>标签。使用正确的php标签,你的代码将正常工作。 http://php.net/manual/en/language.basic-syntax.phptags.php


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