Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Постраничный вывод новостей (https://javascript.ru/forum/server/44909-postranichnyjj-vyvod-novostejj.html)

malltaf 06.02.2014 12:34

Постраничный вывод новостей
 
Добрый день, уважаемые знатоки.
Есть код функции вывода новостей, необходимо этот вывод сделать постранично.

// выведем новости
//$typ=0 кратко 1- полно
function GetNews($typ=0)
{global $mysql;
$tmpcont='';
//////////////////////////////////////
$coltov=15;  //количество выводимых новостей на странице
echo ('coltov='.$coltov);
if(isset($_GET['p'])){
	$p=$_GET['p'];
	echo ('<br>'."isset: ".$p.'<br>');}
else {
	$p=1;
	echo ('<br>'."nope: ".$p.'<br>');}
 
$limitstart=($p-1)*$coltov;
 
$query='select count(nw.nomer) as cn from neonnews as nw order by datas' ;
$res = $mysql->sql_query($query) ;
$list = $mysql->sql_fetchrow($res) ;
$colvsego=$list['cn'];
echo $colvsego;
$det='<a href="?usrnews='.$coltov.'&cid=news&p=%s">%s</a>'; //ссылка на страницу
$pages=ViewPage($colvsego,$det,$p,$coltov,5); //5 (default = 10) - количество одновременно выводимых страниц
/////////////////////
$query='select *  from neonnews order by datas DESC';
$res = $mysql->sql_query($query) ;
 
if($coltov>0)
	{
	$tmpcont='fuck <div style="float:left; '._wdth.'">'.$pages.$listsortnw._templdetacs1;
 
		for($i=1; $i<=$coltov; $i++)
		{
		$listviv = $mysql->sql_fetchrow($res) ;
			if($typ)
			$tmpcont.= sprintf(_templnewsf,$listviv['datas'],$listviv['anons'],$listviv['news']);
			else
			$tmpcont.= sprintf(_templnews,$listviv['datas'],$listviv['anons'],$listviv['news']);
		}		
	$tmpcont.='</div>'._templdetacs2;
	}
$mysql->sql_freeresult($res);
return $tmpcont;
}


Новости выводятся, номера страниц тоже (1, 2, 3, 4 и пр.), переход на них посредстом GET осуществляется (номер страницы отображается в адресной строке). Однако новости не меняются, т.е. на первой странице были новости, например, о новой породе собак 2014, на второй (третьей или любой другой), тоже новости о новой породе собак 2014, хотя должны быть о старой модели автомобиля 2013.
Подозреваю, что дело в SQL-запросе. Вероятнее всего, не хватает "limit'.$limitstart.','.$coltov" в query, но как-то не выходит у меня лимитировать запрос (если лимитировать первый запрос, то не выводятся странички (1, 2, 3, 4 ...), если второй - не выводятся сами новости).
Или, может, нужно сделать новый запрос к БД?
Заранее благодарен и надеюсь на вашу помощь.
P.S. Функция ViewPage формирует как раз эти 1, 2, 3, 4 странички, их количество, их внешний вид и т.п.
P.S.S. В БД neonnews есть столбцы nomer (тот же id по сути), anons (короткая версия новости), datas (дата), news (полная версия новости).
P.S.S.S. Всякие echo там для себя, для проверки.

ksa 06.02.2014 13:30

Цитата:

Сообщение от malltaf
Подозреваю, что дело в SQL-запросе.

У каждой СУБДшки свой вариант "постраничного вывода" таблицы...
У нас, например, можно использовать "служебную переменную"

SELECT *, %vid FROM (<твой_запрос>) WHERE %vid BETWEEN <Page-1>*<N> AND <Page>*<N>

Где:
Page - номер страницы
N - количество строк на странице

Для тебя может подойдет что-то из этого... ;)

malltaf 06.02.2014 13:49

Мда. Спасибо. Нет, серъезно, первый же результат поиска в яндексе помог и проблема решилась. Т.е. добавил я лишь limit '.$coltov.' offset '.$limitstart в второй запрос. А гугл мне подобного не выдавал, плохой гугл, плохой... Ну или я не там искал)
Еще раз спасибо =)

ksa 06.02.2014 13:53

Цитата:

Сообщение от malltaf
первый же результат поиска в яндексе помог и проблема решилась

Ну видал как... :)

malltaf 06.02.2014 14:24

Странно, что LIMIT offset, rows - не решило проблему, а LIMIT rows OFFSET offset - решило...

kostyanet 07.02.2014 06:08

Первое значение LIMIT - старт, второе - сколько.

LIMIT 10, 20 --- со строки 10 еще 20 строк, то есть 10-30.

Цитата:

Сообщение от malltaf
а LIMIT rows OFFSET offset

Чистоганом MySQL'ный синтаксис, в АНЗИ нет offset.

Ну и главное, чтобы реализовать страничность требуется узнать каково общее число записей в заданных условиях (where, group by, etc).

UPD. Увидел как оно реализовано. Когда ньюсы внезапно обрастут связанными таблицами такой метод обломится.

kostyanet 07.02.2014 06:09

Цитата:

Сообщение от malltaf
первый же результат поиска в яндексе помог и проблема решилась

Неизвестно что вы и как искали. Наверно еще и по-русски.

mysql paging - https://www.google.com/search?safe=o....0.C_mkesy9lDE


Часовой пояс GMT +3, время: 03:16.