2008-11-18 11 views
27

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

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

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

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

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

Другие идеи?

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

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

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

ответ

6

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

+1

Если вы выбираете этот метод, убедитесь, чтобы вернуть ответ «303 См. другой» из POST, чтобы заставить браузер получить перенаправленный запрос с помощью GET. В противном случае он может попытаться выполнить POST для перенаправленного URL. – 2008-11-18 00:47:54

2

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

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

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

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

Ну, 3 вещи: (1) Пользователи не видят всего 100 полей за раз. Они скрыты и могут быть открыты по мере необходимости. (2) Это поле поиска, которое люди знают, как использовать - это не форма регистрации на 100 человек. (3) Очень легко иметь дело с полями, так как я очень оптимизировал код! – 2008-11-18 00:45:50

2

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

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

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

+0

Да ... Когда я впервые увидел, что набор (видимых) полей формы изменяется по мере того, как пользователь проходит через него, моя непосредственная мысль заключалась в «использовании AJAX (или подобного) для добавления полей по мере необходимости». Вам не нужно обстреливать их всех при начальной загрузке страницы. – 2008-11-18 01:21:20

+0

К сожалению, было бы намного сложнее скрыть/показать только определенные поля, потому что там могут быть поля, которые они не могут видеть, которые имеют значения в них (но представлены английской строкой), поскольку они добавляют к их предыдущему поиску. – 2008-11-18 07:23:41

2

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

1

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

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

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

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

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

Некоторые стратегии на сокращение выхода:

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

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

0

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^