考虑这个形式:
<form action="http://www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
当提交这个GET表单时,参数a和b将消失。 这有什么原因吗? 有没有办法避免这种行为?
考虑这个形式:
<form action="http://www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
当提交这个GET表单时,参数a和b将消失。 这有什么原因吗? 有没有办法避免这种行为?
当前回答
如果你需要变通,因为这个表单可以放在第三方系统中,你可以像这样使用Apache mod_rewrite:
RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]
然后你的新表单将是这样的:
<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" />
</form>
Apache将附加第3个参数到查询
其他回答
我通常是这样写的:
foreach($_GET as $key=>$content){
echo "<input type='hidden' name='$key' value='$content'/>";
}
这是有效的,但是不要忘记清除您的输入以防止XSS攻击!
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" />
</form>
将请求方法改为' POST'而不是'GET'。
在HTML5中,这是按规范的行为。
参见控件和表单的关联-表单提交算法。
请看“4.10.22.3表单提交算法”,第17步。在GET表单的情况下,一个http/s URI的查询字符串:
让destination是一个新的URL,它等于action 它的<query>组件被query(添加U+003F QUESTION 如果合适,标记字符(?)。
因此,您的浏览器将丢弃URI中现有的“?…”部分,并将其替换为基于您的表单的新部分。
在HTML 4.01中,规范产生了无效的uri -大多数浏览器实际上并没有这样做…
参见表单-处理表单数据,第四步- URI将有一个?附加,即使它已经包含一个。
我的观察
当方法为GET并提交表单时,隐藏的输入元素作为查询参数发送。旧参数在行动url被清除。基本上在这个例子中,表单数据取代了action url中的查询字符串 当方法是POST,并且提交表单时,action url中的查询参数是完整的(req.query)并且输入元素数据作为表单数据发送(req.body)
简单来说,如果你想传递查询参数和表单数据,使用方法属性POST
当原始查询有数组时,对于php:
foreach (explode("\n", http_build_query($query, '', "\n")) as $keyValue) {
[$key, $value] = explode('=', $keyValue, 2);
$key = htmlspecialchars(urldecode($key), ENT_COMPAT | ENT_HTML5);
$value = htmlspecialchars(urldecode($value), ENT_COMPAT | ENT_HTML5);
echo '<input type="hidden" name="' . $key . '" value="' . $value . '"' . "/>\n";
}