Подтвердить что ты не робот

Используйте GET или POST для формы поиска

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

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

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

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

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

Любые другие идеи?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

И запустите script ежедневно:

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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