Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 表单参数:在查询字符串和输入中-有什么不同吗?_Php_Html_Forms_Post - Fatal编程技术网

Php 表单参数:在查询字符串和输入中-有什么不同吗?

Php 表单参数:在查询字符串和输入中-有什么不同吗?,php,html,forms,post,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"> ...mor

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

对于POST表单,没有区别。

对于GET表单,全新的查询字符串将由表单字段组成,从而消除所有现有值-因此,千万不要对GET表单使用查询字符串,而是使用隐藏字段。

这是一个区别,因为传递给action属性的GET参数将被取消。应该使用隐藏字段

如果在表单中指定method属性并将其值设置为“POST”,则必须同时解析GET和POST参数

我使用以下文件进行测试(将其命名为“testget.php”):


是的,在技术上和概念上是有区别的。差异影响您的方式取决于处理请求的应用程序服务器(当然,也取决于您的首选项)

技术差异:

No method attribute:Array ( [bar] => foo )

method="get":Array ( [bar] => foo )

method="post": Array ( [foo] => bar ) Array ( [bar] => foo )
在大多数应用服务器中,参数(URL或表单)的来源决定了它们的最终位置。在PHP中,url参数分别位于
$\u GET
$\u POST
超全局中的表单字段中。如果您不关心技术上的差异,为了您的方便,会有一个
$\u请求
superglobal

概念差异:

No method attribute:Array ( [bar] => foo )

method="get":Array ( [bar] => foo )

method="post": Array ( [foo] => bar ) Array ( [bar] => foo )
最合乎逻辑的做法是区分两种类型的请求参数:

  • 例如,如果您再次发送请求,它们不会更改数据库中的任何内容
  • 这样更改数据库,即具有破坏性(这就是为什么浏览器会在点击刷新时询问您是否可以再次发布页面的原因)
前者称为幂等元,应通过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 forms忽略
    action
    属性中的参数,您必须将所有参数指定为隐藏的输入字段

没那么重要。每个人在尝试将查询字符串与GET表单一起使用时都会了解到这一点,这不是什么大问题。那么,您的意思是,如果我对表单使用GET,查询字符串中的任何内容都会被丢弃,只有表单字段可以通过?关于另一个人的评论,你真的可以使用
$\u GET[]
访问POST查询字符串吗?@fskreuz-另一个答案没有说你可以使用GET访问POST数据。他说,如果表单有
method=post
action=site.php?querystring
的querystring,那么您需要使用
$\u post
$\u GET
@fskreuz分别解析它们,那么编写一个测试表单并亲眼看看怎么样?你写这篇评论所花的时间比写这篇评论要少。没有类似于
查询后字符串的东西。但仅查询字符串,这是HTTP请求uri部分的一部分。@Col.Shrapnel对此我深表歉意,我认为我在问题中键入了
method=post
。chrome debugger将这些值分离为表单数据,表单数据是字段值,查询字符串参数是提交表单时表单
操作
中的参数,因此是查询后字符串。1$_为您带来的不便请求superglobal。2.对于POST表单,查询字符串并不重要,因为您必须执行GET重定向。@Col.shrapanel 1。这取决于你的喜好。2.这是一个理智的设计问题,而不是“偏好”。@Col.Shrapnel这可能是这样,但是
\u REQUEST
是PHP的一个常规部分,它没有被删除,我提到它是因为提到它是合乎逻辑的。讨论它的理智性在某种程度上不是问题的重点,而是答案的重点$_请求与全局范围中的请求变量相同。这是开发者头脑混乱的结果,因为他不知道自己的数据来自哪里。