Jump to content
  • 0

Вывод информации. Навигация.


Villain
 Share

Question

Здравствуйте. У меня проблема с навигацией, с ее не гибкостью, если так можно сказать. Есть статьи, у которых есть id(primary, auto_increment), навигация завязана на статьях: одна страница = одна статья. Там как бы стрелочки влево и вправо. То есть, если я жму вправо, то я увеличиваю id+1, тем самым меняю страницу и статью. Самое интересное, если какая нибудь статья будет удалена, то получается "провал" по id. И получается если переключать с помощью этого меню статьи, то будут пустые страницы.

Каким образом можно избежать такого? Чтобы было более автоматизировано? То есть надо как то переформировать статьи, чтобы "провалы" исчезли.

Получение статьи:


$result = mysql_query("SELECT * FROM advisors WHERE id=$page");
$row = mysql_fetch_array($result);
$max = mysql_query("SELECT MAX(id) FROM advisors");
$max = mysql_result($max,0);
$min = mysql_query("SELECT MIN(id) FROM advisors");
$min = mysql_result($min,0);

Навигация:


if ($page<=$min) {
echo '
<div id="leftdis">
<a href="#"></a>
</div>';
}
else {
echo '
<div id="left">
<a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.($page-1).'"></a>
</div>';
}
if ($page>=$max) {
echo '
<div id="rightdis">
<a href="#"></a>
</div>';
}
else {
echo '
<div id="right">
<a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.($page+1).'"></a>
</div>';
}

Edited by Villain
Link to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 0

Думаю, нужно сначала занести все имеющиеся id в какой-то массив (например, $page[]), отсортировать его значения по возрастанию, а потом в цикле оперировать элементами массива. Как-то так:


for ($i=0; $i<count($page); $i++) {
if ($page[$i]<=$min) {
echo '<div id="leftdis"><a href="#"></a></div>';
} else {
echo '<div id="left"><a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.$page[$i-1].'"></a></div>';
}
if ($page[$i]>=$max) {
echo '<div id="rightdis"><a href="#"></a></div>';
} else {
echo '<div id="right"><a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.$page[$i+1].'"></a></div>';
}
}

Edited by hypnocolor
Link to comment
Share on other sites

  • 0

Думаю, нужно сначала занести все имеющиеся id в какой-то массив.

Да, я думал об этом, тут все равно придется проверять существует ли статья при определенном id или нет.

Link to comment
Share on other sites

  • 0

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

В массив $page_list SQL-запросом занесите все id новостей, которые есть в данный момент. Нужно, чтобы значения элементов массива располагались в порядке возрастания. В $page, я так понял, хранится id текущей статьи. В таком случае, верный код будет такой:


if (!in_array($page, $page_list)){
echo '<div id="leftdis"><a href="#"></a></div><div id="rightdis"><a href="#"></a></div>';
} else {
$key = array_search($page, $page_list);
if ($page == $min) {
echo '<div id="leftdis"><a href="#"></a></div><div id="right"><a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.$page_list[$key+1].'"></a></div>';
} elseif ($page == $max) {
echo '<div id="left"><a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.$page_list[$key-1].'"></a></div><div id="rightdis"><a href="#"></a></div>';
} else {
echo '<div id="left"><a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.$page_list[$key-1].'"></a></div><div id="right"><a href="http://'.$_SERVER['HTTP_HOST'].'/code/'.$page_list[$key+1].'"></a></div>';
}
}

Не нужно будет никаких проверок на живость, т.к. в массиве у вас всегда будет заведомо верный список идентификаторов статей, взятый запросом из базы.

LunatiK, как я понял, листалка представляет из себя две ссылки (кнопки) вида ? и ?, и если текущая статья первая в архиве, должна быть неактивна ?, если последняя — неактивной должна быть ?, и если статья ни первая, ни последняя — активны обе ссылки.

Edited by hypnocolor
Link to comment
Share on other sites

  • 0

hypnocolor, попробую разобраться, спасибо.

UPDATE: Что-то не так работает, все написал, получается что вместо цифры, в ссылку вставляется название статьи. Если +или- убрать то все вроде правильно, в ссылке стоит id данной статьи, которая открыта.

UPDATE: hypnocolor, Ваш способ не работает, потому что array_search дает нам ключ, ключ равен 0, потому что в таблице id нулевое поле. Если мы внутри прибавляем +1, то мы меняем ключ на 1, то есть находим другое поле таблицы, а там у меня название статей.

LunatiK, hypnocolor прав. Вот схема:

8335284_600x400.jpg

Edited by Villain
Link to comment
Share on other sites

  • 0

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


