考虑这个形式:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

当提交这个GET表单时,参数a和b将消失。 这有什么原因吗? 有没有办法避免这种行为?


当前回答

您可以对包含GET信息的表使用简单的foreach。例如在PHP中:

foreach ($_GET as $key => $value) {
    $key = htmlspecialchars($key);
    $value = htmlspecialchars($value);
    echo "<input type='hidden' name='$key' value='$value'/>";
}

由于GET值来自用户,我们应该在打印到屏幕之前转义它们。

其他回答

你的建筑是违法的。不能在表单的操作值中包含参数。如果您尝试这样做,结果将取决于浏览器的特性。如果它只适用于一种浏览器而不适用于另一种浏览器,我不会感到惊讶。即使它看起来可以工作,我也不会依赖它,因为浏览器的下一个版本可能会改变这种行为。

“但是假设我在查询字符串和隐藏输入中有参数,我能做什么?”你能做的就是修复错误。不是讽刺,但这有点像问,“但是假设我的URL使用百分号而不是斜杠,我能做什么?”唯一可能的答案是,您可以修复URL。

当原始查询有数组时,对于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";
}
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

将请求方法改为' POST'而不是'GET'。

我通常是这样写的:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

这是有效的,但是不要忘记清除您的输入以防止XSS攻击!

我的观察

当方法为GET并提交表单时,隐藏的输入元素作为查询参数发送。旧参数在行动url被清除。基本上在这个例子中,表单数据取代了action url中的查询字符串 当方法是POST,并且提交表单时,action url中的查询参数是完整的(req.query)并且输入元素数据作为表单数据发送(req.body)

简单来说,如果你想传递查询参数和表单数据,使用方法属性POST