PHP $_POST不起作用?

14

我有一个最简单的表单,我只想回显文本框中输入的内容。

HTML:

<form action="" method="post">
  <input type="text" name="firstname">
  <input type="submit" name="submit" value="Submit">
</form>

PHP:

if(isset($_POST['submit'])){
  $test = $_POST['firstname'];
  echo $test;
}

问题是它在我的服务器上无法正常工作(但在另一个服务器上可以正常工作)。有人知道可能出了什么问题吗?服务器上还有其他表单,它们都可以正常工作。


5
我建议action属性始终要有一个值... - ChrisW
4
如果您使用 var_dump($_POST),您将得到什么?同样地,如果您使用 var_dump($_REQUEST),会得到什么结果? - DaveRandom
在 action 属性中,你需要写类似于“test.php”或“#”这样的内容。请尝试一下。 - User1988
@DaveRandom 如果我使用var_dump($_POST),有时会得到结果,但其他情况下只是一个空数组。而且有时候我会得到正确的值,当我尝试使用不同的字符串再次尝试时,该值保持与第一次相同 - 不会改变。 - ptinca
4
你尝试过这个吗:if($_SERVER['REQUEST_METHOD'] == "POST")?它的意思是如果当前请求的方法为POST,则执行以下操作。 - Frankline
显示剩余8条评论
11个回答

33
今晚我遇到了类似的问题,令我感到苦恼。提交表单时,$_REQUEST 中存在值,但 $_POST 中却没有。
最终我注意到在 Firebug 的网络选项卡中实际上有两个请求:首先是一个带有 301 响应的 POST 请求,然后是一个带有 200 响应的 GET 请求。
在网上搜索了一圈后,我发现大多数人认为这与 mod_rewrite 有关,因为该 POST 请求会重定向并转换为 GET 请求。
但在我的情况下,不是 mod_rewrite 的问题,而是一个更简单的问题……我的 POST 请求的 URL 也包含了一个 GET 查询字符串,而该查询字符串在 URL 上没有加斜杠。这导致 Apache 发生了重定向。
看出差异了吗……
不好的:http://blah.de.blah/my/path?key=value&otherkey=othervalue
好的:http://blah.de.blah/my/path/?key=value&otherkey=othervalue 后面那个不会导致重定向,并给我 $_POST!

4
我有一个表单,其中 action="booking.php",但它没有起作用。后来发现是因为我的 .htaccess 文件重写了 .php 地址以移除扩展名。将 action="booking" 更改后问题得到解决。 - binaryfunt
4
你的回答节省了我很多时间。在我的情况下,我的表单的action="mysite.com/somefolder",导致$_POST为空。但是当我将action更改为mysite.com/somefolder/时,它按预期工作。非常感谢! - Ahmad
非常微妙的差别,但影响很大。谢谢! :) - Tim V
1
尝试了一个小时,做了研究,然后......它是一个斜杠,天啊......非常感谢。 - Mousa Alfhaily
哈哈,我刚刚也遇到了同样的问题一个小时。使用POST时一定要加上斜杠! - CheeseFlavored
1
我已经在这个问题上工作了一周多。感谢您的回答,由于此答案不在其他关于同一问题的stackoverflow问题中,我认为这不应是重复的问题。通常,我不会查看重复的问题,因为它们是重复的问题:) - 尽管感谢答案 - naman1994

27

你可以尝试以下几件事情:

  1. 确保表单的 "action" 属性指向正确的目标地址。
  2. 尝试使用 $_REQUEST[] 而不是 $_POST,看看是否有任何变化。
  3. [可选] 尝试同时包含 'name' 和 'id' 属性,例如:

    <input type="text" name="firstname" id="firstname">
    
  4. 如果您在Linux环境中,请检查您对文件拥有读/写权限。

此外,这个链接可能也会有所帮助。

编辑:

您还可以替换

<code>if(isset($_POST['submit'])){</code>

使用这个:

<code>if($_SERVER['REQUEST_METHOD'] == "POST"){ </code>

这总是检查一个表单是否已被提交的最佳方式。


11
不需要ID。 - PiTheNumber
谢谢,我已经尝试了那个链接中的几乎所有方法,但没有成功。 - ptinca
1
你尝试过这个吗:if($_SERVER['REQUEST_METHOD'] == "POST"){ - Frankline
加一分,让我的大脑进入“哦,傻了!”模式。以一种切线的方式解决了我的问题。我爱 Stack Overflow。 - wordman
1
#3 对我有用。太棒了!!!非常感谢!!!!这个问题让我抓狂了。太好了!!!加1. :-) - Arjun
显示剩余2条评论

11

转储全局变量以了解页面作用域中有什么:

var_dump($GLOBALS);

这将告诉您有关页面数据的“什么”和“在哪里”的信息。


这是最好的解决方案。file_put_contents('./test.log',print_r($GLOBALS,true));可以打印出所有全局变量的可爱输出,您可以看到数据到达的位置。 - Adrian Smith

8
我也遇到过这个问题。错误在htaccess文件中。如果你有一个重写规则影响了操作url,那么你将无法读取POST变量。
为了解决这个问题,你需要在htaccess文件开头添加以下规则,以避免重写url:
RewriteRule ^my_action.php - [PT]

8

建议使用 $_REQUEST 替代 $_POST:

HTML:

<form action="" method="post">
  <input type="text" name="firstname">
  <input type="submit" name="submit" value="Submit">
</form>

PHP:

if(isset($_REQUEST['submit'])){
  $test = $_REQUEST['firstname'];
  echo $test;
}

2
你有检查过你的php.ini文件吗?我曾经因为将post_max_size设置成与upload_max_filesize相同而破坏了我的POST方法。
我认为post_max_size必须小于upload_max_filesize。在RHEL 6.0中测试了PHP 5.3.3。
供参考: PHP 5.3.5中的$_POST无法工作 PHP POST不起作用

1
尝试这个 html 代码
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
          <input type="text" name="firstname">
          <input type="submit" name="submit" value="Submit">
        </form>

php代码:

if(isset($_POST['Submit'])){
$firstname=isset($_POST['firstname'])?$_post['firstname']:"";
echo $firstname;

}

1

尝试执行var_dump($_GLOBALS)

可能的原因是在您的脚本之前有一个运行的脚本取消了全局变量。例如:

unset($_REQUEST);

或者甚至更多。

unset($GLOBALS);

可以通过在php.ini配置中使用auto_prepend_file选项来完成此操作。


0

你的代码没有问题。问题不是从这里可见。

  1. 检查提交后是否调用了脚本。

  2. 查看提交的内容:var_dump($_REQUEST)


-2
  1. HTML文件和PHP文件都应该放在c:\apache2的htdocs文件夹中(如果您使用Apache Web服务器)。
  2. 通过输入http://"localhost/html_file_name.html"打开HTML文件。
  3. 现在在字段中输入您的数据.. 您的代码将运行..

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