10:58 

php навигация по страницам

Сильвана Ветрокрылая~
Anytime you call my name.
Перестраиваю весь свой сайт на php. С базой данных работать научилась, текст вывожу без проблем.
Единственная проблема, с которой столкнулась - постраничная навигация (вывод текста, например статей в определенном порядке и кол-ве на 1 странице).
В инете много где находила и пробовала различные варианты, но обычно либо не происходило вобще ничего, либо с жуткими ошибками.
Есть у кого-то возможность проконсультировать?

@темы: Вопросы, PHP

Комментарии
2011-11-22 в 11:42 

SpiritEagle
There I was on a July morning, Looking for love
Сильвана Ветрокрылая~
Есть. Стучи в аську, если хочешь - она у меня в профиле.

2011-11-22 в 20:28 

--==SS==--
Sanctus Satanas
Можно ещё выложить код на pastebin.com и сюда ссылочку и комментарии, что именно где не работает. )

2011-11-23 в 12:00 

Сильвана Ветрокрылая~
Anytime you call my name.
pastebin.com/ffZxeris

ничего нигде не работает)) это кусок кода, который хотя бы должен разделять кол-во статей на кол-во страниц. а именно по 3 статьи на страницу. и вывести на 1ой первые 3. вот он как выводил 7штук из базы, все что есть, так и выводит(

2011-11-24 в 01:09 

--==SS==--
Sanctus Satanas
Конкретно в этом коде явных косяков не вижу. Варианты:
1) либо у вас в базе поле str в первой записи из таблицы options не равно 3;
2) либо после выполнения этого кода вы выводите результат какого-то совсем другого запроса.
Проверьте, какой конкретно запрос идёт в базу.

Я, с позволения, ещё немного прокомментирую. )

@$page = $_GET['page'];
Здесь вы поставили подавление ошибки на операцию присваивания. Но переменной $page гарантированно можно присвоить всё, что угодно и это не может вызвать ошибку. )
Видимо, имелось в виду @$_GET['page'] — т.е. подавление ошибки при обращении к элементу 'page' из массива $_GET. Но вообще это тоже плохой вариант, гораздо лучше написать что-нибудь вроде:

$page = isset($_GET['page']) ? (int)$_GET['page'] : 0;

Если ещё не знакомы с условным оператором, то это то же самое, что:

if (isset($_GET['page'])){
    $page = (int)$_GET['page'];
} else {
    $page = 0;
}


if(empty($page) or $page < 0) $page = 1;
Проще было бы так:

if ($page <= 0) $page = 1;

2011-11-24 в 01:56 

Сильвана Ветрокрылая~
Anytime you call my name.
мне кажется, что у меня вариант второй. потому что первый точно нет, а над вторым я уже и сама думала. сейчас запишу весь код туда и прокомментирую чуток

2011-11-24 в 01:59 

Сильвана Ветрокрылая~
Anytime you call my name.
pastebin.com/g21FsvFL

здесь якобы какой-то текст, которого нет в принципе в помине

потом идет код того, что я уже кидала и далее



вывод текста из базы. вот может он за него и не цепляется вовсе, поэтому и не выводит нифига?

2011-11-24 в 02:04 

--==SS==--
Sanctus Satanas
Ну всё правильно. Вы сначала цепляете из базы правильные результаты (там, например, 3 записи, начиная с нуля), а тут ещё раз выполняете ещё один запрос, только уже вообще без каких-либо условий:

$result = mysql_query ("SELECT id, title, description FROM articles", $db);

Более того, ресурс результата в той же самой переменной $result, что и запрос в конце предыдущего кода. Так что второй вариант. )

2011-11-24 в 03:13 

--==SS==--
Sanctus Satanas
Кстати, вместо:

$row = mysql_fetch_assoc($result);
do {
    //
} while ($row = mysql_fetch_assoc($result));


можно писать так:

while ($row = mysql_fetch_assoc($result)) {
    //
}

2011-11-24 в 11:55 

Сильвана Ветрокрылая~
Anytime you call my name.
А можете подробненько подсказать что в сием коде убрать к чертям а что поменять? Я просто что то пробовала, но видимо что-то не то (

2011-11-24 в 18:34 

--==SS==--
Sanctus Satanas
Вот эту строчку убрать:
$result = mysql_query ("SELECT id, title, description FROM articles", $db);

Больше ничего не надо, всё остальное опционально. )

2011-11-25 в 01:50 

