|
|
|
| Ребят, помогите пожалуйста :)
Есть скрипт новостей с вашего сайта. Задача такая - необходимо сделать постраничную навигацию, вида << < ..2|3|<b>4</b>|5|6.. > >> как у вас в статье: http://www.softtime.ru/info/articlephp.php?id_article=33
Все делаю по статье, но не получается...
<?php
///////////////////////////////////////////////////
// Блок "Новости"
// 2003-2006 (C) IT-студия SoftTime (http://www.softtime.ru)
// Симдянов И.В. (simdyanov@softtime.ru)
// Голышев С.В. (softtime@softtime.ru)
///////////////////////////////////////////////////
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Новости</title>
<link rel="StyleSheet" type="text/css" href="news.css">
</head>
<?php
// Выставляем уровень обработки ошибок (http://www.softtime.ru/info/articlephp.php?id_article=23)
Error_Reporting(E_ALL & ~E_NOTICE);
// Этот файл выводит первые $pnumber новостей
// Устанавлинваем соединение с базой данных
require_once("../config.php");
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<p class="zagblock">НОВОСТИ</p>
<?php
// Выясняем общее количество новостей в базе данных, для того чтобы
// правильно отображать ссылки на последующие новости.
$tot = mysql_query("SELECT count(*) FROM news WHERE hide='show' AND putdate <= NOW()");
if ($tot)
{
$total = mysql_result($tot,0);
// Если в базе новостей меньше чем $pnumber
// выводим их без вывода ссылки "Все новости".
if($pnumber < $total) echo "<p class='linkblock'><a href=news.php class='linkblock'>Все новости</a>";
}
else puterror("Ошибка при обращении к блоку новостей");
// Запрашиваем все видимые новости, т.е. те, у которых в базе данных hide='show',
// если это поле будет равно 'hide', новость не будет отображаться на странице
$query = "SELECT `news`.`id_news` AS `id_news`,
`news`.`name` AS `name`,
`news`.`body` AS `body`,
`news`.`intro` AS `intro`,
DATE_FORMAT(putdate,'%d.%m.%Y') AS putdate_format,
`news`.`url` AS `url`,
`news`.`url_text` AS `url_text`,
`news`.`url_pict` AS `url_pict`,
`news`.`cat_id` AS `cat_id`,
`news`.`autor` AS `autor`,
`cat`.`cat_name` AS `cat_name`
FROM `news`,`cat`
WHERE `news`.`cat_id`=`cat`.`cat_id` AND hide='show' AND putdate <= NOW()
ORDER BY putdate DESC
LIMIT $pnumber";
$new = mysql_query($query);
if(!$new) puterror("Ошибка при обращении к блоку новостей");
if(mysql_num_rows($new) > 0)
{
echo "<table>";
while($news = mysql_fetch_array($new))
{
echo "<div id=main_body1>";
// Выводим заголовок новости
echo "<tr><td><a class=anewsblock href=news.php?id_news=".$news['id_news']."><p class=newsblockzag><b>".$news['name']."</b></p></a>";
echo "<tr><td><p id=bottom_text>Категория: <b>".$news['cat_name']."</b> | Создано:<em class=datanews> ".$news['putdate_format']."</em></p>";
// Выводим анонс
echo "<tr><td class=newsblock>".$news['intro'];
echo "<tr><td><br /><p id=bottom_text>Автор: <b>".$news['autor']."</b> | <a class=anewsblock href=news.php?id_news=".$news['id_news'].">Подробнее...</a>";
}
echo "</table>";
}
<br><br>
===============================================================
//Вставляю вот так: ==========================================
===============================================================
$num = 5;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT COUNT(*) FROM news");
$posts = mysql_fetch_row($result);
// Находим общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM news LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage
?>
|
Структура таблицы:
Структура таблицы `news`
--
CREATE TABLE `news` (
`id_news` int(11) NOT NULL auto_increment,
`cat_id` int(11) NOT NULL default '0',
`autor` tinytext NOT NULL,
`name` tinytext NOT NULL,
`body` text NOT NULL,
`intro` text NOT NULL,
`putdate` datetime NOT NULL default '0000-00-00 00:00:00',
`url` tinytext NOT NULL,
`url_text` tinytext NOT NULL,
`url_pict` tinytext NOT NULL,
`hide` enum('show','hide') NOT NULL default 'show',
PRIMARY KEY (`id_news`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ;
|
Подскажите как правильно переделать скрипт постраничной навигации по вашей статье чтобы он работал в данном примере....
Заранее спасибо... | |
|
|
|
|
|
|
|
для: maxfade
(26.04.2007 в 15:01)
| | Присмотрелся к скрипту, и заметил, что он из ссылки берет номер страницы, а как быть если у меня сылка вот такая: http://localhost/content/
Как применить данный скрипт для такого случая? | |
|
|
|
|
|
|
|
для: maxfade
(26.04.2007 в 15:39)
| | Может на этом примере получится?
<?
Error_Reporting(E_ALL & ~E_NOTICE);
include("config.php");
mysql_query ("set character_set_client='cp1251'");
mysql_query ("set character_set_results='cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");
// устанавливаем число записей на странице
define('max', $pnumber);
// номер страницы получаем из GET переменной page
// нам подойдёт только целое число
$page = intval($_GET['page']);
$_GET['page'] = htmlspecialchars(stripslashes($_GET['page']));
if(empty($page) or $page < 0) $page = 1;
// выполняем запрос, который узнает число записей в таблице
$res = mysql_query('SELECT COUNT(*) FROM 'table');
// сохраняем результат в переменную
$kv = mysql_result($res, 0);
// узнаём общее число страниц
// round не подходит, т.к. иногда количество страниц будет определяться не правильно
$num = ceil($kv / max);
// выбираем записи, принадлежащие текущей странице
// не забываем отсортировать новости по дате добавления
$res = mysql_query('SELECT * FROM table
WHERE hide="show"
ORDER BY puttime DESC
LIMIT '.(($page - 1) * max).', '.max);
echo "<br>";
?>
<table class="table" border="1" cellpadding="3" cellspacing="0" width="90%" bordercolordark="white" bordercolorlight="silver">
<tr align="center">
<td height="20" class="title">
Дата</td>
<td class="title">Производитель</td>
<td class="title">Тип памяти</td>
<td class="title">Цена</td>
<td class="title">Телефон</td>
<td class="title"> </td>
</tr>
<?
// выводим данные
while ($par = mysql_fetch_array($res))
{
echo "<tr class=row align=center onmouseover=trtover(this) onmouseout=trtout(this)>
<td>".$par['puttime']."</td>
<td>".$par['firm']."</td>
<td>".$par['tip']."</td>
<td>".$par['price']." (".$par['valyta'].")</td>
<td>(".$par['kod'].")".$par['tel']."</td>
</tr>";
}
echo "</table>";
echo "<br>";
echo "<center>";
// смотрим за тем, чтобы номер страницы не вылетел за диапазоны
if ($page < 1 || $page > $num) {
$page = 1;
}
print '<<';
// в цикле выводим ссылки на страницы
for ($i = 1; $i <= $num; $i++)
{
if ($page != $i)
{
print '<a href="index.php?page='.$i.'">'.$i.'</a> ';
}
else
{
// ссылку на текущею страницу не выводим
print '<font color="red">['.$i.']</font> ';
}
}
print '>>';
echo "</center>";
?> | |
|
|
|
|
|
|
|
для: maxfade
(26.04.2007 в 15:01)
| | Именно по этому примеру изучал постраничную навигацию.
Всё работало. Ищи где ошибаешься. | |
|
|
|
|
|
|
|
для: mikha
(26.04.2007 в 18:11)
| | Спасибо, постраничная навигация получилась, только вот не выходит сделать объединение таблиц, которое у меня было сделано в запросе ранее:
"SELECT `news`.`id_news` AS `id_news`,
`news`.`name` AS `name`,
`news`.`body` AS `body`,
`news`.`intro` AS `intro`,
DATE_FORMAT(putdate,'%d.%m.%Y') AS putdate_format,
`news`.`url` AS `url`,
`news`.`url_text` AS `url_text`,
`news`.`url_pict` AS `url_pict`,
`news`.`cat_id` AS `cat_id`,
`news`.`autor` AS `autor`,
`cat`.`cat_name` AS `cat_name`
FROM `news`,`cat`
WHERE `news`.`cat_id`=`cat`.`cat_id` AND hide='show' AND putdate <= NOW()
|
Подскажите где копать? | |
|
|
|
|
|
|
|
для: maxfade
(27.04.2007 в 18:50)
| | а точнее? что именно не получается? пример можно увидеть? | |
|
|
|
|
 73.8 Кб |
|
|
для: kviki
(27.04.2007 в 19:30)
| | Вроде получилось все сделать использую статью: http://www.softtime.ru/info/articlephp.php?id_article=33 , только подправил вот эти строки:
$result = mysql_query("SELECT * FROM news");
$posts = mysql_num_rows($result);
|
Но в итоге получается что вродебы все верно, но вот косяк в следующем. На каждой странице выводиться по пять новостей.
Допустим всего их 6-ть, значит на первой странице 5-ть на второй выводиться 1-на, но после нее выводяться в цикле пустые поля остальных 4-х.
Вот код:
<?php
///////////////////////////////////////////////////
// Блок "Новости"
// 2003-2006 (C) IT-студия SoftTime (http://www.softtime.ru)
// Симдянов И.В. (simdyanov@softtime.ru)
// Голышев С.В. (softtime@softtime.ru)
///////////////////////////////////////////////////
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Новости</title>
<link rel="StyleSheet" type="text/css" href="news.css">
</head>
<?php
// Выставляем уровень обработки ошибок (http://www.softtime.ru/info/articlephp.php?id_article=23)
Error_Reporting(E_ALL & ~E_NOTICE);
// Этот файл выводит первые $pnumber новостей
// Устанавлинваем соединение с базой данных
require_once("../config.php");
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<p class="zagblock">НОВОСТИ</p>
<?php
// Выясняем общее количество новостей в базе данных, для того чтобы
// правильно отображать ссылки на последующие новости.
$tot = mysql_query("SELECT count(*) FROM news WHERE hide='show' AND putdate <= NOW()");
if ($tot)
{
$total = mysql_result($tot,0);
// Если в базе новостей меньше чем $pnumber
// выводим их без вывода ссылки "Все новости".
if($pnumber < $total) echo "<p class='linkblock'><a href=news.php class='linkblock'>Все новости</a>";
}
else puterror("Ошибка при обращении к блоку новостей");
// Запрашиваем все видимые новости, т.е. те, у которых в базе данных hide='show',
// если это поле будет равно 'hide', новость не будет отображаться на странице
$query = "SELECT `news`.`id_news` AS `id_news`,
`news`.`name` AS `name`,
`news`.`body` AS `body`,
`news`.`intro` AS `intro`,
DATE_FORMAT(putdate,'%d.%m.%Y') AS putdate_format,
`news`.`url` AS `url`,
`news`.`url_text` AS `url_text`,
`news`.`url_pict` AS `url_pict`,
`news`.`cat_id` AS `cat_id`,
`news`.`autor` AS `autor`,
`cat`.`cat_name` AS `cat_name`
FROM `news`,`cat`
WHERE `news`.`cat_id`=`cat`.`cat_id` AND hide='show' AND putdate <= NOW()
ORDER BY putdate DESC
LIMIT $pnumber";
?>
<br /><br />
<?php
// Устанавливаем соединение с базой данных
include "../config.php";
// Переменная хранит число сообщений выводимых на станице
$num = 5;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT * FROM news");
$posts = mysql_num_rows($result);
// Находим общее число страниц
$total = floor (($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$page = floor ($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT `news`.`id_news` AS `id_news`,
`news`.`name` AS `name`,
`news`.`body` AS `body`,
`news`.`intro` AS `intro`,
DATE_FORMAT(putdate,'%d.%m.%Y') AS putdate_format,
`news`.`url` AS `url`,
`news`.`url_text` AS `url_text`,
`news`.`url_pict` AS `url_pict`,
`news`.`cat_id` AS `cat_id`,
`news`.`autor` AS `autor`,
`cat`.`cat_name` AS `cat_name`
FROM `news`,`cat`
WHERE `news`.`cat_id`=`cat`.`cat_id` AND hide='show' AND putdate <= NOW()
ORDER BY putdate DESC
LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
?>
<?php
echo "<table>";
for($i = 0; $i < $num; $i++)
{
// Выводим заголовок новости
echo "<tr><td><a class=anewsblock href=news.php?id_news=".$postrow[$i]['id_news']."><p class=newsblockzag><b>".$postrow[$i]['name']."</b></p></a></td></tr>";
echo "<tr><td><p id=bottom_text>Категория: <b>".$postrow[$i]['cat_name']."</b> | Создано:<em class=datanews> ".$postrow[$i]['putdate_format']."</em></p></td></tr>";
// Выводим анонс
echo "<tr><td class=newsblock>".$postrow[$i]['intro'];
echo "<tr><td><br /><p id=bottom_text>Автор: <b>".$postrow[$i]['autor']."</b> | <a class=anewsblock href=news.php?id_news=".$postrow[$i]['id_news'].">Подробнее...</a></td></tr>";
}
echo "</table><br /> <br />";
?>
<?php
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./index.php?page=1><<</a>
<a href= ./index.php?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./index.php?page='. ($page + 1) .'>></a>
<a href= ./index.php?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./index.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./index.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./index.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./index.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo '<center>';
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
echo '</center>';
?>
<br /> <br />
|
В качестве примера прикрепил картинку: http://softtime.ru/forum/files/36587-20070428062204.JPG
Подскажите в чем косяк? | |
|
|
|
|
|
|
|
для: maxfade
(28.04.2007 в 06:13)
| | в своем примере я использовал такого рода конструкцию для вы вода данных
<td>".$par['puttime']</td>
попробуй убрать цикл for($i = 0; $i < $num; $i++)
и не использоваться массив $postrow[$i]['intro']; ,
а воспользоваться
echo "<tr><td class=newsblock>".$postrow['intro']; | |
|
|
|
|
|
|
|
для: kviki
(28.04.2007 в 08:49)
| | Действительно :)
Вот правильный код с постраниченой навигацией, который работает на 100%:
<?php
///////////////////////////////////////////////////
// Блок "Новости"
// 2003-2006 (C) IT-студия SoftTime (http://www.softtime.ru)
// Симдянов И.В. (simdyanov@softtime.ru)
// Голышев С.В. (softtime@softtime.ru)
///////////////////////////////////////////////////
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Новости</title>
<link rel="StyleSheet" type="text/css" href="news.css">
</head>
<?php
// Выставляем уровень обработки ошибок (http://www.softtime.ru/info/articlephp.php?id_article=23)
Error_Reporting(E_ALL & ~E_NOTICE);
// Этот файл выводит первые $pnumber новостей
// Устанавлинваем соединение с базой данных
require_once("../config.php");
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<p class="zagblock">НОВОСТИ</p>
<?php
// Выясняем общее количество новостей в базе данных, для того чтобы
// правильно отображать ссылки на последующие новости.
$tot = mysql_query("SELECT count(*) FROM news WHERE hide='show' AND putdate <= NOW()");
if ($tot)
{
$total = mysql_result($tot,0);
// Если в базе новостей меньше чем $pnumber
// выводим их без вывода ссылки "Все новости".
if($pnumber < $total) echo "<p class='linkblock'><a href=news.php class='linkblock'>Все новости</a>";
}
else puterror("Ошибка при обращении к блоку новостей");
// Запрашиваем все видимые новости, т.е. те, у которых в базе данных hide='show',
// если это поле будет равно 'hide', новость не будет отображаться на странице
// Переменная хранит число сообщений выводимых на станице
$num = 5;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT * FROM news");
$posts = mysql_num_rows($result);
// Находим общее число страниц
$total = floor (($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$page = floor ($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT `news`.`id_news` AS `id_news`,
`news`.`name` AS `name`,
`news`.`body` AS `body`,
`news`.`intro` AS `intro`,
DATE_FORMAT(putdate,'%d.%m.%Y') AS putdate_format,
`news`.`url` AS `url`,
`news`.`url_text` AS `url_text`,
`news`.`url_pict` AS `url_pict`,
`news`.`cat_id` AS `cat_id`,
`news`.`autor` AS `autor`,
`cat`.`cat_name` AS `cat_name`
FROM `news`,`cat`
WHERE `news`.`cat_id`=`cat`.`cat_id` AND hide='show' AND putdate <= NOW()
ORDER BY putdate DESC
LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
echo "<table>";
while ( $postrow = mysql_fetch_array($result))
{
// Выводим заголовок новости
echo "<tr><td><a class=anewsblock href=news.php?id_news=".$postrow['id_news']."><p class=newsblockzag><b>".$postrow['name']."</b></p></a></td></tr>";
echo "<tr><td><p id=bottom_text>Категория: <b>".$postrow['cat_name']."</b> | Создано:<em class=datanews> ".$postrow['putdate_format']."</em></p></td></tr>";
// Выводим анонс
echo "<tr><td class=newsblock>".$postrow['intro'];
echo "<tr><td><br /><p id=bottom_text>Автор: <b>".$postrow['autor']."</b> | <a class=anewsblock href=news.php?id_news=".$postrow['id_news'].">Подробнее...</a></td></tr>";
}
echo "</table><br /> <br />";
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./index.php?page=1><<</a>
<a href= ./index.php?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./index.php?page='. ($page + 1) .'>></a>
<a href= ./index.php?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./index.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./index.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./index.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./index.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo '<center>';
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
echo '</center>';
?>
<br /> <br />
|
Всем спасибо, тему можно считать закрытой. :) | |
|
|
|
|
|
|
|
для: maxfade
(28.04.2007 в 06:13)
| | Корень Ваших бед - вот эта конструкция
while ( $postrow[] = mysql_fetch_array($result))
?>
<?php
|
Она, хотя и взята из примера, но содержит сразу два подводных камня, и автору этого примера за такой код очень хочется кое-что прищемить.
Первый камень - отсутствие оператора тела цикла. Только волюнтаризм синтаксиса php разрешает неоднозначность в пустой оператор.
Второй камень - то, что в последний элемент массива $postrow попадает значение false, нахрен там никому не сдавшееся.
корректный код выглядит примерно так:
for($postrow=array(); $row = mysql_fetch_array($result); )
$postrow[]=$row;
|
либо так:
for($postrow=array(); $row = mysql_fetch_array($result); $postrow[]=$row)
;
|
Администраторы форума, почему то эту статью очень любят. Настолько, что не исправляют даже явный баг в строке $posts = mysql_fetch_row($result); не смотря на то, что им указывали на него неоднократно. Интересно, кто, всё ж таки, автор этой статьи? | |
|
|
|
|