Я новичок в программировании и у меня вопрос по навигации. Каковы различные методы, которые могут обеспечить навигацию «Первый», «Предыдущий», «Следующий» и «Последний», как это видно на сайтах, основанных на статьях или комиксах? (Правда, ссылка «Первая» не сбивает с толку, поскольку может оставаться статичной, но как насчет других?) Например, на 50-й странице ссылки должным образом ведут на 49-ю и 51-ю (если она существует, если нет). не будет работать, но автоматически станет активным, когда такая страница существует. В большинстве примеров этого я вижу URL-адреса, заканчивающиеся чем-то вроде ".php?id=50", но я не уверен, как это достигается с помощью базы данных? Любая помощь будет очень ценю, спасибо.
Методы достижения первой, предыдущей, следующей и последней навигации
Ответы (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 и разработку веб-приложений, поэтому я надеюсь, что это было полезно и просто.
Такой вид навигации называется пагинацией. Есть три переменные, влияющие на разбиение на страницы на данной странице:
- Общее количество предметов
- Количество элементов на странице
- Текущая страница
Обычно вы можете легко получить общее количество элементов из базы данных, используя такой запрос:
$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;
Вот и все. Надеюсь это поможет.
Возможно, это руководство или < вам поможет href="http://www.phpfreaks.com/tutorial/basic-pagination" rel="nofollow noreferrer">это.
Редактировать: мда, первый сайт был очень раздражающим. Нашел другой. :)
Я предполагаю, что вы говорите не о нумерации страниц (т. е. о разбиении большого списка записей на несколько страниц), а о подробном представлении записи и предварительных ссылках «следующая» / «предыдущая» на следующую и предыдущую запись. эм>.
Если у вас нет фиксированного способа узнать предыдущего и последнего соседей (поэтому вы не можете просто сказать «текущий идентификатор -1» и «+1»), вам придется выполнить запрос к базе данных, упорядоченный по вашим критериям, и узнать предыдущий и следующий члены.
Возможно, это связано с тем, что вы глубоко вникаете в проблему, а не в то, что вам нужно для начала, но недавно я задал вопрос, касающийся проблем оптимизации и различных подходов к быстрому и эффективному выполнению этого «поиска соседей». Кэширование результатов "следующего"/"предыдущего" запрос элемента
Есть довольно много способов сделать это, начиная от сложных и заканчивая простыми. (Поиск php-разбивки на страницы в Google).
?id=50 в некоторых URL-адресах предназначен для определения элемента, с которого нужно начать.
Например, в sql вы определяете диапазон элементов для выбора с помощью SELECT * FROM tbl LIMIT 0,10
, при этом будут выбраны записи 0-10. тогда SELECT * FROM tbl LIMIT 11,10
выберет от 11 до 20.
LIMIT 11, 20
выберет записи 11-30, так как второй параметр в LIMIT
— это продолжительность, а не конечная точка.
- person Tatu Ulmanen; 08.03.2010