Методы достижения первой, предыдущей, следующей и последней навигации

Я новичок в программировании и у меня вопрос по навигации. Каковы различные методы, которые могут обеспечить навигацию «Первый», «Предыдущий», «Следующий» и «Последний», как это видно на сайтах, основанных на статьях или комиксах? (Правда, ссылка «Первая» не сбивает с толку, поскольку может оставаться статичной, но как насчет других?) Например, на 50-й странице ссылки должным образом ведут на 49-ю и 51-ю (если она существует, если нет). не будет работать, но автоматически станет активным, когда такая страница существует. В большинстве примеров этого я вижу URL-адреса, заканчивающиеся чем-то вроде ".php?id=50", но я не уверен, как это достигается с помощью базы данных? Любая помощь будет очень ценю, спасибо.


person Koroviev    schedule 08.03.2010    source источник


Ответы (5)


Бит в конце URL называется переменной GET. Когда пользователь переходит на страницу с единицей в конце, например:

example.org/comics/myawesomecomic.php?page=50

Сервер переходит на эту страницу, и (обычно) сценарий на стороне сервера выполняет некоторую работу перед выводом страницы пользователю. В PHP переменная GET является глобальной переменной (наряду с другими, большими из которых являются POST и COOKIE), которую php-скрипт может получить, получив значение, переданное с сервера на скрипт, в данном случае в $_GET['page'].

Итак, предположим, что у вас есть сценарий, который обрабатывает все запросы к сюжетной линии комикса «Мой удивительный комикс», и он разбит на 60 страниц, все, что нужно сделать пользователю, чтобы перейти на любую страницу, — это изменить переменную GET на номер страницы. Ваш скрипт может сделать что-то очень простое, например, получить содержимое каталога с именем myawesomecomic/ и получить файл с именем 50.html, а затем вывести его пользователю. Но есть вероятность, что вы хотите что-то более сложное, так как вы столкнулись с этой проблемой, поэтому вместо этого он берет 50-ю страницу из базы данных, обновляет всю навигацию и, возможно, даже добавляет стильную 50 - 60 в верхний угол.

Теперь самое простое, то есть ответ на ваш вопрос. Теперь, когда вы знаете, как работают переменные GET и что с ними делает серверный скрипт, все, что вам нужно сделать, чтобы сделать навигацию, как вы описываете, это:

$current_page = $_GET['page'];
$next_page = $current_page + 1;
$prev_page = $current_page - 1;
$first_page = 1;
$last_page = 

И эта последняя часть уже будет известна вам. Либо у вас всегда может быть одно и то же количество страниц, либо вы можете запрашивать БД одновременно с извлечением текущей страницы и т. д. Допустим, вы запрашивали у БД общее количество страниц, когда получали текущую страницу. И он вернул 60 (и мы предположим, просто чтобы избежать головной боли, что 60 — это количество страниц, начинающееся с 1, а не с 0), так что вернемся к навигации...

$last_page = 60;

Теперь у вас есть первый, последний, предыдущий и следующий. Предполагая, что вы разбираетесь в HTML, все, что осталось (кроме красивого вида):

 echo "
 <a href='myawesomecomic.php?page=$first_page'>First Page</a>
 <a href='myawesomecomic.php?page=$prev_page'>Previous Page</a>
 <a href='myawesomecomic.php?page=$next_page'>Next Page</a>
 <a href='myawesomecomic.php?page=$last_page'>Last Page</a>
 ";

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

НО!

Я только что дал вам очень красивую версию "мой первый опыт работы с PHP". Вещи, которые я упустил (о которых вы должны спросить больше или провести серьезное исследование):

  • Поскольку переменные GET включены в URL-адрес, их несложно понять. Я мог бы легко изменить ?page=50 на ?page=1=1 и, в зависимости от того, как вы получаете контент, я мог просто запросить все содержимое вашей базы данных. Никогда не перехватывайте пользовательский ввод (даже URL-адрес) прямо в свои переменные. Если вы знаете, что это номер страницы, то вы знаете, что это номер. Проверьте ввод, чтобы убедиться, что это число, прежде чем запускать его через сценарий и базу данных.

  • Вам нужна система на случай, если пользователь введет число, а оно окажется за пределами допустимого диапазона. Что-то простое, например «Извините, страница не найдена» или даже «Страница не найдена, начиная с начала» и отправка их обратно на страницу 1, что угодно. Если вы просто ничего не выводите, это выглядит плохо, и вы раскрываете части логики вашего скрипта, которыми можно манипулировать.

  • Когда вы освоитесь с переменными GET, я предлагаю отказаться от них для mod_rewrite (при условии, что вы работаете на сервере Apache). Не вмешивайтесь сейчас, но когда вы освоитесь, вы можете начать создавать URL-адреса, такие как: example.org/comics/myawesomecomic/page50 или example.org/comics/myawesomecomic/page/50 или что-то еще. Что на самом деле происходит, так это то, что все страницы в этом каталоге перенаправляются на один и тот же скрипт, который затем проверяет окончание URL-адреса, чтобы выяснить, что извлекать из БД. Но конечному пользователю кажется, что это просто веб-страница. Это выглядит чище (я думаю) и делает даже больше, чтобы покрыть логику вашего скрипта. Но я говорю подождать с этим, потому что это также открывает для вас другие риски, которые может быть труднее предвидеть, пока вы не привыкнете к санации вашего пользовательского ввода и обработке стандартных ошибок страницы, таких как «страница не найдена».

