PHP и MySQL: правильное форматирование URL при использовании пагинации для отображения изображений из нескольких галерей - PullRequest
1 голос
/ 20 октября 2010

Я установил простую систему галерей в PHP, которая построена так, чтобы отображать одно изображение на страницу.Мой параметр URL просто использует переменную галереи и переменную страницы и никоим образом не использует изображение iD для его извлечения.Это потому, что я устанавливаю свои настройки htaccess для создания дружественного URL:

http://mysite.com/images/1/

^ Вытащил бы первое изображение в моем запросе MySQL

или

http//mysite.com/images/12/

^ Вытянул бы 12-е изображение в моем запросе MySQL

Страница PHP тогда бы выглядела так:

images.php?gallery=images&page=1

и

images.php?gallery=images&page=12

Запросы (упрощенные) будутзатем выгляните так для каждого из вышеперечисленных:

Для первого изображения:

SELECT id, img_src 
FROM pictures 
WHERE gallery = images
ORDER BY date_added DESC 
LIMIT 0, 1

и для 12-го изображения:

SELECT id, img_src
FROM pictures 
WHERE gallery = images 
ORDER BY date_added DESC 
LIMIT 11, 1

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

SELECT id, gallery, img_src 
FROM pictures
ORDER BY date_added DESC
LIMIT 10

Есть ли какой-нибудь способ узнать, какую "позицию" или "page 'каждое изображение предназначено для конкретной галереи, чтобы я мог правильно создать ссылку?

Например, скажем, десять последних миниатюр вернули 4 изображения из галереи' images ', а затем 2 изображения из галереи'weddings', затем 3 изображения из галереи 'портреты' и еще одно изображение из галереи 'images', поэтому мои ссылки должны быть такими:

http://mysite.com/images/1/
http://mysite.com/images/2/
http://mysite.com/images/3/
http://mysite.com/images/4/
http://mysite.com/weddings/1/
http://mysite.com/weddings/2/
http://mysite.com/portraits/1/
http://mysite.com/portraits/2/
http://mysite.com/portraits/3/
http://mysite.com/images/5/

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

Ответы [ 3 ]

3 голосов
/ 20 октября 2010

Если вы все еще создаете сайт, я бы изменил URL, чтобы показать действительные идентификаторы изображения , а не псевдоидентификатор на основе нумерации страниц.

Это хорошо по нескольким причинам:

  • SEO .Ваши страницы остаются прежними.Google индексирует их, и когда посетитель заходит на сайт по адресу example.com/wedding/4234, он фактически находит то, что ищет, а не то, что Google проиндексировал в последний раз, когда ваш сайт сканировался

  • Простота .Вы уже столкнулись с проблемой, которая была бы легко решена, если бы вы использовали реальные идентификаторы изображений на первом месте.

  • Analytics .Вы узнаете, какой контент ведет людей на ваш сайт.Здесь нет догадок.URL-адреса всегда будут оставаться неизменными (независимо от того, приходит новый контент или нет).

0 голосов
/ 20 октября 2010

Я собираюсь добавить к ответу Фрэнки, потому что я также верю, что текущий метод ОП однажды снова укусит его в задницу. ОП может не найти это полезным, но может помочь кому-то еще.

Вы можете использовать http://site.com/images/20,, но 20 представляет идентификатор изображения вместо номера страницы. Конечно, запрос на получение изображения прост:

SELECT id, img_src 
FROM pictures 
WHERE gallery = images
AND id = 20
LIMIT 1

В качестве преимущества этот запрос более эффективен, чем использование смещения с предложением LIMIT. Но ОП сказал в комментарии, что ему нравится его текущая система, потому что она не требует дополнительных запросов к базе данных, чтобы помочь построить ссылки на страницы Ну, это не проблема здесь.

Допустим, вы находитесь на странице http://site.com/images/20. Ссылки на вашу страницу будут следующими:

Пред. - http://site.com/images/prev/20 Далее - http://site.com/images/next/20

Очевидно, что для создания этих ссылок не потребовалось никаких дополнительных запросов. Это просто немного другой URL с одинаковым идентификатором изображения. Но как они работают, чтобы перейти к следующему или предыдущему изображению? Просто. Вместо приведенного выше запроса вы должны использовать один из них:

Если была нажата предыдущая ссылка, вы используете этот запрос:

SELECT id, img_src
FROM pictures
WHERE gallery = 'images'
AND id < 20
ORDER BY id DESC
LIMIT 1;

Если была нажата следующая ссылка, вы используете этот запрос:

SELECT id, img_src
FROM pictures
WHERE gallery = 'images'
AND id > 20
ORDER BY id ASC
LIMIT 1;

Первый запрос дает изображение, которое предшествовало текущему, а второй запрос дает изображение, которое идет после текущего.

0 голосов
/ 20 октября 2010

Быстро и грязно:

$sql = "SELECT id, gallery, img_src 
FROM pictures
ORDER BY date_added DESC
LIMIT 10";

$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result)) {
    if(!$$row['gallery']) $$row['gallery'] = array();
    array_push($$row['gallery'], $row['id']);
    $pagenumber = count($$row['gallery']);
    echo "<a href=\"http://mysite.com/{$row['gallery']}/$pagenumber/\">
        <img src=\"{$row['img_src']}\" alt=\"\"></a><br>";
        // alt attribute for w3 validation (http://validator.w3.org/)
}

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

Исправлена ​​ошибка кода.Теперь будет динамически создавать массив, если он еще не существует.(Первоначально он незаконно использовал оператор [].)

...