Сильвана Ветрокрылая~
Anytime you call my name.
я убрала. и вуаля: www.charmed4.net/articles.php
что то явно еще надо)))):shuffle:

2011-11-25 в 02:26 

--==SS==--
Sanctus Satanas
Не знаю, покажите исправленный код. В том, что видел выше, вроде, всё ок. Видимо, что-то сломали. )
Ну или перепишите вызов запроса примерно так: $result = mysql_query('текст запроса') or die(mysql_error()); Думаю, будет сразу понятно, в чём дело.

2011-11-25 в 10:39 

Сильвана Ветрокрылая~
Anytime you call my name.
pastebin.com/1mx8yyAx
вот код.. :shy:

2011-11-25 в 11:02 

--==SS==--
Sanctus Satanas
Вероятно, какая-то ошибка во время запроса. В 58-й строке перед точкой с запятой допишите or die(mysql_error())

2011-11-25 в 12:20 

Сильвана Ветрокрылая~
Anytime you call my name.
ответ: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-3, 3' at line 1
=))

2011-11-25 в 12:40 

--==SS==--
Sanctus Satanas
Ну так это значит, что $page = 0. А оно равно 0 потому что $total равно нулю. А $total равен нулю потому, во-первых, нет ни одной записи с заданным полем cat, а, во-вторых, потому, что intval округляет всегда вниз, как floor(). Вам нужно использовать или обычное округление — round() или округление вверх — ceil(). Мне сейчас лень думать, какое тут правильно, но одно из них точно. )

2011-11-25 в 13:01 

Сильвана Ветрокрылая~
Anytime you call my name.
:weep3::weep3::weep3::weep3::weep3:
вот если бы я понимала все это =(( я бы сделала, честно честно. я не ленюсь, я не понимаю :facepalm3:

2011-11-26 в 03:47 

--==SS==--
Sanctus Satanas
Сильвана Ветрокрылая~, так что, так и не разобрались?

Ок, показываю ход мыслей.
На 58-й строке у вас посылается запрос с LIMIT -3, 3, который, естественно, ошибочен. Это означает, что в переменной $start у вас число -3.
Из 55-й строки мы знаем, что $start вычисляется, как $page * $num - $num. Т.к. в переменной $num точно находится число 3 (оно попадает в строку запроса), то решив уравнение x * 3 - 3 = -3 получаем, что x = 0, т.е. в переменной $page находится ноль.
51-я строка гласит, что если $page равен или меньше нуля1, то $page присваивается единица. Почему же она тогда 0?
Потому, что в 52-й строке, если $page больше переменной $total, то ей присваивается значение $total. Из этого очевидно, что $total равняется 0 — а ноль действительно меньше единицы.
44-ю строку на пальцах объяснить сложно, но легко заметить, что при $posts, равном нулю, ((0 - 1) / 3) + 1= -1/3 + 1 = 2/3, т.е. 0,66666666666…
При этом в 45-й строке вы приводите $total к целому функцией intval(), которая округляет целые вниз. И именно поэтому $total становится нулевым.
Из этого следует, что, по крайней мере, при традиционном округлении и округлении вверх $total бы нулевым не стал. Но чтобы решить точно, каким округлением нужно воспользоваться и будет ли это вообще работать — нужно сначала разобраться с логикой 44-й строки. Я лично не могу сходу за минуту это прикинуть и честно написал, что мне лень. ))) Вы же, по крайней мере, можете попробовать поменять 45-ю строку на $total = round($total); или $total = ceil($total); и проверить самостоятельно, как это будет работать.

1 Правда, это записано через жопу, т.к. empty() возвращает true в том случае, если переменная не существует или равна null, false, 0, пустой строке, пустому массиву… В данном случае подобные проверки явно избыточны.

2011-11-26 в 13:33 

Сильвана Ветрокрылая~
Anytime you call my name.
Может есть какой нибудь вариант попроще подобного кода без лишних проверок?))

2011-11-26 в 17:25 

--==SS==--
Sanctus Satanas
Ну это относилось к if(empty($page) or $page < 0) $page = 1;
Я уже выше писал, что это проще записать, как if ($page <= 0) $page = 1;
Тут вообще ещё много, что можно написать проще и понятнее. ) Просто конкретно в этом я не вижу ошибки, мешающей работе скрипта. )

2011-11-29 в 15:04 

