表单提交后$_POST为空

9
我在我的服务器上设置了这个测试页面。请告诉我为什么即使我提交表单,$_POST数组也不包含任何内容。我已经在三个不同的浏览器中尝试过了,但仍然没有结果。
<?php print_r($_POST);?>

<form method="post">

<p><label>Email: </label>
<input type="text" id="login_email" />
</p>

<p><label>Password: </label>
<input type="password" id="login_password" />
</p>

<p><label>Remember Me?: </label>
<input type="checkbox" id="login_remember" />
</p>

<p>
<input type="submit" value="Login" />
</p>

</form>

多年来我一直在写PHP,但是这种情况以前从未发生过。这段代码有什么问题吗?

有时候(即使在“name”修复之后),也要检查是否没有PHP重定向。 - T.Todua
7个回答

52

您的输入元素没有名称属性。应该是:

<input type="text" id="login_email" name="login_email" />
如果一个输入元素没有name属性,它将不会作为POST数据的一部分发送。

9

好的,您需要为表单标签添加一个行为吗?应该是脚本名称:

<form method="post" action="scriptname.php">

你还没有为每个表单输入设置名称 - 浏览器不会将ID作为元素名称提交。


实际上,我认为省略操作名称是有效的。如果这样做,浏览器会将数据提交到当前页面。 - Samantha Branham
6
大多数浏览器确实表现出这种行为,但根据官方规范,action属性是必需的 - http://www.w3.org/TR/html401/interact/forms.html。 - BrynJ
感谢澄清。我同意,当规范没有定义默认行为时,表达这种模棱两可的想法是一个坏主意。 - Samantha Branham

4
<form method="POST" action="<?php echo $PHP_SELF; ?>

<p><label>Email: </label>
<input type="text" name="login_email" />
</p>

<p><label>Password: </label>
<input type="password" name="login_password" />
</p>

<p><label>Remember Me?: </label>
<input type="checkbox" name="login_remember" />
</p>

<p>
<input type="submit" value="Login" />
</p>

</form>

这会起作用...你忘记了'name'和'action'部分。 - Kladskull

2

输入元素没有名称属性。


1
我建议你基于Zend_View助手编写类似以下函数的内容。
formText($name, $value = null, array $attribs = null)
formPassword($name, $value = null, array $attribs = null)
formLabel($id, $text, array $attribs = null)
formHidden($name, $value = null, array $attribs = null)
formSubmit($name = null, $text = null, array $attribs = null)
formSelect($name, $selected, array $attribs = null, array $options = null)
formCheckbox($name, $default, array $attribs = null, array $options = null)

然后你再也不会忘记/错过类似这样的东西了。

<form method="POST" action="<?php echo $PHP_SELF; ?>

<p>
<?php
echo formLabel('login_email', 'Email'), ':',
     formText('login_email'); 
?>
</p>

<p>
<?php
echo formLabel('login_password', 'Password'), ':',
     formPassword('login_password'); 
?>
</p>

<p>
<?php
echo formCheckbox('login_remember'), ' ', 
     formLabel('login_remember', 'Remember me');
?>
</p>

<p>
<?php
echo formSubmit(null, 'Login');
?>
</p>
</form>

提示:

  • 如果在 attribs 中未定义 id,则 id 与 name 相同,除了 label 中使用 for =“$id” 属性的情况外,formHidden 也不应具有默认 id。
  • formCheckbox 在自身之前用相同名称编写一个带有负值的 formHidden,因此如果复选框未被选中,则还可以获得返回值。
  • formCheckbox 选项是包含已选或未选的值的数组。
  • 使用 FILTER_VALIDATE_BOOLEAN 过滤器从复选框读取返回值以检查它是否被标记。

0

你忘记了为使你的脚本工作而设置的名称属性。你也可以在标签中包含“for”标记,以匹配输入的名称属性。这不是必需的,但可以帮助CSS格式化你的表单:

<p>
<label for="login_email">Email: </label>
<input type="text" name="login_email" id="login_email" />
</p>

如果你六个月后需要回来查看代码,使用正则表达式可以帮助匹配所有内容并使代码更加简洁易读。如果你不打算填写action属性,建议将其包含在你的action中:

<form method="POST" action="<?php echo $PHP_SELF; ?>

这将确保您的页面符合表单要求,并执行您的脚本。看起来像是一个简单的疏忽。希望这可以帮到您。


0

您所有的输入元素都需要一个名称属性。


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