[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прокомментировать пару непонятных мест
Golovastik
Расшифруйте пож. пару мест непонятных из этого кода, я написал в комментариях.
А именно вот эти строки:

1)$result = mysql_query("SELECT * from $table ORDER by id desc");
Этоо означает выбрать из таблицы все строки сортируя их в обратном порядке, это зачем делать?


2)

$num_rows = mysql_num_rows($result); Зачем считать кол-во записей в таблице,я так понял это кол-во строк


3)

$num_rows = round($num_rows/$chislo);
Зачем здесь функция раунд? И у меня 20 записей, почему на первой странице выводит 5 записей, а на 2 и 3 по 10?


4)

($_GET['str'])) //Откуда взялась переменная str в глобальном массиве?


5)

$nav = intval($nav); //Вот это место зачем писать?


6)

for ($i=1; $i<$num_rows; $i++) { //А чему переменная num_rows равна,где она получает значения?
if ($i != $nav) { //А это что за проверка странная?
echo '<a href="'.$PHP_SELF.'?str='.$i.'">'.$i.'</a> ';//Вот этот кусок желательно растолкуйте понятней ?str и пхп_селф
}
else {
// АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ
echo '<span>'.$i.'</span> '; //Что это за вывод переменной $i и чему эта переменная будет равна?
}
}


7)

if (!isset($_GET['str'])) { //Что это за проверка и откуда взялась переменная стр в глобальном массиве,что она делает?


8)Последнее,непонятное вот это растолкуйте пож. подробней

'.substr($row['text'],0,100).'.. <a href="text.php?nomer='.$row['id'].'">>></a></p>';




<?

$server = 'localhost'; // ИМЯ СЕРВЕРА
$user = 'ptisa'; // ПОЛЬЗОВАТЕЛЬ
$pass = '12345'; // ПАРОЛЬ ПОЛЬЗОВАТЕЛЯ

$db = 'video'; // БАЗА ДАННЫХ
$table = 'lessons'; // НАЗВАНИЕ ТАБЛИЦЫ

$chislo = 5; // ЧИСЛО СООБЩЕНИЙ НА СТРАНИЦЕ

// ДЛЯ УДОБСТВА ОБОЗНАЧИМ ПЕРЕМЕННУЮ С ТЕКСТОМ ОШИБКИ

$text_error = '<br />Ошибочка вышла!';

// СОЕДЕНИМСЯ С MySQL
$connect = mysql_connect ($server, $user, $pass);
if (!$connect) {
echo $text_error;
exit;
}

// СОЕДЕНИЯЕМСЯ С БАЗОЙ ДАННЫХ
$select = mysql_select_db($db);
if (!$select) {
echo $text_error;
exit;
}


// СОЗДАЁМ ЗАПРОС
$result = mysql_query("SELECT * from $table ORDER by id desc");
// СЧИТАЕМ КОЛЛИЧЕСТВО ЗАПИСЕЙ В ТАБЛИЦЕ - У МЕНЯ ИХ 20
$num_rows = mysql_num_rows($result); // Это подсчёт из скольки строк состоит табл. зачем это делать?

// А ТЕПЕРЬ СЧИТАЕМ НА СКОЛЬКО СТРАНИЦ НАМ РАЗБИТЬ ЗАПИСИ И ВЫДЕЛЯЕМ ЦЕЛОЕ ЧИСЛО

$num_rows = round($num_rows/$chislo); //Зачем здесь функция round?


// ЗДЕСЬ МЫ ПРОВЕРЯЕМ НА КАКОЙ СТРАНИЦЕ СЕЙЧАС ПОЛЬЗОВАТЕЛЬ

if (isset($_GET['str'])) {
$nav = $_GET['str'];
}
else {
$nav = 0;
}
$nav = intval($nav); // Смысл этой строки, зачем? Что делает интвал с переменной nav?
echo 'Навигация: ';

// А ТЕПЕРЬ ВЫВОДИМ НОМЕРА СТРАНЦ
for ($i=1; $i<$num_rows; $i++) { //Если у меня 20 записей в базе значит здесь будет от 1 до 4?
if ($i != $nav) { ..Что это за проверка и зачем?
echo '<a href="'.$PHP_SELF.'?str='.$i.'">'.$i.'</a> '; //прокомментируйте вот это место подробнее
}
else {
// АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ
echo '<span>'.$i.'</span> '; //Что это за вывод?
}
}


echo '<hr />'; // ОТДЕЛИМ НАВИГАЦЮ ОТ КОНТЕНТА ДЛЯ НАГЛЯДНОСТИ

// НАЧИНАЕМ ВЫВОДИТЬ САМУ ИНФОРМАЦИЮ ПОСТРАНИЧНО smile.gif

