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

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

Комментарии
22.11.2011 в 11:42

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

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

Anytime you call my name.
pastebin.com/ffZxeris

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

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;
24.11.2011 в 01:56

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

Anytime you call my name.
pastebin.com/g21FsvFL

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

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



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

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

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

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

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

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


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

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

24.11.2011 в 11:55

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

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

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

Anytime you call my name.
я убрала. и вуаля: www.charmed4.net/articles.php
что то явно еще надо)))):shuffle:
25.11.2011 в 02:26

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

Sanctus Satanas
Вероятно, какая-то ошибка во время запроса. В 58-й строке перед точкой с запятой допишите or die(mysql_error())
25.11.2011 в 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
=))
25.11.2011 в 12:40

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

Anytime you call my name.
:weep3::weep3::weep3::weep3::weep3:
вот если бы я понимала все это =(( я бы сделала, честно честно. я не ленюсь, я не понимаю :facepalm3:
26.11.2011 в 03:47

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, пустой строке, пустому массиву… В данном случае подобные проверки явно избыточны.
26.11.2011 в 13:33

Anytime you call my name.
Может есть какой нибудь вариант попроще подобного кода без лишних проверок?))
26.11.2011 в 17:25

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

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

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

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

Anytime you call my name.
тааааак. а как? :shuffle:
30.11.2011 в 03:16

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

<pre><?php var_dump($_GET, $posts, $page, $total, $start, $num) ?></pre>
01.12.2011 в 13:57

Anytime you call my name.
хм. вставила ваш код. вышло вот что:

www.charmed4.net/articles.php
04.12.2011 в 00:59

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

Anytime you call my name.
ой а я как то и не думала насчет этого =)) слишком беспечная =))))))) щас попробую удалить этот cat
04.12.2011 в 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

Расширенная форма

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

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail