2012-01-15 104 views
2

是否有差别,如果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放在改变了问题的表格中。然而,随着有趣的答案的到来,这些答案不仅仅回答了我的问题,我决定让它们保持原样。

回答

4

是的,是有区别的,在技术上和概念。差异影响你的方式取决于处理请求的应用程序服务器(当然,以及当然还有你的偏好)。

技术的区别:

在大多数应用服务器,一个参数(URL或FORM)的源确定其中它们结束。在PHP中,url参数分别位于$_GET$_POST超级全局列表中。如果你不关心技术上的差异,为了您的方便,有一个超全球的$_REQUEST

概念性的区别:

这是最合乎逻辑的,使两种类型的请求参数之间的差异:

  • 所需要的渲染页面,即它们不改变任何东西这样的在数据库中,如果您再次发送请求。
  • 这样就改变了数据库,即具有破坏性(它们是浏览器询问你是否可以在发布页面时再次发布)的原因。

前者称为幂等,应通过GET传输。一个很好的例子就是搜索字符串或记录ID。无论您的命中刷新频率如何,数据库都保持不变。

另一种参数是应存储在数据库中的数据。从实际上改变数据库内容的意义上讲,这将是破坏性的。这些参数应通过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作为隐藏输入。

两件事情你应该知道,虽然:

  • 在这种情况下,HTTP服务器日志不会显示的证据记录的用户发布到(如果你喜欢那种)。
  • 这种分离只适用于POST表单。 GET表单忽略action属性中的参数,您必须将它们全部指定为隐藏输入字段。
+0

1. $ _REQUEST超全球为您带来的不便。 2.对于POST表单,查询字符串无关紧要,因为无论如何您都必须执行GET重定向。 – 2012-01-15 09:25:08

+0

@ Col.Shrapnel 1.这取决于你的喜好。 2.绝不是*你必须*做一个GET重定向。 – Tomalak 2012-01-15 09:55:45

+0

它是理智的设计问题,而不是“偏好”。 – 2012-01-15 10:22:50

2

对于POST表单没有什么区别。
对于GET表单,全新的查询字符串将由表单字段组成,消除了所有现有的值 - 因此,绝对不要使用GET表单的查询字符串,而是使用隐藏字段。

+0

很酷,这绝对是一个重要的信息。 – mrtsherman 2012-01-15 08:01:00

+0

不是那么重要。大家都会知道,只要他们尝试使用GET表单的查询字符串 - 没什么大不了的。 – 2012-01-15 08:02:30

+0

所以你的意思是,如果我使用GET的形式,查询字符串中的任何内容都会被丢弃,只有表单域才能通过?和其他人评论的是什么,你可以使用'$ _GET []'来访问POST查询字符串吗? – Joseph 2012-01-15 08:03:15

1

由于传递给动作属性的GET参数被取消,因此存在差异。你应该使用隐藏的字段。

如果您在表单中指定方法属性并将其值设置为“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)