if (!isset($_GET['str'])) {
$str = 0;
}
else {
$str = $_GET['str']*$chislo - $chislo;
}
$nomer = $str + 5;
// ФОРМИРУЕМ ЗАПРОС НУЖНОЙ НАМ ЧАСТИ ИНФОРМАЦИИ
$result = mysql_query("SELECT * from $table ORDER by id asc limit $str, $nomer");
// ИНАЧЕ ВЫВОДИМ ОШИБКУ
if (!$result) {
echo $text_error;
exit;
}

echo '<div style="width: 40%;">';
while ($row = mysql_fetch_array($result)) {
echo '<p>'.$row['id'].' - <strong>'.$row['page'].'</strong>
<br />
'
.substr($row['text'],0,100).'.. <a href="text.php?nomer='.$row['id'].'">>></a></p>';
}
echo '</div>';

mysql_close($connect);

?>




Спустя 19 минут, 20 секунд (21.09.2010 - 02:10) ZooLL написал(а):
Знаю ответ только на первое так-как сам учусь ещё)
Итак, вывод строк в обратном порядке очень хорошо подходит для чатов, форумов, гостевых, где нужно чтобы новые сообщения отображались сверху.

Спустя 13 минут, 41 секунда (21.09.2010 - 02:24) aH6y написал(а):
1. это применяеться например в гостевой книге: т.к. удобнее выводить новые сообщения в начале

2. используеться для подсчёта ко-ва рядов результата запроса. php.ru


3. round пишем для того, чтобы вывести целое значение

4. get

5. intval

6.

for ($i=1; $i<$num_rows; $i++) { // ко-ву сообщений в таблице
if ($i != $nav) { // это сравнение
echo '<a href="'.$PHP_SELF.'?str='.$i.'">'.$i.'</a> ';// выводим ссылку с get параметром str равным $i
}
else {
// АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ
echo '<span>'.$i.'</span> '; // номеру страницы
}
}


7. смотри пункт 4

8. substr
в ссылку передаём параметр nomer со значением $row['id']

советую разбираться во всём самому. google.com и yandex.ru - хорошие помощники

Спустя 6 минут, 8 секунд (21.09.2010 - 02:30) Ice написал(а):
Цитата (Golovastik @ 21.09.2010 - 02:51)
Зачем считать кол-во записей в таблице,я так понял это кол-во строк

Чтобы зря не нагружать скрипт при пустой выборке и, например, уведомить, что записей нет

Цитата (Golovastik @ 21.09.2010 - 02:51)
$num_rows = round($num_rows/$chislo);

Часть какого-то алгоритма

Цитата (Golovastik @ 21.09.2010 - 02:51)
Откуда взялась переменная str в глобальном массиве?

Ее передали методом GET (через адресную строку)


Цитата (Golovastik @ 21.09.2010 - 02:51)
$nav = intval($nav); //Вот это место зачем писать?

Лучше
(integer)$nav
это приведение к целочисленному типу, чтобы скрипту что-нибудь другое не скормили

6. неподходящий для анализа кусок

Цитата (Golovastik @ 21.09.2010 - 02:51)
substr($row['text'],0,100)

Обрезаем переменную $row['text'] до ста первых символов.

Спустя 1 час, 18 минут, 3 секунды (21.09.2010 - 03:48) inpost написал(а):
Golovastik
1) Чтобы последняя статья была первой строчкой, чтобы последняя новость выводилась первой и человек сразу видел последнюю, а не листал в конец.

2) Проверяем, есть ли записи после выборки, если есть - выводим. А если пусто - другое условие, ну это как пожелаешь. К примеру: ввёл логин зарегистрироваться, скрипт проверил количество пользователей с таким именем, если вернулось 0 строк - то добавляем нового пользователя, если больше- пишем, что пользователь с таким именем существует!

3) пропустим, какая-то фигня, видимо что-то важное там делал)

4) Пришла из адресной строки... вопрос непонятный какой-то... Вот где она прописана: "?str=7". Теперь по порядку: ? - значит будут переменные GET. далее такой вид: имя_переменной=значение_переменно.

5) intval - берётся только число из поля, так как хакер мог бы всякий код ввести, а тут на тебе, облом, в скрипте взяли только значение ЦИФРОВОЕ и всё, обломали хакера (тема безопасности). В свою очередь intval работает в 2,2-2,3 раза медленее обычного int. Правильнее было бы вообще написать $str = (int)$str; вместо той строчки. Была строка "77аааффф", после обработки осталось лишь 77, то есть только цифры и переменная стала цифровой, а не текстовой

