Рейтинг@Mail.ru
 
Редактируем

Следующая ссылка в админке - Редактировать.
Ну что же, воспользуемся советом и отредактируем текущий файл. Потому что редактировать там есть огого сколько.

Итак:
admin/edit_lesson.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
 
include ("lock.php");
include (
"blocks/bd.php");
if (isset(
$_GET['id'])) {$id $_GET['id'];}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Страница добавления нового урока</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="690" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">
<!--Подключаем шапку сайта-->
<? include("blocks/header.php");   ?> 
  <tr>
    <td><table width="690" border="0" cellspacing="0" cellpadding="0">
      <tr>
<!--Подключаем левый блок сайта-->
<? include ("blocks/lefttd.php");  ?>      
        <td valign="top">
      
<? 

if (!isset($id))

{
$result mysql_query("SELECT title,id FROM lessons");      
$myrow mysql_fetch_array($result);

do 
{
printf ("<p><a href='edit_lesson.php?id=%s'>%s</a></p>",$myrow["id"],$myrow["title"]);
}

while (
$myrow mysql_fetch_array($result));

}

else

{

$result mysql_query("SELECT * FROM lessons WHERE id=$id");      
$myrow mysql_fetch_array($result);

print <<<HERE

<form name="form1" method="post" action="update_lesson.php">
         <p>
           <label>Введите название урока<br>
             <input value="$myrow
[title]" type="text" name="title" id="title">
             </label>
         </p>
         <p>
           <label>Введите краткое описание урока<br>
           <input value="$myrow
[meta_d]" type="text" name="meta_d" id="meta_d">
           </label>
         </p>
         <p>
           <label>Введите ключевые слова для урока<br>
           <input value="$myrow
[meta_k]" type="text" name="meta_k" id="meta_k">
           </label>
         </p>
         <p>
           <label>Введите дату добавления урока<br>
           <input value="$myrow
[date]" name="date" type="text" id="date" value="2007-01-27">
           </label>
         </p>
         <p>
           <label>Ведите краткое описание урока с тэгами абзацев
           <textarea name="description" id="description" cols="40" rows="5">$myrow
[description]</textarea>
           </label>
         </p>
         <p>
           <label>Введите полный текст урока с тэгами
           <textarea name="text" id="text" cols="40" rows="20">$myrow
[text]</textarea>
           </label>
         </p>
         <p>
           <label>Введите автора урока<br>
           <input value="$myrow
[author]" type="text" name="author" id="author">
           </label>
         </p>
         <input name="id" type="hidden" value="$myrow
[id]">
         
         <p>
           <label>
           <input type="submit" name="submit" id="submit" value="Сохранить изменения">
           </label>
         </p>
       </form>



HERE;
}


?>
       
       
       </td>
      </tr>
    </table></td>
  </tr>
<!--Подключаем нижний графический элемент-->  
<?  include ("blocks/footer.php");        ?>  
</table>
</body>
</html> 


Начало пропускаем, уже проходили.
Хотя нет. Смотрим вторую значимую строчку:
1
2
3
4
5

include "blocks/bd.php";

Благое намерение. Подключение к базе данных. Как же без него...
А очень просто. Удалите эту строчку совсем и посмотрите - ничего не изменится. А все потому, что мы уже подключились к ней в файле lock.php
С виду это незаметно. Ну и что, подключимся еще раз. Но если сайт посещаем (а чего греха таить, все этого хотят), то двойное подключение требует двойного ресурса.
Да, да... Конечно. Это же админка. Тут не может быть посещаемости. Но вы же зубы чистите каждый день, а не только перед приходом гостей. Кодить нужно стараться чисто, без подобных ляпов.

Дальше запрос. Опять mysql_fetch_array() без флага. Но это уже нам знакомо, скучно. А вот дальше просто кладезь косяков.

Начнем со знаменитого цикла do... while. Меня всегда обуревает приступ любопытства - откуда же появилась такая идея? Цикл do... while вещь очень специфичная и используется крайне редко. Нужен он только тогда, когда нет возможности определить условие выхода без совершения хотя бы одного витка.

