考虑这个形式:

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

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


当前回答

当原始查询有数组时,对于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";
}

其他回答

这是对Efx上述帖子的回应:

如果URL已经包含了您想要更改的变量,那么它将再次作为隐藏字段添加。

下面是对该代码的修改,以防止重复URL中的变量:

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

我有一个非常相似的问题,在form action中,我有这样的东西:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

该按钮将用户带到站点,但查询信息消失了,因此用户登录到主页而不是所需的内容页面。在我的案例中,解决方案是找出如何在不需要查询的情况下对URL进行编码,从而使用户能够访问所需的页面。在这种情况下,我的目标是Drupal站点,所以结果/content/something也可以工作。我还可以使用节点号(即/node/123)。

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

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

我的观察

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

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

如果你需要变通,因为这个表单可以放在第三方系统中,你可以像这样使用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个参数到查询