如果在查询字符串中放置了POST表单的参数,那么会有区别吗:
<form action="mysite.com/index.php?myparam=myvalue">
...more inputs here
</form>
并将其作为隐藏输入?
<form action="mysite.com/index.php">
<input type="hidden" value="myvalue">
...more inputs here
</form>
我正在使用Joomla,但实际上它完全不相关。我看到他们的教程中有一些“在这里和那里”,但它真的重要吗?如果我使用其中任何一个会有什么影响?
注意:我忘了将action=post
放在完全改变了问题的表格中。然而,随着有趣的答案的到来,我回答的不仅仅是我的问题,我决定将它们保留原样。
答案 0 :(得分:4)
是的,技术上和概念上存在差异。差异对您的影响取决于处理请求的应用程序服务器(当然,还有您的首选项)。
技术差异:
在大多数应用程序服务器中,参数的来源(URL或FORM)决定了它们的最终位置。在PHP中,url参数分别位于$_GET
超级全局的$_POST
和表单字段中。如果您不关心技术差异,为了您的方便,有一个$_REQUEST
超全球。
概念差异:
在两种类型的请求参数之间进行区分是最合乎逻辑的:
前者称为幂等,应通过GET传输。一个很好的例子是搜索字符串或记录ID。无论您的点击刷新多久,数据库都保持不变。
另一种参数是应该存储在DB中的数据。从实际上改变数据库内容的角度来看,这将是破坏性的。这些参数应通过POST传输。
顺便说一下,这也是决定表单应该是method="GET"
还是method="POST"
的好方法:每当表单输入在数据库中是幂等的时候,使用GET表单。例如,用户搜索表单应为GET,用户首选项表单应为POST。
现在您可以争辩说,在您的情况下,记录ID是幂等的,但表单中的其他信息不是。在这种情况下,我觉得使用
是最惯用的<form action="mysite.com/index.php?id=1234" method="POST">
<!-- ...more inputs here -->
</form>
因为GET mysite.com/index.php?id=1234
会请求非常记录。
虽然没有必要这样做 - 当然你可以将ID作为隐藏输入发布。
你应该注意两件事:
action
属性中的参数,您必须将它们全部指定为隐藏的输入字段。答案 1 :(得分:2)
对于POST表单没有区别。
对于GET表单,全新的查询字符串将由表单字段组成,消除所有现有值 - 因此,永远不要使用查询字符串作为GET表单,而是使用隐藏字段。
答案 2 :(得分:1)
存在差异,因为传递给action属性的GET参数被取消。你应该使用隐藏的字段。
如果在表单中指定method属性并将其值设置为“POST”,则必须解析GET和POST参数。
我使用以下文件进行测试(将其命名为“testget.php”):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Test GET</title>
</head>
<body>
<p>
<?php
if( ! empty( $_GET ) )
{
print_r( $_GET );
}
if( ! empty( $_POST ) )
{
print_r( $_POST );
}
?>
</p>
<p>No method attribute</p>
<form action="testget.php?foo=bar">
<input type="hidden" name="bar" value="foo" />
<input type="submit" value="Submit" />
</form>
<p>method="get"</p>
<form action="testget.php?foo=bar" method="get">
<input type="hidden" name="bar" value="foo" />
<input type="submit" value="Submit" />
</form>
<p>method="post"</p>
<form action="testget.php?foo=bar" method="post">
<input type="hidden" name="bar" value="foo" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
<强>输出:强>
No method attribute:Array ( [bar] => foo )
method="get":Array ( [bar] => foo )
method="post": Array ( [foo] => bar ) Array ( [bar] => foo )