6)
 for ($i=1; $i<$num_rows; $i++) { //пункт 2-3?    
if ($i != $nav) { //Обычная, если $i не равна $nav, видимо по смыслу приоритетно то, что она будет не равна?
echo '<a href="'.$PHP_SELF.'?str='.$i.'">'.$i.'</a> ';// Знак вопроса, после него стоит переменная, как раз и есть ответ на вопрос 4, от сюда она и пришла.
// ПХП_СЕЛФ - ссылка на саму себя. В итоге выглядеть будет у нас так: src="thispage.php?str=1"

} else { // АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ
echo '<span>'.$i.'</span> '; // Просто вывод переменной. Будет равняться по условию $nav.
} }


7) isset - существует, !isset = не существует. Проверка на отсутствие переменной. Если её нету, то есть страницу открыли как "thispage.php" БЕЗ "?str=7", то, скорее всего, str будет равняться 1(условия далее). Так как по смыслу, str = номер страницы.

8) substr - обрезание пеерменной с нулевого символа, при этом остаются всего 100 символов. Итого ответ: с первой по сотую. Если вдруг недобросовестные люди введут не 100 символов, а миллион или 2, тогда будет проблемки =) Тоже вопросы безопасности.

П.C. вроде как ничего не пропустил + предыдущих ораторов не читал, господа, вы уж простите, если я где-то повторился.

Спустя 11 часов, 10 минут, 5 секунд (21.09.2010 - 14:58) aH6y написал(а):
а я бы вместо intval использовал проверку поля на совпадение с pattern: '/^\d{1,}$/'
что означает ввод только цифр, один либо безмерное ко-во раз

Спустя 7 минут, 53 секунды (21.09.2010 - 15:06) twin написал(а):
aH6y
можешь объяснить почему?

Спустя 22 минуты, 33 секунды (21.09.2010 - 15:29) Golovastik написал(а):
Проблема в том, что у меня в базе данных 20 записей, а этот код выводит на первой странице 5 записей, на 2 и 3 по 10,как исправить?

Спустя 58 минут, 35 секунд (21.09.2010 - 16:27) inpost написал(а):
Golovastik
удалить и написать всё самому?

Спустя 45 минут, 14 секунд (21.09.2010 - 17:12) Golovastik написал(а):
Решил опробовать другой,более правильный вариант, но он у меня не сработал.
По видеоуроку попробовал написать постраничную навигацию, для теста как там было указано создал 2 таблицы:
Таблица lessons.php


id cat text
1 1 Петя
2 1 Фрося
3 1 Борис
4 1 Анатолий
5 1 Банан
6 1 Тарзан
7 1 Макс
8 1 Министр
9 1 Факел
10 1 Природа
11 1 Листья
12 1 Друзья
13 1 Морковь
14 1 Титаник
15 1 Мел
16 1 Натрий
17 1 Вуглевод
18 1 Кислород
19 1 Дартаньян
20 1 Поезд


Таблица options.php

d str
1 3


Файл database.php

<?php
$server = 'localhost'; //Имя сервера
$user = 'privet'; //Логин
$password = '12345'; //Пароль
$db = 'video';
$table = 'lessons'; //Название таблицы
$error_database = '<h2>Произошла ошибка в базе данных,<br/>
в ближайшее время она будет устранена!</h2>'
;
$connect = mysql_connect($server,$user,$password);
if(!$connect){
echo $error_database;
exit;
};
//$connect по какому соединению мы работаем
$select = mysql_select_db($db,$connect);
if(!$select){
echo $error_database;
exit;
};
?>



Код самой постраничной навигации, файл cat_view.php

<?php
include '../blocks/database.php'; /*Соединяемся с Базой Данных*/
$result77 = mysql_query("SELECT str FROM options", $connect);
$myrow77 = mysql_fetch_array($result77);
$num = $myrow77["str"];
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result00 = mysql_query("SELECT COUNT(*) FROM data WHERE cat='$cat'");
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total = intval($total);
// Определяем начало сообщений для текущей страницы
$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 id,text FROM lessons WHERE
cat='
$cat' ORDER BY id LIMIT $start, $num",$connect);

// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href=view_cat.php?cat='.$cat.'&page=1>Первая
</a> | <a href=view_cat.php?cat='
.$cat.'&page='. ($page - 1) .'>Предыдущая</a> | ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' | <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page + 1) .'>Следующая</a> | <a href=view_cat.php?cat=
'
.$cat.'&page=' .$total. '>Последняя</a>';

// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 5 > 0) $page5left = ' <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=view_cat.php?cat='.$cat.'&page=
'
. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=view_cat.php?cat='.$cat.'&page=
'
. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=view_cat.php?cat='.$cat.'&page=
'
. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=view_cat.php?cat='.$cat.'&page=
'
. ($page - 1) .'>'. ($page - 1) .'</a> | ';

if($page + 5 <= $total) $page5right = ' | <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $total) $page4right = ' | <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $total) $page3right = ' | <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $total) $page2right = ' | <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href=view_cat.php?cat=
'
.$cat.'&page='. ($page + 1) .'>'. ($page + 1) .'</a>';

// Вывод меню если страниц больше одной

if ($total > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pstrnav\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.
'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;
echo "</div>";
}

?>



Выдаёт ошибки:



Notice: Undefined variable: cat in z:\home\sitik.ru\www\blocks\view_cat.php on line 9
[Денвер: показать возможную причину ошибки]
Warning: mysql_fetch_array(): supplied argument is
not a valid MySQL result resource in z:\home\sitik.ru\www\blocks\view_cat.php on line 10

Notice: Undefined variable: cat in z:\home\sitik.ru\www\blocks\view_cat.php on line 27

Notice: Undefined variable: cat in z:\home\sitik.ru\www\blocks\view_cat.php on line 30

Notice: Undefined variable: cat in z:\home\sitik.ru\www\blocks\view_cat.php on line 30


Хотя я всё сделал по инструкции,как говорилось в видеоуроке.
Подскажите пож, что сделать чтоб сработало?

Спустя 16 минут, 15 секунд (21.09.2010 - 17:29) Golovastik написал(а):
Да, точно, я не правильно сделал запрос sqlне с той таблицы выбираю, написал так:
$result00 = mysql_query("SELECT COUNT(*) FROM lessons WHERE cat='$cat'");

Сработало,но при нажатии на один из пунктов меню, навигации, ничего не выводится.
Что делать?

Спустя 34 минуты, 14 секунд (21.09.2010 - 18:03) inpost написал(а):
Golovastik
Что нажимаешь? Куда нажимаешЬ? Что-то я не понял тебя...

Спустя 6 минут, 11 секунд (21.09.2010 - 18:09) inpost написал(а):
$result00 = mysql_query("SELECT COUNT(*) FROM data WHERE cat='$cat'"); - тут подсчитывается всякий бред, а должен считать количество уроков!

Спустя 5 часов, 27 минут, 11 секунд (21.09.2010 - 23:36) aH6y написал(а):
Цитата (twin @ 21.09.2010 - 15:06)
aH6y
можешь объяснить почему?

ну смотри:

intval преобразует значение в целочисленное значение.

а preg_match с patter'ном: '/^\d{1,}$/' проверяет являеться ли переменная $x - похожая на регулярное выражение паттерна.

если там есть хоть один символ не входящий в символы: 0,1,2,3,4,5,6,7,8,9 то функция выдаст false

проверка сразу при вводе. если в переменной будет n-число знаков и букв, то intval придёться обрезать. а так проверка и всё.

Спустя 6 минут, 19 секунд (21.09.2010 - 23:43) aH6y написал(а):
Цитата (inpost @ 21.09.2010 - 18:09)
$result00 = mysql_query("SELECT COUNT(*) FROM data WHERE cat='$cat'"); - тут подсчитывается всякий бред, а должен считать количество уроков!

если у тебя все уроки в одной таблице, то пишешь вот так:

$result = mysql_query("SELECT COUNT(*) FROM data");
$row = mysql_fetch_array($result);
echo $row['0']; // тут будет ко-во уроков

Спустя 6 минут, 28 секунд (21.09.2010 - 23:49) inpost написал(а):
aH6y
Ты ничего не понял, а копируешь, типо так надо... там таблица указана data, а должна быть совсем другая!

Спустя 2 минуты, 23 секунды (21.09.2010 - 23:51) aH6y написал(а):
Цитата (inpost @ 21.09.2010 - 23:49)
aH6y
Ты ничего не понял, а копируешь, типо так надо... там таблица указана data, а должна быть совсем другая!

а исправить тяжело?

Спустя 1 час, 17 секунд (22.09.2010 - 00:52) inpost написал(а):
aH6y
Не стоит подобать Попову. Просто указал на место ошибки и всё, дальше человек сам догадается, что там не так!

Спустя 18 минут, 21 секунда (22.09.2010 - 01:10) aH6y написал(а):
Цитата (inpost @ 22.09.2010 - 00:52)
aH6y
Не стоит подобать Попову. Просто указал на место ошибки и всё, дальше человек сам догадается, что там не так!

я никому неподобаю. я итак указал на ошибки. как по мне так лучше искать и разбираться самому - лучше запоминаеться.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.