$link_prev_news = mysql_query("SELECT * FROM `news` WHERE (`news_id` = (SELECT MAX(`news_id`) FROM `news` WHERE `news_id` < '".$view_sub_news['news_id']."'))");
$link_view_prev_news = mysql_fetch_array($link_prev_news);
if(isset($link_view_prev_news['news_url'])) {
echo '<p class="link_news_prev"><a href="http://'.$_SERVER['HTTP_HOST'].'/'.$link_view_prev_news['news_url'].'/news_sub/'.$link_view_prev_news['news_id'].'/">← К предыдущей</a></p>';
}

$link_next_news = mysql_query("SELECT * FROM `news` WHERE (`news_id` = (SELECT MIN(`news_id`) FROM `news` WHERE `news_id` > '".$view_sub_news['news_id']."'))");
$link_view_next_news = mysql_fetch_array($link_next_news);
if(isset($link_view_next_news['news_url'])) {
echo '<p class="link_news_next"><a href="http://'.$_SERVER['HTTP_HOST'].'/'.$link_view_next_news['news_url'].'/news_sub/'.$link_view_next_news['news_id'].'/">К следующей →</a></p>';
}

Link to comment
Share on other sites

  • 0

Villain, а откуда у вас в $page_list берутся названия статей? Я же уточнил, что это должен быть простой массив, содержащий только идентификаторы новостей, в возрастающем порядке.

Link to comment
Share on other sites

  • 0

LunatiK, hypnocolor прав. Вот схема:

8335284_600x400.jpg

Три запроса:


SELECT * FROM `table` WHERE `id` = $page <--Получение информации текущей страницы (статьи, заметки)
SELECT `id` FROM `table` WHERE `id` < $page ORDER BY `id` DESC LIMIT 1 <--Получение id предыдущей страницы (статьи, заметки)
SELECT `id` FROM `table` WHERE `id` > $page ORDER BY `id` ASC LIMIT 1 <--Получение id следующей страницы (статьи, заметки)

Link to comment
Share on other sites

  • 0

Villain, а откуда у вас в $page_list берутся названия статей? Я же уточнил, что это должен быть простой массив, содержащий только идентификаторы новостей, в возрастающем порядке.

Да, я когда уже уехал, понял что написал не то совсем. Ну я взял из таблицы: SELECT id FROM table ORDER BY id, получается +- если ставить то оказывается пустой ссылка.

LunatiK, не получается, покрутил по разному, возвращает пустоту. Я страницу определяю вот так:

if(isset($_GET['page'])) $page=$_GET['page'];
else $page=0;
$result = mysql_query("SELECT * FROM advisors WHERE id=$page");
$row = mysql_fetch_array($result);

rus, а что такое $view_sub_news?

Edited by Villain
Link to comment
Share on other sites

  • 0

Как это пустоту ?


//Текущая страница
$result = mysql_query('SELECT * FROM `advisors` WHERE id = '.$page);
$row = mysql_fetch_array($result);
Echo 'Текущая страница: <pre><xmp>'.print_r($row, true).'</xmp></pre>';

//Предыдущая страница
$result = mysql_query('SELECT `id` FROM `advisors` WHERE `id` < '.$page.' ORDER BY `id` DESC LIMIT 1');
$row = mysql_fetch_array($result);
Echo 'Предыдущая страница: <pre><xmp>'.print_r($row, true).'</xmp></pre>';


//Следующая страница
$result = mysql_query('SELECT `id` FROM `advisors` WHERE `id` > '.$page.' ORDER BY `id` ASC LIMIT 1');
$row = mysql_fetch_array($result);
Echo 'Следующая страница: <pre><xmp>'.print_r($row, true).'</xmp></pre>';

Вот это что выдаст?

Link to comment
Share on other sites

  • 0

rus, а что такое $view_sub_news?

а, ну это id подраздела самого раздела новости.

ну допустим у нас есть всякие разные разделы: контакты, о нас, бла-бла... и новости, а у новостей пошли подразделы - новость первая, вторая, третья и т.д... ну вот $view_sub_news это и есть ид новость первая, вторая, третья...

Link to comment
Share on other sites

  • 0

Дык а почему по текущей странице нет данных?

Каюсь, совершил глупость, поставил выводить код, там где нет $page. Вставил посмотреть куда положено, попробовал еще раз использовать, все получилось. Я где-то ошибку сделал, когда в первый раз пытался использовать, скорей всего вместо $row["id"], я писал просто $row, так как у себя я их назвал $npage и $ppage, тем самым совсем забыл что на самом деле из себя представляет $npage,$ppage.

Всем спасибо за помощь, проблема решена.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy