如果在查询字符串中放置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
放在完全改变问题的表格里。然而,随着有趣的答案的到来,这些答案不仅回答了我的问题,我决定保持原样。 最佳答案
是的,在技术上和概念上是有区别的。差异对您的影响取决于处理请求的应用服务器(当然,还取决于您的首选项)。
技术差异:
在大多数应用服务器中,参数(URL或FORM)的来源决定了它们的最终位置。在PHP中,url参数分别位于$_GET
超全局中的$_POST
和form字段中。如果您不关心技术差异,为了您的方便,这里有一个$_REQUEST
超级全局。
概念差异:
在两种类型的请求参数之间进行区分是最合乎逻辑的:
这样就需要呈现一个页面,也就是说,如果您再次发送请求,它们不会更改数据库中的任何内容。
这样改变数据库,也就是说,是破坏性的(这就是为什么浏览器问你是否可以再次发布一个页面,如果你点击刷新)。
前者称为等幂,应通过GET进行传递。一个很好的例子是一个搜索字符串或一个记录ID。不管你多久点击一次刷新,数据库都保持不变。
另一种参数是应该存储在数据库中的数据。如果它真的改变了数据库内容,那将是毁灭性的。这些参数应该通过POST传输。
顺便说一句,这也是决定窗体是method="GET"
还是method="POST"
的好方法:只要窗体输入在数据库上是等幂的,就使用GET form。例如,用户搜索表单应该是GET,用户首选项表单应该是POST。
现在,您可以争辩说,在您的情况下,记录ID是等幂的,但表单中的其他信息位不是等幂的。在这种情况下,我觉得使用
<form action="mysite.com/index.php?id=1234" method="POST">
<!-- ...more inputs here -->
</form>
因为a
GET mysite.com/index.php?id=1234
将请求该记录。不需要这样做,但是-当然你可以把ID作为一个隐藏的输入。
不过,有两件事你应该注意:
在这种情况下,HTTP服务器日志不会显示用户发布到哪个记录的证据(如果您愿意的话)。
这种分离只对POST表单有效。GET forms忽略
action
属性中的参数,必须在中指定所有参数作为隐藏的输入字段。关于php - 表单参数:在查询字符串和输入中-有什么不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8868282/