【发布时间】:2016-11-03 20:00:43
【问题描述】:
当用户点击提交时,它同时向脚本发送一个 post 和 get 请求。 Post返回302 Found,Get返回200,但是表单提交后print_r显示一个空数组。我不知道为什么会这样。
这是在使用 PHP 5.4 和 Apache 2.4 的 AWS Linux 实例上运行的。
代码如下:
<?php
print_r($_REQUEST);
?>
<!doctype html>
<html>
<meta charset="UTF-8" />
<title>Login</title>
<head>
</head>
<body>
<p>Please login:</p>
<form action="<?php echo $_SERVER['SCRIPT_NAME'];?>" method="post">
<table>
<tr>
<td>
username
</td>
<td>
<input type="text" name="username" id="username" style="width:400px;"> (case sensitive)
</td>
</tr>
<tr>
<td>
password
</td>
<td>
<input type="password" name="password" id="password" style="width:400px;">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="submit">
</td>
</tr>
</table>
</form>
</body>
</html>
当我点击提交时,这是我在 FF 开发工具中看到的:
【问题讨论】:
-
一个 HTML 表单不能“同时使用两种方法”提交。很确定它是您的表单/浏览器发送的 POST 请求,服务器发送的 302 响应,然后是浏览器的 GET 请求。现在为什么会出现 302,从目前显示的代码中还不清楚。对于初学者,我会检查表单的 action 属性实际包含的内容。
-
“它正在向脚本发送帖子和获取请求”不,这绝对不会发生。重新检查你的假设。
-
您可以考虑将
action留空。它将提交到当前 URL。 -
@CBroe:理论上你可以混合 post 和 get,如果你在 post 动作中添加一个查询字符串,不是吗?
-
@Gerfried 仍然会使其成为一个 POST 请求,它恰好转到一个包含查询字符串的 URL。当您在 PHP 中处理数据时,它会相应地填充 $_POST 和 $_GET - 但是请求标头第一行中的方法仍然是 POST。