Используйте GET или POST для формы поиска - PullRequest
29 голосов
/ 18 ноября 2008

У меня есть пара поисковых форм, одна с ~ 50 полями и другая с ~ 100. Как правило, как сказано в спецификации HTML, я выполняю поиск с использованием метода GET, поскольку данные не изменяются. Я еще не сталкивался с этой проблемой, но мне интересно, скоро ли у меня закончится пространство URL?

Предел Internet Explorer составляет 2083 символа. Другие браузеры имеют намного более высокий предел . Я использую Apache, поэтому ограничение составляет около 4000 символов, а IIS составляет 16384 символа.

При 100 полях, скажем, средняя длина имени в 10 символов, это уже 5000 символов ... Удивительно, в форме из 100 полей у меня еще не было ошибок. (25% полей являются множественными выборами, поэтому длина поля намного больше.)

Итак, мне интересно, каковы мои варианты. (Сокращение форм не вариант.) Вот мои идеи:

  • Использовать POST. Мне это не очень нравится, потому что в данный момент пользователи могут добавить в закладки свои поиски и выполнить их позже - действительно чертовски приятная функция.
  • Пропустите JavaScript через форму, чтобы определить, какие поля отличаются от значений по умолчанию, заполните другую форму и отправьте ее. Пользователь, конечно, добавит в закладки сокращенную версию.

Есть еще идеи?

Кроме того, кто-нибудь знает, является ли длина закодированной длиной или просто текстом?

Я занимаюсь разработкой на PHP, но, вероятно, это не имеет значения.

Редактировать: Я не могу удалить поля; Я не могу сократить форму. Это то, о чем просил клиент, и они часто используют ряд полей в разных категориях. Я знаю, что трудно представить форму, которая выглядит хорошо с таким количеством полей, но у пользователей нет проблем с пониманием, как она работает.

Ответы [ 8 ]

6 голосов
/ 18 ноября 2008

Собираются ли ваши пользователи использовать все 50-100 полей для своих поисков? Если они используют только несколько, почему бы не POST поиск на промежуточной странице, которая header () - перенаправляет их на страницу результатов только с измененными пользователем полями в URL? Страница результатов будет тогда использовать значения по умолчанию для полей, которые не существуют в URL.

2 голосов
/ 18 ноября 2008

Если вы не возражаете против использования javascript, вы можете настроить длину строки запроса, а если она слишком длинная, переключиться на публикацию. Затем создайте своего рода средство отображения URL, чтобы они могли добавить в закладки эти опубликованные поиски.

2 голосов
/ 18 ноября 2008

Вы упоминаете в комментарии, что многие поля "скрыты и могут быть открыты по мере необходимости".

Если вы хотите отказаться от постепенного ухудшения качества, вы всегда можете добавить и удалить поля из формы, а не просто скрыть и показать их: браузер не будет отправлять те, которые не включены в форму.

Это вариант форм "Марка и модель", которые используются на страницах онлайн-страхования и т. Д. - выберите марку, отправьте обратно на сервер и получите список моделей для этого производителя.

2 голосов
/ 18 ноября 2008

Чтобы косвенно ответить на ваш вопрос, если бы я столкнулся с формой из 100 полей для заполнения на одной странице, я бы, скорее всего, закрыл свой браузер, это звучит как полное удобство использования кошмар .

Мой ответ: если есть опасность, что я достигну этого предела для нормального использования формы, я, вероятно, делаю это неправильно.

В порядке предпочтения я бы

  1. Разделите форму и используйте некоторое сохранение состояния на стороне сервера
  2. Переключиться на POST, а затем сгенерировать и перенаправить на более короткий URL-адрес в POST, который разрешается с тем же результатом
  3. Сдавайся;)
1 голос
/ 18 ноября 2008

Кроме того, кто-нибудь знает, если длина это кодированная длина или просто текст?

Мое предположение было для закодированной длины. Я сделал простой тест: текстовую область и кнопку отправки для упрощенного сценария PHP.
Загрузил страницу в IE6, вставил немного французского текста в текстовую область, 2000 символов. Если я нажму кнопку отправки, ничего. Мне пришлось сократить длину текста, чтобы можно было его отправить.

Другими словами, ограничение в 2083 символа - это максимальная длина URL-адреса, найденного в адресной строке после отправки запроса GET.

Я бы выбрал решение JavaScript: при отправке проанализируйте форму, создайте вторичную форму с атрибутами hidden и отправьте ее.

Некоторые стратегии сокращения выпуска:

  • Как вы указали, вы уже можете пропустить все значения, оставленные по умолчанию (без поля, без значения).
  • Если у вас есть форма, похожая на Обработка поиска по форуму , вы можете сгруппировать все состояния флажков только в одной переменной, например используя буквенное кодирование.
  • Используйте короткие value атрибуты (например, select).

Примечание: если страница поиска фактически состоит из нескольких независимых форм, где пользователи заполняют только один раздел или другой, вы можете создать несколько отдельных форм.
Может не относиться к вашему делу и может показаться очевидным, но стоит упомянуть для записи ... ^ _ ^

1 голос
/ 18 ноября 2008

Используйте сообщение, и если пользователь добавляет в закладки поиск, сохраните его в базе данных и присвойте ему уникальный токен, затем перенаправьте на страницу поиска, используя 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)');
?>
0 голосов
/ 14 февраля 2014

Получить может иметь одно преимущество, если ваши результаты поиска могут быть переданы, в случае пост-запроса, если вы отправите ссылку кому-то, этот человек не увидит никаких результатов поиска

0 голосов
/ 12 февраля 2010

Можно с философской точки зрения рассматривать отправку запроса POST как создание сохраненного поиска (особенно, когда поиск является столь же сложным объектом, как и тот, который делают ваши пользователи). В этом случае вы можете принять сообщение для создания поиска и затем перенаправить его с помощью GET, чтобы получить соответствующие результаты поиска (post / redirect / get).

Это также позволит пользователям в любое время добавить в закладки результаты поиска (GET) для повторного запуска поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...