考虑这个形式:
<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个参数到查询
其他回答
回答你的第一个问题,是的,浏览器会这样做,原因是 浏览器并不关心动作URL中的现有参数 所以它会完全去除它们
为了防止这种情况发生使用我写的JavaScript函数 使用jQuery:
function addQueryStringAsHidden(form){
if (form.attr("action") === undefined){
throw "form does not have action attribute"
}
let url = form.attr("action");
if (url.includes("?") === false) return false;
let index = url.indexOf("?");
let action = url.slice(0, index)
let params = url.slice(index);
url = new URLSearchParams(params);
for (param of url.keys()){
let paramValue = url.get(param);
let attrObject = {"type":"hidden", "name":param, "value":paramValue};
let hidden = $("<input>").attr(attrObject);
form.append(hidden);
}
form.attr("action", action)
}
这是对Efx上述帖子的回应:
如果URL已经包含了您想要更改的变量,那么它将再次作为隐藏字段添加。
下面是对该代码的修改,以防止重复URL中的变量:
foreach ($_GET as $key => $value) {
if ($key != "my_key") {
echo("<input type='hidden' name='$key' value='$value'/>");
}
}
我通常是这样写的:
foreach($_GET as $key=>$content){
echo "<input type='hidden' name='$key' value='$content'/>";
}
这是有效的,但是不要忘记清除您的输入以防止XSS攻击!
当原始查询有数组时,对于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中,我有这样的东西:
<form action="http://www.example.com/?q=content/something" method="GET">
<input type="submit" value="Go away..." />
</form>
该按钮将用户带到站点,但查询信息消失了,因此用户登录到主页而不是所需的内容页面。在我的案例中,解决方案是找出如何在不需要查询的情况下对URL进行编码,从而使用户能够访问所需的页面。在这种情况下,我的目标是Drupal站点,所以结果/content/something也可以工作。我还可以使用节点号(即/node/123)。