У меня есть пара форм поиска, одна с ~ 50 полями, а другая с ~ 100. Обычно, как указано в спецификации HTML, я выполняю поиск с использованием метода GET, поскольку данные не меняются. Я еще не сталкивался с этой проблемой, но мне интересно, скоро ли у меня закончится место для URL?
Предел Internet Explorer составляет 2083 символа. В других браузерах есть намного более высокий предел. Я использую Apache, поэтому ограничение составляет около 4000 символов, в IIS - 16384 символа.
В 100 полях, скажем, средняя длина имени поля составляет 10 символов, это уже 5000 символов ... удивительно, в форме 100 полей у меня еще не было никаких ошибок. (25% полей являются множественным выбором, поэтому длина поля намного больше.)
Итак, мне интересно, какие у меня есть варианты. (Укорочение форм - не вариант.) Вот мои идеи:
Есть другие идеи?
Кроме того, кто-нибудь знает, является ли длина закодированной длиной или просто текстом?
Я разрабатываю на PHP, но, вероятно, это не имеет значения.
Редактировать: Я не могу удалить какие-либо поля; Я не могу сократить форму. Это то, о чем просил клиент, и они часто используют ряд полей в разных категориях. Я знаю, что трудно придумать форму, которая хорошо выглядела бы с таким количеством полей, но у пользователей нет проблем с пониманием того, как она работает.




Собираются ли ваши пользователи на самом деле использовать все 50–100 полей для поиска? Если они используют только несколько, почему бы не выполнить POST поиск на промежуточную страницу, которая header () перенаправляет их на страницу результатов с только измененными пользователем полями в URL-адресе? Затем на странице результатов будут использоваться значения по умолчанию для полей, которых нет в URL-адресе.
Чтобы косвенно ответить на ваш вопрос, если бы я столкнулся с формой из 100 полей для заполнения на одной странице, я бы, скорее всего, закрыл свой браузер, это звучит как полное удобство использования кошмарный сон.
Мой ответ таков: если есть опасность, что я приблизился к этому пределу для использования формы обычный, я, вероятно, делаю это неправильно.
В порядке предпочтения я бы
Что ж, 3 вещи: (1) Пользователи не видят все 100 полей одновременно. Они скрыты и могут быть открыты по мере необходимости. (2) Это поле поиска, которым люди умеют пользоваться - это не регистрационная форма из 100 полей. (3) С полями действительно легко работать, так как я много оптимизировал код!
Вы упоминаете в комментарии, что многие поля «скрыты и могут быть открыты по мере необходимости».
Если вы готовы отказаться от постепенной деградации, вы всегда можете добавить и удалить поля из формы, а не просто скрывать и показывать их: браузер не отправит те, которые не включены в форму.
Это вариант форм «Марка и модель», которые используются на страницах онлайн-страхования и т. д. - выберите марку, отправьте обратно на сервер и получите список моделей этого производителя.
Да ... Когда я впервые увидел, что набор (видимых) полей в форме изменяется по мере того, как пользователь просматривает его, моя немедленная мысль была «использовать AJAX (или аналогичный) для добавления полей по мере необходимости». Вам не нужно дробить их всех при начальной загрузке страницы.
К сожалению, было бы намного сложнее скрыть / показать только определенные поля, потому что могут быть поля, которые они не видят, в которых есть значения (но представлены английской строкой), когда они добавляются к своему предыдущему поиску.
Подсказка: браузеры не отправляют отключенные поля.
Если вы не против использования javascript, вы можете определить длину строки запроса, а если она слишком длинная, переключитесь на публикацию. Затем имейте своего рода средство сопоставления URL-адресов, чтобы они могли добавлять в закладки эти опубликованные поисковые запросы.
Используйте сообщение, и если пользователь закладки поиска, сохраните его в базе данных и дайте ему уникальный токен, затем перенаправьте на страницу поиска, используя 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+ лет и, вероятно, будут активны еще 10 ...
Что ж, обновляйте save_time каждый раз, когда его запрашивают. И если вы не имеете дело с более чем 50 000 000 записей, вам не о чем беспокоиться, если вы поместите индекс в столбец токенов.
Also, does anyone know if the length is the encoded length or just plain text?
Я предполагаю, что это кодированная длина. Я провел простой тест: текстовое поле и кнопку отправки в упрощенный PHP-скрипт. Загрузил страницу в IE6, вставил текст на французском языке в текстовое поле, 2000 символов. Если я нажму кнопку отправки, ничего. Мне пришлось уменьшить длину текста, чтобы можно было отправить.
Другими словами, ограничение в 2083 символа - это в точности максимальная длина URL-адреса, найденного в адресной строке после отправки запроса GET.
Я бы выбрал решение JavaScript: при отправке проанализируйте форму, создайте вторичную форму с атрибутами hidden и отправьте ее.
Некоторые стратегии по сокращению вывода:
value (например, в select).Примечание: если страница поиска фактически состоит из нескольких независимых форм, где пользователи заполняют только один или другой раздел, вы можете создать несколько отдельных форм. Может не относиться к вашему случаю и может показаться очевидным, но стоит упомянуть для протокола ... ^ _ ^
Можно философски рассматривать POST отправки запроса как создание сохраненного поиска (особенно когда поиск - это такой же сложный объект, как тот, который создают ваши пользователи). В этом случае вы можете принять сообщение для создания поиска, а затем перенаправить его с помощью GET для получения соответствующих результатов поиска (сообщение / перенаправление / получение).
Это также позволит пользователям делать закладки для результатов поиска (GET), чтобы вернуться в любое время для повторного запуска поиска.
У Get может быть одно преимущество, если вашими результатами поиска можно поделиться: в случае отправки запроса, если вы отправите ссылку кому-то, этот человек не увидит никаких результатов поиска.
Если вы выберете этот метод, обязательно верните ответ «303 See Other» от POST, чтобы браузер получил перенаправленный запрос с помощью GET. В противном случае он может попытаться выполнить POST для перенаправленного URL-адреса.