表单参数:在查询字符串和输入中 - 任何不同的?

时间:2012-01-15 07:51:47

标签: php html forms post

如果在查询字符串中放置了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放在完全改变了问题的表格中。然而,随着有趣的答案的到来,我回答的不仅仅是我的问题,我决定将它们保留原样。

3 个答案:

答案 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作为隐藏输入发布。

你应该注意两件事:

  • 在这种情况下,HTTP服务器日志不会显示用户发布到哪条记录的证据(如果您关心的话)。
  • 这种分离仅适用于POST表单。 GET表单忽略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 )