使用GET或POST搜索表单

时间:2008-11-18 00:32:51

标签: forms post get

我有几个搜索表单,1个有~50个字段,另一个有~100个。通常,正如HTML规范所说,我使用GET方法进行搜索,因为没有数据被更改。我还没有遇到过这个问题,但我想知道我是否会很快耗尽URL空间?

Internet Explorer的限制为2083个字符。其他浏览器有much higher limit。我正在运行Apache,所以限制大约有4000个字符,IIS是16384个字符。

在100个字段中,假设平均字段名称长度为10个字符,那已经是5000个字符...在100字段表单上很惊人,我还没有任何错误。 (25%的字段是多个选择,因此字段长度要长得多。)

所以,我想知道我的选择是什么。 (缩短表格不是一种选择。)在这里我的想法:

  • 使用POST。我不喜欢这个,因为目前用户可以为他们的搜索添加书签并在以后再次执行 - 这是一个非常不错的功能。
  • 让JavaScript循环遍历表单以确定哪些字段与默认字段不同,填充另一个表单并提交该表单。用户当然会将缩短版本加入书签。

还有其他想法吗?

另外,有人知道长度是编码长度还是纯文本?

我正在开发PHP,但它可能没有什么区别。

修改:我无法删除任何字段;我无法缩短表格。这是客户要求的,他们经常使用不同类别的一系列字段。我知道很难想到一个在这么多领域看起来不错的表单,但是用户在理解它是如何工作时没有问题。

8 个答案:

答案 0 :(得分:6)

您的用户实际上是否会使用所有50-100个字段进行搜索?如果他们只使用少数,为什么不将搜索发布到“中间”页面哪个header() - 将它们重定向到结果页面,只有URL中的用户更改字段?然后,结果页面将使用URL中不存在的字段的默认值。

答案 1 :(得分:2)

为了间接解决您的问题,如果我面对一个100字段的表单填写一页,我很可能关闭我的浏览器,这听起来像一个完整的可用性噩梦

我的回答是,如果我有可能接近表格正常的限制,我可能会做错了。

按照优先顺序,我会

  1. 拆分表单并使用一些服务器端状态保留
  2. 切换到POST,然后生成并重定向到POST上较短的URL,该URL解析为相同的结果
  3. 放弃;)

答案 2 :(得分:2)

您在评论中提到许多字段“已隐藏,可根据需要打开”。

如果您愿意放弃优雅降级,您可以随时添加和删除表单中的字段,而不是隐藏和显示它们:浏览器不会提交表单中未包含的字段。

这是在线保险等页面使用的“制作和模型”表单的变体 - 选择制作,提交回服务器并获取该制造商的模型列表。

答案 3 :(得分:2)

如果你不介意使用javascript那么你可以让它计算出查询字符串的长度,如果它太长,那么切换到一个帖子。然后有一些url映射器,允许他们为这些发布的搜索添加书签。

答案 4 :(得分:1)

使用post,如果用户为搜索添加书签,将其保存在数据库中并为其指定唯一标记,然后使用GET重定向到搜索页面并将标记作为参数传递。

TinyURL是一个很好的例子:你给它一个很长的URL,它将它保存到数据库,为你提供该URL的唯一标识符,然后你可以使用该标识符请求长URL。

在PHP中,它将是:

<?php
if (isset($_GET['token']))
{
    $token = addslashes($_GET['token']);
    $qry = mysql_query("SELECT fields FROM searches WHERE token = '{$token}'");
    if ($row = mysql_fetch_assoc($qry))
    {
        performSearch(unserialize($row['fields']));
        exit;
    }
    showError('Your saved search has been removed because it hasn\'t been used in a while');
    exit;
}
$fields = addslashes(serialize($_POST));
$token = sha1($_SERVER['REMOTE_ADDR'].rand());
mysql_query("INSERT INTO searches (token, fields, save_time) Values ('{$token}', '{$fields}', NOW())");
header('Location: ?token='.$token);
exit;
?>

每天运行一个脚本:

<?php
mysql_query('DELETE FROM searches WHERE save_time < DATE_ADD(NOW(), INTERVAL -200 DAY)');
?>

答案 5 :(得分:1)

  

另外,有没有人知道长度   是编码长度还是纯文本?

我的猜测是编码长度。我做了一个简单的测试:一个textarea和一个简单的PHP脚本的提交按钮 在IE6中加载页面,在textarea中粘贴一些法语文本,2000个字符。如果我点击提交按钮,没有。我不得不缩短文本的长度才能提交。

换句话说,2083字符限制正好是提交GET请求后在地址栏中找到的URL的最大长度。

我会选择JavaScript解决方案:提交,分析表单,创建具有hidden属性的辅助表单,然后提交。

缩短产量的一些策略:

  • 正如您所指出的,您可以跳过所有剩余的值(无字段,无值)。
  • 如果你有一个类似于Processing forum search的表单,你可以只在一个变量中对所有复选框状态进行分组,例如。使用字母编码。
  • 使用简短的value属性(例如select)。

注意:如果搜索页面实际上由几个独立的表单组成,用户只填写一个或另一个部分,您可以制作几个单独的表单。
可能不适用于您的情况,可能看起来很明显,但值得一提的是...... ^ _ ^

答案 6 :(得分:0)

人们可以在哲学上将搜索提交POST视为创建已保存的搜索(特别是当搜索与用户正在进行的搜索一样复杂时)。在这种情况下,您可以接受创建搜索的帖子,然后使用GET重定向以获取相应的搜索结果(post / redirect / get)。

这也允许用户将搜索结果(GET)添加为书签以便随时返回以重新运行搜索。

答案 7 :(得分:0)

如果您的搜索结果可以共享,则获取可以有一个优势,如果您发送链接给某人,如果发布请求,该人将看不到任何搜索结果