0

这是 Opera Dragonfly 向我展示的内容:

<form action="rejectQuestion.php?q_id=24" id="reject_question" method="get">
<input type="submit" value="Reject" id="form_button"/>
</form>

但点击提交按钮后,我得到的是:

http://project/rejectQuestion.php?,所以没有论据。同样的事情在另一种形式上。是服务器问题还是我病得很重,看不到代码问题?

4

3 回答 3

11

当表单具有时,它会用要发送的表单数据method="get"覆盖 中的任何查询字符串。action因此,如果您想要任何“固定”值,则必须将它们添加为隐藏输入:

<form action="rejectQuestion.php" id="reject_question" method="get">
  <input type="hidden" name="q_id" value="24" />
  <input type="submit" value="Reject" id="form_button" />
</form>

但是...... HTTP 规范明确指出,GET 请求不得用于任何变革性的事情,例如您似乎在做的事情,以“拒绝问题”的名称来判断。您应该为此使用POST请求。

应该这样做的一个原因是为了防止欺诈性请求。恶意用户可以轻松地将“删除”链接发送给毫无戒心的用户,而受害者可能会发现他们的东西不见了。它甚至不必是被点击的链接,恶意用户可以简单地在公共论坛上发布看起来像损坏的图像,但它实际上向服务器发出了请求并修改或删除了内容。

所有变革性的要求都应该POST,永远不要GETGET应该只用于获取东西。

于 2012-12-29T20:49:38.113 回答
3

向表单添加隐藏输入

<form action="rejectQuestion.php" id="reject_question" method="get">
<input type="hidden" name="q_id" value="24">
<input type="submit" value="Reject" id="form_button">
</form>

您必须这样做,因为GET在表单中使用该方法时,它会覆盖表单中使用的查询字符串action

另一种方法是让表单使用该POST方法,在这种情况下,查询字符串将被单独保留。GET尽管这在后端可能会让人感到困惑,因为在和超全局变量中都会有值POST

于 2012-12-29T20:44:11.723 回答
2

您的代码的问题是您在actionURL 中使用 GET 参数并且具有method="get".

这会导致浏览器丢弃查询字符串,action并且仅使用基于表单字段的(在您的情况下为空的)查询字符串。出于这个原因,您要么需要使用method="POST"(无论如何这是一个好主意,因为您将使用请求修改数据)或将其移动q_id到隐藏的表单字段中。实际上,即使使用 POST,您也应该这样做。无需通过 GET 传递 ID。

<form action="rejectQuestion.php?q_id=24" id="reject_question" method="get">
  <input type="hidden" name="q_id" value="24" />
  <input type="submit" value="Reject" id="form_button" />
</form>
于 2012-12-29T20:50:25.833 回答