Сильвана Ветрокрылая~
Anytime you call my name.
я ставила и "45-ю строку на $total = round($total)" и "if ($page <= 0) $page = 1;".
результат прежний. вобще ничегошеньки не выводит.
www.charmed4.net/articles.php
:weep3:

причем в коде все так же стоит " or die(mysql_error());" , но страница не выдает никаких ошибок

UPD. удалила в запросе последнем WHERE cat='$cat', и он мне вывел 3 статьи!!!!!!!!! прям праздник праздник!!
а как теперь сделать так, чтобы он дальше выводил?))))) на следующей странице
потому что на www.charmed4.net/articles.php?page=2 выводятся одни и те же статьи

2011-11-29 в 18:45 

--==SS==--
Sanctus Satanas
А их всего сколько? Статей, то бишь. )
Про условие cat = $cat я просто не знаю, откуда оно у вас там и что выбирало. ) Вероятно, это была разбивка по категориям.

2011-11-30 в 02:02 

Сильвана Ветрокрылая~
Anytime you call my name.
всего их 7. то бишь должно быть 3 страницы. а если даже открывать ?page=4, то он все равно открывает и открывает 1ю. как и во 2ой и в 3ей. значит что-то неправильно он считает))
а cat это вобще фигня какая-то была.))

2011-11-30 в 02:06 

--==SS==--
Sanctus Satanas
Надо посмотреть, что там получается. Выведите куда-нибудь на страницу переменные $page, $start, $posts, $total, $num и $_GET['page'].
Разумеется, после того, как они посчитаются. ) Можно на 60-й строке, например. ))

2011-11-30 в 02:29 

Сильвана Ветрокрылая~
Anytime you call my name.
тааааак. а как? :shuffle:

2011-11-30 в 03:16 

--==SS==--
Sanctus Satanas
Как это как? oO Через echo или print. Или вот так можно:

<pre><?php var_dump($_GET, $posts, $page, $total, $start, $num) ?></pre>

2011-12-01 в 13:57 

Сильвана Ветрокрылая~
Anytime you call my name.
хм. вставила ваш код. вышло вот что:

www.charmed4.net/articles.php

2011-12-04 в 00:59 

--==SS==--
Sanctus Satanas
Ага, понятно. Вот здесь — $result00 = mysql_query("SELECT COUNT(*) FROM articles WHERE cat='$cat'"); — тоже стоит условие с $cat, его надо убрать.
И совет на будущее — когда заработает, смените пароль на MySQL, а то вы его забыли поцензурить в исходниках. ;-)

2011-12-04 в 13:47 

Сильвана Ветрокрылая~
Anytime you call my name.
ой а я как то и не думала насчет этого =)) слишком беспечная =))))))) щас попробую удалить этот cat

2011-12-04 в 14:01 

Сильвана Ветрокрылая~
Anytime you call my name.
чет код на 93 строке жалуется.
pastebin.com/KTdKymdt
Parse error: syntax error, unexpected '=' in /home2/charmed4/public_html/articles.php on line 93

2011-12-04 в 14:53 

--==SS==--
Sanctus Satanas
Сильвана Ветрокрылая~, да, там везде будет жаловаться.
«articles.php?'&page=1» — лишний апостроф вкрался между «?» и «&». На следующих строчках то же самое.

2011-12-04 в 15:07 

Сильвана Ветрокрылая~
Anytime you call my name.
блин. чет нифига. я сделала как надо, и все равно он жалуется.

pastebin.com/d8vjWEBd

2011-12-04 в 16:05 

--==SS==--
Sanctus Satanas
Сильвана Ветрокрылая~, на 95-й строке та же фигня в конце.

2011-12-04 в 16:25 

Сильвана Ветрокрылая~
Anytime you call my name.
ооооооо я мега не внимательная. и у меня заработала эта хрень!!!!!!!!!!!!!! огромное спасибо, просто огромнейшее!!!! у меня нет слов, как вы мне помогли!!! я с этим кодом бы в жизни не разобралась!!!!!!!!!! :heart:

2011-12-04 в 16:28 

Сильвана Ветрокрылая~
Anytime you call my name.
а еще вопрос. статьи то без проблем будут вылазить в любом порядке, это не существенно. а вот новости я хочу сделать, чтобы вылазили именно по датам. я знаю, что там нужно всего одну строку прописать в выводе. но какую?

2011-12-04 в 22:27 

--==SS==--
Sanctus Satanas
Сортировку по датам.
Запрос получится примерно такой:
SELECT что-нибудь FROM откуда-нибудь WHERE ляляля = тралялля ORDER BY поле_даты DESC

