PHP, MySQL: как сохранить и извлечь правильные данные при работе с нумерацией страниц - PullRequest
0 голосов
/ 05 июня 2010

У меня есть форма (которая состоит из 25+ полей), и значения для этих полей варьируются от крошечного значения до объединенной строки.Это похоже на инструмент поиска.Теперь, когда пользователь заполняет форму и отправляет информацию, он видит все соответствующие данные, которые соответствуют критериям в форме.Я показываю 15 записей одновременно для пользователя.Я реализовал нумерацию страниц, чтобы пользователь мог видеть и другие записи.

ОСНОВНАЯ ПРОБЛЕМА:

Часть, пока пользователи не отправят информацию и не получат обратно1-й набор данных хорош.Проблема возникает, когда пользователь пытается перейти на 2-ю страницу (или любую другую страницу по своему выбору) через нумерацию страниц.Пользователь может перейти на другие страницы, но запрос, который необходим для правильного выполнения для извлечения результатов из БД, не запускается.Обратите внимание, что изначально это была операция POST, которая была выполнена в форме, и разбиение на страницы выполняет операцию GET.Поэтому я теряю значения формы, введенной пользователем, и я хочу сохранить эти значения и запросить БД с этими значениями.

Я пытаюсь избежать отправки значений поля формы через GET, потому что боюсьчто данные могут превышать максимально допустимое значение в URL (и поскольку они менее безопасны, чем операция POST).На странице результатов можно выполнить другие операции, которые могут привести к потере значений формы, если я попытаюсь использовать операцию POST (например, запрос на обновление).Сеансы не будут работать, так как пользователь может выбрать запуск одной и той же формы на разных вкладках с разными входами для сравнения результатов, и это может привести к тому, что данные более старого запроса будут заменены данными из более нового запроса.Я не думал о файлах cookie, так как пользователь, возможно, решил заблокировать их.Практически все варианты кажутся исчерпанными.

Итак, что я могу сделать, чтобы сохранить значения формы, выполнить правильный запрос и получить соответствующие значения независимо от того, сколько раз одна и та же форма может обрабатываться одним и тем же пользователем в разных вкладках / окнах браузера,без использования сессий (учитывая ограничения на передачу данных через GET и, возможно, потерю их в операциях POST), а также возможность выполнять другие действия на странице?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

Во-первых, GET не менее "безопасен", чем POST. И то, и другое не следует доверять (это более привлекательно для изменения строки URL, но отнюдь не сложнее) ...

У вас есть несколько вариантов:

Во-первых, следует сохранить глобальный «магазин» результатов поиска. Вы можете использовать таблицу db с id, data, где data - это сериализованный массив переменных. Затем, когда кто-то отправляет запрос на поиск, проверьте, есть ли данные в таблице. Если это так, используйте этот идентификатор. Если нет, то сериализуйте данные и вставьте их (и получите идентификатор). Затем перенаправьте на страницу, например: results.php?id=4. Таким образом, они могут делиться ссылкой, но она остается достаточно защищенной от подделки (они не могут изменять параметры поиска). Недостатком является то, что стол может вырасти ОГРОМНЫМ.

Другой способ заключается в том, чтобы base64 кодировал данные и передавал их как параметр get (base64_encode(serialize($data));). Я постараюсь держаться подальше от этого, если вы обеспокоены вмешательством или длиной URL.

Другим решением было бы перехватить следующий щелчок по ссылке в JS и использовать его для выдачи POST обратно на ваш сервер из скрытых переменных.

РЕДАКТИРОВАТЬ: Удалено решение сеанса. Понял, что это не будет работать для вашей проблемы.

0 голосов
/ 05 июня 2010

Возможным подходом было бы сохранить весь запрос, который вы использовали для поиска в вашей базе данных, в таблице, скажем, search_queries. Эта таблица должна содержать по существу два столбца, хеш и запрос, используемый для этого элемента поиска.

Когда пользователь отправляет форму поиска, его запрос оценивается и вставляется в эту таблицу, и он перенаправляется на страницу со своим search_hash. Каждый раз, когда он переходит на другую страницу, его хэш извлекается из базы данных, и результаты соответствующим образом переоцениваются - конечно, с соответствующим LIMIT.

Убедитесь, что вы выполнили эту таблицу (для этого вам может понадобиться временная метка для каждого элемента поиска)

Другой жизнеспособной реализацией этого подхода будет сохранение запроса в переменной SESSION и использование его для ваших целей запросов. Для нумерации страниц вы бы /search?page=1, а ваш _SESSION['query'] будет, например, "SELECT * FROM Topics WHERE title LIKE '%test%'". Вы бы по существу добавили "LIMIT "+($page*$perpage)+", $perpage"

Однако последний подход не сможет обнаружить мульти-окна этого пользователя на сайте. Вы можете использовать массив в своем _SESSION ['query'] и попросить пользователя отправить /search?id=0&page=1, где id будет представлять запрос к массиву, который вы запрашиваете в этом окне.

0 голосов
/ 05 июня 2010

Я пытаюсь избежать отправки формы значения полей через GET, потому что я боюсь что данные могут превысить максимум допустимое значение в URL

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

Но нет причины, по которой вы не можете хранить несколько запросов в одном сеансе, например $ _SESSION [ 'запросы'] [1234]. Тогда ваши ссылки на страницы будут выглядеть так: query = 1234 & page = 3

Учтите, однако, что пользователям может быть полезно поделиться URL-адресами своих результатов поиска. например, если Google использовал исключительно POST, я не смог бы отправить вам ссылку на http://google.com/search?q=somequery

(и так как он менее безопасен, чем операция POST)

Не совсем.

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