PhP/MySQL Хранение пользовательских поисков между страницами, чтобы пользователь мог вернуться к ним

Я пишу приложение php-mysql. Приложение позволяет пользователю выполнять поиск в базе данных. Когда поиск выполняется, если пользователь нажимает кнопку «Назад», чтобы вернуться к нему после изучения элемента, вызванного им, его спрашивают, не хотят ли они повторно отправить запрос (он использует пост). Что бы перезапустить поиск в базе данных. Использование get не приведет к запросу на повторную публикацию, но все равно снова запустит поиск.

Есть ли способ сохранить поиск и вызвать его без повторного запуска в базе данных?

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

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

Я знаю, что это можно сделать. Сохраненные поисковые запросы — это то, что вы видите во многих веб-приложениях. Так как это вообще делается?


person Daniel Bingham    schedule 24.01.2010    source источник
comment
Этот вопрос также может вас заинтересовать: stackoverflow.com/questions/2020344/smart-database-cache   -  person Alix Axel    schedule 24.01.2010


Ответы (2)


memcached

or

APC

Однако я заметил, что вы не указываете причин, почему хотите кэшировать результаты поиска. «Потому что это быстрее, и я читал, что это делает мое приложение более масштабируемым», — обычная причина для этого. Это пахнет преждевременной оптимизацией.

Я рекомендую вам создать приложение и профилировать его. Насколько затратны эти «поиски»? Почему они дорогие? Это плохой дизайн схемы? Плохая индексация? Это плохой выбор механизма хранения?

Вы понимаете, что MySQL имеет кэш запросов, Правильно? Во многих случаях это может быть все, что вам нужно. Попробуйте запустить один из ваших дорогостоящих «поисковых» запросов с помощью клиента mysql и запишите время, а затем запустите его снова. Видеть?

person hobodave    schedule 24.01.2010
comment
На самом деле я не знал, что у MySQL есть кеш запросов. Я учу себя php и mysql, когда я иду. Полезно знать, я попробую и посмотрю, как это работает. - person Daniel Bingham; 24.01.2010
comment
Извините за задержку с принятием, мне потребовалось время, чтобы протестировать это. - person Daniel Bingham; 29.01.2010

чтобы исправить ошибку «вы хотите отправить повторно», вы можете сохранить запрос в сеансе или в базе данных, а затем немедленно перенаправить на новую страницу, чтобы фактически выполнить поиск:

search.php?searchId=22

if (isset($_GET['searchId'])) {
  $search = $_SESSION['search'][$_GET['searchId'];
  // do search
} elseif (isset($_POST['search'])) {
  $_SESSION['search'][] = $_POST;
  header('Location: search.php?searchId=' . (count($_SESSION['search']) - 1);
}

который затем может получить поля запроса из $_SESSION['search'][22] или db...

что касается сохранения результатов, вы можете полагаться на кеш браузера, или вы можете хранить отдельные результаты поисковой выдачи в сеансе или в БД... истечение срока действия старых в какой-то момент, если это необходимо...

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

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

person jspcal    schedule 24.01.2010