2011-12-16 в 12:39 

--==SS==--
Sanctus Satanas
Получилось-то что-нибудь? )

2011-12-16 в 14:17 

Сильвана Ветрокрылая~
Anytime you call my name.
да =))
charmed4.net
новости делаются по датам и по 6 шт на страничке) удобно и клево)) :heart:

2011-12-17 в 12:12 

Вот тут есть подробное описание пагинатора. Правда он немного сложноват для начинающих...

URL
2011-12-28 в 10:53 

Сильвана Ветрокрылая~
Anytime you call my name.
а вобще при выводе кол-ва страниц возникает баг.
www.charmed4.net/books.php
книги вмещаются все не 1 странице, но код выводит, чтое сть вторая страница. и если на нее кликнуть - естественно выдает ошибку. не могу понять, как искоренить его :fire:

2012-01-30 в 19:48 

--==SS==--
Sanctus Satanas
Только сейчас заметил. ^^

но код выводит, чтое сть вторая страница
Ну тогда снова кусок этого кода — в студию. )

2012-01-31 в 01:57 

Сильвана Ветрокрылая~
Anytime you call my name.
гыгы) я и сама уже забыла))
pastebin.com/J66nF9zX

по-моему именно этот кусок и отвечает за вывод

2012-01-31 в 03:32 

--==SS==--
Sanctus Satanas
Ага, отвечает этот, но в нём проблемы и нет. :) Судя по всему, там в $total попадает число 2. Проверьте запросы на выборку данных и подсчёт записей - если там есть WHERE, то условия в них должны быть одинаковыми.

2012-01-31 в 16:00 

Сильвана Ветрокрылая~
Anytime you call my name.
да вроде нету

pastebin.com/rKh7SqwG

2013-08-01 в 17:29 

А не подскажете алгоритм создания пагинации?

URL
2013-08-02 в 00:46 

--==SS==--
Sanctus Satanas
Сильвана Ветрокрылая~, ух ты, оказывается, я снова пропустил тогда это сообщение. ^_^
В общем, проблема очень простая: некорректно считается число страниц. Чтобы подсчитать правильно, нужно взять общее число записей, разделить на число записей на страницу и округлить вверх (т.к. 1,1 страницы это, собственно, две страницы, а не одна). Округление вверх делается функцией ceil().
Итого если брать ваш скрипт по последней ссылке, то получится:

$total = ceil($posts / $num); // правильно считаем число страниц
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // номер текущей страницы, по умолчанию - 1
 
// если страница больше максимальной, остановимся на максимальной
if ($page > $total) {
$page = $total;
}
 
// страница не может быть меньше первой
if ($page <= 0) {
$page = 1;
}
 
$start = ($page - 1) * $num;
 
// а это такая микрооптимизация: если запрос идёт по большой таблице, но у нас
// под условие подпадает не так много записей, то можно остановиться на последней
if ($posts > $num) {
$num = $posts;
}

2013-08-02 в 00:54 

Сильвана Ветрокрылая~
Anytime you call my name.
Сильвана Ветрокрылая~, ух ты, оказывается, я снова пропустил тогда это сообщение. ^_^
омг О_о сообщению больше года! и вы вдруг снова в строю и снова отвечаете О_О

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

2013-08-02 в 00:57 

Сильвана Ветрокрылая~
Anytime you call my name.
насколько я помню, это проблема моя с тем, что у меня даже если записи влезают на странице, все равно выдает вторую страницу якобы? но пустую

2013-08-02 в 01:00 

--==SS==--
Sanctus Satanas
Сильвана Ветрокрылая~, да просто "Гость" написал, а я подписан на топик. ) Ну и сам я вроде живой ещё так-то вообще. &)
Я просто сейчас проверил — а страничка та до сих пор жива и на ней до сих пор тот же самый баг, что показывается две страницы, хотя на самом деле одна. )))

2013-08-02 в 01:13 

Сильвана Ветрокрылая~
Anytime you call my name.
Я просто сейчас проверил — а страничка та до сих пор жива и на ней до сих пор тот же самый баг, что показывается две страницы, хотя на самом деле одна. ))
ага, сайт на месте, все по-старому =)) просто совсем нет сил и желания этим заниматься. хотя на самом деле просто лень. хоть и интересно все это. :weep3:

     

Сообщество PHP программистов

главная