Методы для достижения первой, предыдущей, следующей и последней навигации - PullRequest
4 голосов
/ 08 марта 2010

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

Ответы [ 5 ]

4 голосов
/ 09 марта 2010

Бит в конце 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 и веб-приложений, поэтому я надеюсь, что это было полезнопростой.

2 голосов
/ 08 марта 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>';
}

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

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

Вот и все, что нужно сделать.Надеюсь, это поможет.

1 голос
/ 08 марта 2010

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

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

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

1 голос
/ 08 марта 2010

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

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

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

1 голос
/ 08 марта 2010

Возможно этот учебник или этот поможет вам.

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

...