Intereting Posts

Разбиение страниц на MySQL приводит к PHP

Я до сих пор никогда не рассматривал эту проблему (разбивку на страницы) как проблему. Когда я сел и обнул его, я обнаружил, что сталкиваюсь с множеством проблем.

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

То, что я имею в виду (с + ve и -ve точками)

  • Я могу указать pageNo и offset во время POST на мою страницу search.php . На этой странице будет запущен простой запрос MySQL для получения результатов. Поскольку число строк может в значительной степени работать в тысячах, мне нужно его разбивать на страницы. Довольно просто, но мне нужно запускать один и тот же запрос снова и снова для каждой другой страницы. Смысл, когда пользователь переходит со страницы 1 на страницу2, будет запущен один и тот же запрос MySQL (конечно, с другим offset ), что, по моему мнению, является избыточным, и я стараюсь избегать.
  • Затем я подумал о захвате всего набора результатов и сохранении его в $_SESSION , но в этом случае, что, если результаты просто огромны ? Это повлияет на производительность каким-либо образом?
  • На аналогичных строках, таких как второй пункт, я думал о том, чтобы записать результаты в файл, который является простым дерьмом! (Я просто положил его сюда, как точку. Я знаю, что это РЕАЛЬНЫЙ плохой способ делать что-то.)

Мои вопросы:

A. Какой из вышеперечисленных методов я реализую? Какая из них лучше? Есть ли другие методы? У меня есть googled, но я считаю, что большинство примеров следуют пункту 1 выше.

B. Мои вопросы для point1: Как мы можем полагаться на порядок результатов mysql? Предположим, что пользователь через некоторое время перейдет на страницу2, как мы можем быть уверены, что во второй раз повторяются записи о первой аранте? (Потому что мы делаем новый запрос).

C. Что такое ресурс MySQL? Я понимаю, что mysql_query(..) возвращает resource . Является ли глобальным в том смысле, что он поддерживает состояние между различными вызовами PHP-скрипта? (Я могу поддерживать ресурс в $_SESSION ).

Бесконечно благодарен! 🙂

PS: Я знаю, что это довольно длинный вопрос. Я просто попытался кратко описать, что происходит у меня в голове.

Related of "Разбиение страниц на MySQL приводит к PHP"

Используйте свое первое предложение. Тот, у кого есть смещения. Это «стандартный» способ сделать разбивку на страницы. Помещение всего набора результатов в сеанс было бы плохой идеей, так как каждый пользователь имел бы свою личную копию данных. Если вы столкнулись с проблемами производительности, вы всегда можете добавить кеширование (memcache), которое принесет пользу всем пользователям, обращающимся к данным.

MySQL всегда будет приводить ваши данные одинаково. Единственный способ, чтобы запись со страницы 1 отображалась на странице 2, – это если новая запись была вставлена ​​между моментом перехода пользователя со страницы 1 на страницу 2. Другими словами: вам не о чем беспокоиться.

Ресурс – это случай MySQL – это указатель рода, который указывает на набор результатов. Затем вы можете манипулировать этим (выборка данных по строкам, подсчет количества возвращаемых строк и т. Д.). Это не глобально.

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

B. да, записи перемещаются по страницам. Ничего плохого в этом.

C. Ничто в PHP не поддерживает состояние между вызовами. Никакой ресурс не может быть сохранен в сеансе. пойдите для смещения pagination.

Из моего опыта (что немного) я обычно использовал первый метод, потому что каждый раз, когда вы переходите на другую страницу, вы всегда будете получать обновленные данные из mysql. Да, если вы используете order by last_updated_time, результат будет перемещаться по страницам.

Но я думаю, что это не то, что у вас на уме. Как вы упомянули в своем третьем вопросе, возможно, вы хотите иметь какой-то буфер для своих результатов, но это означает, что вам нужно создать буфер для каждого результата (вот почему вы упоминаете об использовании файла для хранения результата mysql).

вероятно, это тот ответ, который вы ищете (если это можно было бы рассматривать как ответ вообще: LOL), но моя цель просто пыталась дать некоторую перспективу.

При построении SQL вы можете сделать что-то вроде следующего (0 – смещение, 10 – сколько строк для возврата)

 SELECT * FROM `your_table` LIMIT 0, 10 

Это отобразит первые 10 результатов из базы данных.

Альтернативный синтаксис, 3 запроса, показывающий первые 30 результатов 1-10,11-20,21-30.

 SELECT * FROM `your_table` LIMIT 10 OFFSET 0 SELECT * FROM `your_table` LIMIT 10 OFFSET 10 SELECT * FROM `your_table` LIMIT 10 OFFSET 20 

Редактировать:

Хорошо, чтобы уточнить, вариант 1 – ваш лучший выбор. Перейдите в номер страницы. Предел – это один и тот же запрос, а $offset = ($pageNum - 1 ) * 10; ,

Вам понадобится предложение ORDER BY . Однако, если содержимое базы данных изменяется между загрузкой страницы, пользователь может заметить расхождения. Это зависит от того, насколько часто ваши данные меняются.

Я не пытался хранить результат mysql_query () в сеансе. Я бы не подозревал, что вы думаете об этом. Как и при окончании скрипта, вы можете считать mysql_close () неявным образом и уничтожены.