Раз он набил оскомину, приведу пример, где без него трудно. Допустим нам нужно получить случайное число, которое входит в разрывный диапазон.
Отмечу сразу, что и эта задача проще решается другими методами, но представим себе, что это контрольная работа на циклы.
Так вот. Мы должны сгенерировать случайное число, входящее в заданный в диапазон.
Если не входит - сгенерировать новое и еще раз проверить. Если входит - прервать цикл. То есть из условий видно, что хотябы один раз мы проверить должны. По этому первый виток (интерация) обязателен.
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
    $arr 
= array(123420212223);

    do
    {
        
$num rand(123);
    }
    while(!
in_array($num$arr));

    echo 
$num


В первом витке цикла мы генерируем первое случайное число, проверяем его на принадлежность к массиву и если не входит - повторяем цикл до первого совпадения.
Мы не можем определить точку выхода из цикла, пока не получим хотябы одно случайное число. Тут это оправдано.

Но вернемся к нашим баранам. Зачем в этом стаде (разбираемом коде) цикл do... while, если нам за ранее известно количество строк в таблице, а значит и точка выхода?
Более того, если в таблице не окажется ни одной строки, цикл все равно совершится, вызвав кучу ошибок.

Единственное, что пришло на ум (почему используется этот цикл), это то, что он в справочниках выше простого цикла while().
D
по алфавиту идет перед W. Это кудаж мы так торопимся, что даже справочник почитать некогда?

Следом (вернее тут же, в комплексе) идет функция printf() Ну и чем интересно оправдано её применение? Я не имел чести слушать эти радиокурсы, может там есть какое то оправдвние. Только оно явно несостоятельно. Ибо эта функция предназначена для вывода в поток отформатированных данных. Допустим в денежном формате:
1
2
3
4
5
6
<?php
 
    $money 
25.2348654;
    
printf('%01.2f'$money);


Ну или когда требуется другое форматирование. Никакого отношения к простому выводу она не имеет. А только снижает читабельность и осложняет обработку.

Это одна из грубейших семантических ошибок, давно описанная во многих настоящих учебниках.

Этот кусок кода должен выглядеть так:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
    
if (!isset($id))
    {
        
$result mysql_query("SELECT title, id FROM lessons");      

        while (
$myrow mysql_fetch_assoc($result))
        {
            print 
'<p><a href="edit_lesson.php?id='. (int)$myrow["id"] .'">'
                
htmlspecialchars($myrow["title"]) .'</a></p>';
        }

    }


Поехали дальше. Вот это опять дыра:
1
2
3
4
5

$result 
mysql_query("SELECT * FROM lessons WHERE id=$id");


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

Я не собираюсь устраивать школу хакеров, и так сболтнул лишнего. Не покажу, как можно через GET в этот запрос натолкать всякой дряни и натворить кучу бед.
Простому программисту этого знать не надо, ему нужно знать, как такого не допустить. А сделать это очень просто - не пустить в запрос ничего, кроме чисел. А значит принудительно привести значение переменной $id к целочисленному значению.
1
2
3
4
5
<?php

$result 
mysql_query("SELECT * FROM lessons WHERE id = ".(int)$id );


Всего то навсего.

Дальше по теме идет так называемый хередок.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php

print <<<HERE

<form name="form1" method="post" action="update_lesson.php">
         <p>
           <label>Введите название урока<br>
             <input value="$myrow
[title]" type="text" name="title" id="title">
             </label>
         </p>
         <p>
           <label>Введите краткое описание урока<br>
           <input value="$myrow
[meta_d]" type="text" name="meta_d" id="meta_d">
           </label>
         </p>
         <p>
           <label>Введите ключевые слова для урока<br>
           <input value="$myrow
[meta_k]" type="text" name="meta_k" id="meta_k">
           </label>
         </p>
         <p>
           <label>Введите дату добавления урока<br>
           <input value="$myrow
[date]" name="date" type="text" id="date" value="2007-01-27">
           </label>
         </p>
         <p>
           <label>Ведите краткое описание урока с тэгами абзацев
           <textarea name="description" id="description" cols="40" rows="5">$myrow
[description]</textarea>
           </label>
         </p>
         <p>
           <label>Введите полный текст урока с тэгами
           <textarea name="text" id="text" cols="40" rows="20">$myrow
[text]</textarea>
           </label>
         </p>
         <p>
           <label>Введите автора урока<br>
           <input value="$myrow
[author]" type="text" name="author" id="author">
           </label>
         </p>
         <input name="id" type="hidden" value="$myrow