В любом случае, выяснение таких вещей, как добавление недели к текущей дате и добавление номера страницы к текущей странице, — это то, как я попал в PHP и разработку веб-приложений, поэтому я надеюсь, что это было полезно и просто.

person Anthony    schedule 09.03.2010
comment
Это действительно отличный ответ, я добавлю его в закладки для будущих спрашивающих, но что, если я нахожусь в записи 31, а запись 30 была удалена? Вы должны были бы сделать некоторые проверки для этого, я бы по крайней мере упомянул об этом. - person Pekka; 09.03.2010

Такой вид навигации называется пагинацией. Есть три переменные, влияющие на разбиение на страницы на данной странице:

  • Общее количество предметов
  • Количество элементов на странице
  • Текущая страница

Обычно вы можете легко получить общее количество элементов из базы данных, используя такой запрос:

$query = "SELECT COUNT(*) FROM tbl";
$count = mysql_result($query, 0);

А поскольку вы знаете количество элементов на странице и текущую страницу, вы можете вычислить, сколько всего страниц:

$perpage = 10; // This you can define yourself

$pages_count  = ceil($count / $perpage);

После этого легко сделать несколько простых предложений if, чтобы увидеть, какая навигация должна отображаться:

// Get the current page or set default if not given
$page = isset($_GET['page']) ? $_GET['page'] : 1;

$pages_count = ceil($count / $perpage);

$is_first = $page == 1;
$is_last  = $page == $pages_count;

// Prev cannot be less than one
$prev = max(1, $page - 1);
// Next cannot be larger than $pages_count
$next = min($pages_count , $page + 1);

// If we are on page 2 or higher
if(!$is_first) {
    echo '<a href="index.php?page=1">First</a>';
    echo '<a href="index.php?page='.$prev.'">Previous</a>';
}

echo '<span>Page '.$page.' / '.$pages_count.'</span>';

// If we are not at the last page
if(!$is_last) {
    echo '<a href="index.php?page='.$next.'">Next</a>';
    echo '<a href="index.php?page='.$pages_count.'">Last</a>';
}

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

$query = "SELECT * FROM tbl LIMIT ".(int)($page - 1)." ".(int)$perpage;

Вот и все. Надеюсь это поможет.

person Tatu Ulmanen    schedule 08.03.2010

Возможно, это руководство или < вам поможет href="http://www.phpfreaks.com/tutorial/basic-pagination" rel="nofollow noreferrer">это.

Редактировать: мда, первый сайт был очень раздражающим. Нашел другой. :)

person ghoppe    schedule 08.03.2010

Я предполагаю, что вы говорите не о нумерации страниц (т. е. о разбиении большого списка записей на несколько страниц), а о подробном представлении записи и предварительных ссылках «следующая» / «предыдущая» на следующую и предыдущую запись. .

Если у вас нет фиксированного способа узнать предыдущего и последнего соседей (поэтому вы не можете просто сказать «текущий идентификатор -1» и «+1»), вам придется выполнить запрос к базе данных, упорядоченный по вашим критериям, и узнать предыдущий и следующий члены.

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

person Pekka    schedule 08.03.2010

Есть довольно много способов сделать это, начиная от сложных и заканчивая простыми. (Поиск php-разбивки на страницы в Google).

?id=50 в некоторых URL-адресах предназначен для определения элемента, с которого нужно начать.

Например, в sql вы определяете диапазон элементов для выбора с помощью SELECT * FROM tbl LIMIT 0,10 , при этом будут выбраны записи 0-10. тогда SELECT * FROM tbl LIMIT 11,10 выберет от 11 до 20.

person cast01    schedule 08.03.2010
comment
На самом деле LIMIT 11, 20 выберет записи 11-30, так как второй параметр в LIMIT — это продолжительность, а не конечная точка. - person Tatu Ulmanen; 08.03.2010