[id]">
         
         <p>
           <label>
           <input type="submit" name="submit" id="submit" value="Сохранить изменения">
           </label>
         </p>
       </form>



HERE;


Есть такой способ организации строк. Его очень любят использовать китайские и индийские соратники по цеху. Именно за то, что он нечитабелен и грозно выглядит. Их цель оправдана - чем больше и непонятнее код, тем больше риса на обед.
А тут то он зачем? Он очень капризен и достаточно ресурсоемок.

Кроме того, опять все без обработки. Ну ладно, не боимся мы хакеров в админке (а зря). Но ведь и вполне безобидный текст может пострадать. Если мы решим провести урок HTML и попытаемся запостить такой пример:
1
2
3
4
5
6
7
8
9
10
11
Сейчас мы научимся редактировать уроки:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Страница добавления нового урока</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
, то что мы увидим на экране?


Вот так должно быть, сравните сами:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php

 
    
include './lock.php';
    
    if (isset(
$_GET['id'])) $id $_GET['id'];
    
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Страница добавления нового урока</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="690" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">
<!--Подключаем шапку сайта-->
<?php include './blocks/header.php';   ?> 
  <tr>
    <td><table width="690" border="0" cellspacing="0" cellpadding="0">
      <tr>
<!--Подключаем левый блок сайта-->
<?php include './blocks/lefttd.php';  ?>      
        <td valign="top">
      
<?php 
  
    
if (!isset($id))
    {
        
$result mysql_query("SELECT `title`, `id` FROM `lessons`"); 

        while (
$myrow mysql_fetch_assoc($result))
        {
            print 
'<p><a href="edit_lesson.php?id='. (int)$myrow["id"] .'">'
                
htmlspecialchars($myrow["title"]) .'</a></p>';
        }

    }
    else
    {

        
$result mysql_query("SELECT * FROM `lessons` WHERE `id` = ". (int)$id );      
        
$myrow  mysql_fetch_assoc($result);
    
?>

<form name="form1" method="post" action="update_lesson.php">
         <p>
           <label>Введите название урока<br>
             <input value="<?php 
     echo 
htmlspecialchars($myrow['title']) ?>" type="text" name="title" id="title">
             </label>
         </p>
         <p>
           <label>Введите краткое описание урока<br>
           <input value="<?php 
     echo 
htmlspecialchars($myrow['meta_d']) ?>" type="text" name="meta_d" id="meta_d">
           </label>
         </p>
         <p>
           <label>Введите ключевые слова для урока<br>
           <input value="<?php 
    
echo htmlspecialchars($myrow['meta_k']) ?>" type="text" name="meta_k" id="meta_k">
           </label>
         </p>
         <p>
           <label>Введите дату добавления урока<br>
           <input value="<?php 
     echo 
htmlspecialchars($myrow['date']) ?>" name="date" type="text" id="date" value="2007-01-27">
           </label>
         </p>    
         <p>
           <label>Ведите краткое описание урока с тэгами абзацев
           <textarea name="description" id="description" cols="40" rows="5"><?php 
     echo 
htmlspecialchars($myrow['description']) ?></textarea>
           </label>
         </p>
         <p>
           <label>Введите полный текст урока с тэгами
           <textarea name="text" id="text" cols="40" rows="20"><?php 
     echo 
htmlspecialchars($myrow['text']) ?></textarea>
           </label>
         </p>
         <p>
           <label>Введите автора урока<br>
           <input value="<?php 
     echo 
htmlspecialchars($myrow['author']) ?>" type="text" name="author" id="author">
           </label>
         </p>
         <input name="id" type="hidden" value="<?php echo 
(int)$myrow['id'?>">
         
         <p>
           <label>
           <input type="submit" name="submit" id="submit" value="Сохранить изменения">
           </label>
         </p>
       </form>
      
<?php ?>       
       </td>
      </tr>
    </table></td>
  </tr>

<!--Подключаем нижний графический элемент-->  
<?php  include './blocks/footer.php'?>  
</table>
</body>
</html>


Ну вот и всё, во всех остальных файлах ошибки повторяются с завидным постоянством. Благо их немного (файлов имею ввиду). Наверняка в остальных уроках дела обстоят не лучше. Ибо вопросы возникают сонмами, я устал на них отвечать.