Ваш первый Сайт С использованием РНР-скриптов
СОЗДАНИЕ СТРАНИЦЫ С НОВОСТЯМИ САЙТА
Для начала мы создадим программу для вывода новостей сайта или другой информации без использования формы. Новости или другая информация будут писаться вручную в текстовый файл, и эта информация будет отображена в окне браузера. Программа не вызовет у вас затруднений, если вы разобрались с материалами предыдущей главы при создании счетчика посещений.
В рабочей папке htdocs нашего домашнего сервера создайте папку Novosti. В этой папке мы будем хранить страницы для вывода новостей. Создайте там простой текстовый файл, т. е. откройте блокнот, сохраните его в нашей созданной папке novosti под названием novosti.txt. Запишите в этом файле несколько строчек, примерно так:
Первая новость вторая новость третья новость четвертая новость пятая новость шестая новость седьмая новость
Сохраните записанное и закройте файл. Теперь в PHP-редакторе создайте новый PHP-файл. Между тегами <?php и?> наберите следующий код:
Листинг 5.3 (файл Novl. php) <?Php
$filen=M novosti. txt"; $chisIo=5; $lolo=file($filen); krsort($lolo);
Foreach($lolo as $line2)
{
$j++;
If($j<=$chislo) echo $line2."<br><br>";
}
?>
Сохраните этот файл в папке novosti под названием novl.php. Обратите внимание, файл должен сохраниться именно с расширением php. Попробуйте разобраться в этом коде самостоятельно, не подсматривая на разбор кода ниже. Если это у вас вызывает затруднения, то еще раз прочтите предыдущую главу, где мы разбирали функции работы со строками и массивами. Разберем теперь строчки кода листинга 5.3: < ?php
$filen= "novosti.txt"; - записываем в переменную $filen путь к текстовому файлу с новостями. Поскольку этот файл находится в той же папке novosti, Что и данная программа, мы указываем просто название файла;
$chisIo=5; - вводим переменную Schislo и присваиваем ей число 5. Это будет количество выводимых новостей. Эта переменная будет подробно рассмотрена в конце кода;
$lolo=file($fiIen); - функция file создает массив строк из содержимого файла, указанного в переменной $filen и заносит весь этот массив в переменную Slolo. Таким образом, в переменной $lolo будет массив строк, которые мы записали в файле novosti.txt. Причем первая строчка будет иметь индекс 0, вторая - индекс 1 и т. д.;
Krsort($lolo); - функция krsort сортирует массив по убыванию значений индексов. Это делается для того, чтобы свежие новости были вверху, т. е. строки из файла novosti.txt выводились бы снизу вверх;
Foreach($lolo as $Iine2) - функция foreach обходит массив, указанный в переменной $lolo, построчно, т. е. выполняется цикл, причем столько раз, сколько строчек в массиве $Iolo (у нас их семь). При* каждом выполнении цикла переменной $line2 присваивается содержимое очередной строки, которое потом будет выводиться в окно браузера;
Н
$j++; - вводим счетчик цикла для подсчета количества новостей или других записей. При каждом исполнении цикла, он будет увеличиваться на единицу;
If($j<=z$chislo) echo $line2."<br><br>"; - проверяется условие. Если счетчик цикла $j меньше или равен числу в переменной $chislo, то в окно браузера выводится очередная строка из текстового файла с новостями. В переменной же $chislo, как было указано выше, мы будем указывать количество новостей, которое нужно будет вывести в браузер. Например, если у нас 1000 новостей, но нам нужно показать на странице только 5 последних, то в начале этого кода или же в коде той страницы, куда мы вставим данный код (при помощи оператора include) нужно указать, что $chislo=5 (именно так у нас и сделано). Все, код разобран. Между новостями я поставил два html-оператора перевода строки <br>. Естественно, они должны быть заключены в кавычки и присоединены к строке с помощью точки (оператора конкатенации).
1}
?>
Итак, мы создали программу для вывода на страницу новостей сайта. Запустите в РНР-редакторе созданную программу. Слева вы увидите 5 последних строчек. Первой строкой у нас будет самая последняя строка в текстовом файле novosti.txt, а именно строка с надписью: седьмая новость. Далее идет шестая строка, пятая, четвертая, третья. Вторая и первая строки уже не выведутся в браузер, поскольку мы указали в коде, что нужно вывести только 5 новостей (строка с условием if($j<=$chislo) или if($j<=5)). Если надо вывести все новости, которые есть и будут, то установите, например, значение переменной $chislo=1000. Все новости, пока их не больше тысячи, будут выведены в браузер.
Давайте создадим теперь простую страницу новостей, куда мы и вставим файл с кодом novl.php. В РНР-редакторе создайте новый файл и сохраните его под названием nov2.php. При помощи html-тегов создайте дизайн для этой страницы на ваше усмотрение. Я не буду создавать здесь красивый дизайн, поскольку это выходит за рамки данной книги. Я набрал примерно такой код:
Листинг 5.4 (файл Nov2.php) <Html> <Head>
<title>H0B0CTH Сайта </title> <style type="text/css">
#lolo{font-size:12pt; color: brown; font-family:Comic Sans MS}
</style </head>
<body bgcolor="cyan">
<center><b id="Iolo" style="font-size:20pt">HoBocTH caftTa</bx/centerxbr> <table width="50%" border="2" bordercolor="green" bgcolor=" silver" id="lolo"xtrxtd> <?php
Include ("novl. php");
?>
</td></trx/tablexbr>
</body>
</html>
Разберем этот код, хотя все должно быть вам понятно и так, но, как говорят, повторение - мать учения: <html> - начало HTML-кода;
<head>
<title>Новости сайта</Ш1е> - вводим заголовок страницы; <style type="text/css"> - открываем таблицу стилей;
Шо1о font-size: 12pt; color:red; font-family:Comic Sans MS} - вводим произвольный идентификатор стиля lolo, где указываем размер, цвет и тип шрифта;
</style> - закрываем таблицу стилей;
</head>
<body bgcolor="cyan"> - открываем тег основной части кода, где устанавливаем цвет фона cyan для всей страницы;
<center><b id= "lolo " style= "font-size:2Opt">Новости Cauma</b></center> <br> - выводим надпись вначале страницы, помещая ее в центр при помощи тегов <center> и </center>. В теге <Ь>, указывающем на жирный шрифт, мы вводим идентификатор стиля lolo (он был указан выше, в таблице стилей <style>), т. е. мы указываем браузеру, что между тегами <Ь> и </Ъ> будет располагаться текст с типом шрифта Comic Sans MS коричневого цвета. Размер шрифта решил сделать побольше, дополнительно указав: style= "font- size.^ Opt";
< table width=z"50%" border="2" bordercolor= "green" bgcolor^"silver" id="lolo"><tr><td> - создаем простую таблицу, шириной в половину от общей ширины окна браузера. Далее указываем на ширину линий таблицы (border="2"), цвет линий (Bordercolor="green"), цвет фона {bgcolor^"silver'"). Затем снова указываем идентификатор lolo, т. е. устанавливаем размер, цвет и тип шрифта, как было указано в начале кода, в таблице стилей. После открываем единственную строку таблицы при помощи тега <tr> и первую (и единственную) ячейку в этой строке при помощи оператора <td>; <?php - начало PHP-кода, т. е. вставляем PHP-код внутри HTML-кода;
Include ("novl.php"); - вставляем код для вывода новостей в браузер, который у нас на странице novl.php. Новости будут выведены в нашу одноколонную таблицу;
?> - конец РНР-кода;
</td></tr></table><br> - закрываем ячейку, строку и саму таблицу; </body> - закрываем основную часть HTML-кода; </html> - конец HTML-кода.
Запустите в браузере созданную страницу nov2.php. Вы увидите примерно такую картину, как показано на рис. 5.4.
Ш Svoi. NET : РНР F. dit [C:Home_ser verftpache2htdocsMyflooknovostinov2.php] Файл Редактор Вид Пуск Подсветка Закладки Вставка Помощь = Язык Плагины * О И ЙР -3 I* » Л * * / / / U - 3 * K K ?Fi U |
Поэкспериментируйте. Допишите в текстовый файл novosti.txt внизу еще строчку: восьмая новость и сохраните файл. Вновь запустите в браузере файл nov2.php. Последняя написанная нами строчка появится первой, а строка: седьмая новость сместится на вторую позицию.
Итак, простейшая страница новостей создана. Можно, конечно, на этом и закончить. Вы будете заходить на хостинг, где будет расположен ваш сайт и вручную редактировать файл novosti.txt. Однако на то и существует php - программирование, чтобы облегчить задачу по созданию и наполнению страниц сайта. Используя формы, мы создадим удобный интерфейс написания новостей или другой информации для вашего сайта. Вам не нужно будет постоянно заходить на хостинг. У вас будет в Интернете специальная страничка администратора, откуда вы и будете заполнять страницу новостей. Заходить на с границу администратора сможете по паролю только вы. Пароль будет храниться в зашифрованном виде в каком-нибудь текстовом файле. В конце каждой новости будет автоматически добавляться дата написания данной новости. На страницу будет выводиться по 5 новостей. На каждой странице с новостями, естественно, будут указаны ссылки на другие страницы с новостями. Страница с новостями будет, правда, всего одна. Мы просто введем некий параметр, в зависимости от значения которого будет выводиться та или иная пятерка новостей.
При входе на страницу редактирования новостей появится текстовое поле для ввода пароля, который будете знать только вы. Вы вводите пароль и нажимаете на кнопку «Ввести пароль», которую мы создадим. Программа сравнит содержимое заполненного вами текстового поля с содержимым текстового файла, где у нас будет храниться пароль. Если пароль будет введен правильно, то откроется текстовое окно для редактирования файла с новостями. В противном случае будет выведена надпись, что пароль введен неверно. Создадим сначала текстовый файл с паролем. Можно, конечно, это сделать вручную, т. е. создать простой текстовый файл и записать туда свой пароль. Этого делать категорически нельзя! Если какому-нибудь недоброжелателю удастся открыть файл с паролем, то он без особого труда может зайти на вашу страничку для редактирования новостей и записать на ваш сайт все, что вздумается, например вредоносный код. Пароль нужно обязательно зашифровать. Сейчас мы создадим небольшую программу, которая сама создаст текстовый файл с зашифрованным паролем.
В PHP-редакторе создайте новый файл. Сохраните его в папке novosti под названием newparol.php. Наберите следующий код между тегами <?php и?>.
Листинг 5.5 (файл newparoLphp) <?php
If(!$_GET['parorj)
{
Echo "<form action=newparol. php method=GET>"; echo "<input type=password name=parol>";
Echo "<input type=submit Уа1Ие='Ввести Пароль'>";
Echo "</form><brxbr>"; }
Else {
Echo "ПАРОЛЬ ВВЕДЕН!!!"; $parol=$_GET['paror]; $fiIe="parol. txt"; $newfile=fopen($file, "w+"); $write=fwrite($newfile, md5($parol));
Fclose($newfile); }
?>
Здесь мы создаем форму, на которой будут находиться всего 2 элемента: поле для ввода пароля (задается атрибутом type=passworcf) и кнопка (задается атрибутом type=submit). Сохраните написанный код и запустите браузер. Вы увидите примерно такое, как на рис. 5.5.
Введите какой-нибудь пароль и нажмите на кнопку. После нажатия элементы формы исчезнут, ,а в браузере появиться надпись «ПАРОЛЬ ВВЕДЕН!!!». Зайдите в папку novosti. У вас там появится текстовый файл parol.txt. Откройте его. Вы увидите там свой введенный пароль, но в зашифрованном виде (хеш-код). Догадаться, что же было введено, практически невозможно.
С* Svoi. NET : РНР Edit - [C:Home_serverApache2VhtdocsMyBooknovostinewparoLphp]
Щ Файл Редактор Вид Пуск Подсветка Закладки Вставка Помощь t Я:ык Плагины
JlflfllШ'Ъ ет 'W-а» ^ II OJ / /> f U — Q * Ш. к
(Щ Address: j http: //localhost/MyB ook/novosti/ne wparol. php __ | Щ
| Ввести пароль |
Рис. 5.5
В программе мы использовали функцию необратимого шифрования md5. Обратной расшифровке пароль не подлежит, да этого нам и не нужно.
При нажатии кнопки «Ввести пароль», мы направимся на эту же страницу, поскольку в теге <form> указан параметр action=newparol.php. В элементе суперглобального массива $ GET ['parol'] будет находиться введенный в текстовое поле пароль. Именно имя parol мы присвоили текстовому полю для ввода пароля (name=parol).
Давайте разберем строчки кода в листинге 5.5:
If(!$_GET['paroV]) - сначала проверяем, не существует ли элемента суперглобального массива, в котором находится введенный пароль. Естественно, если мы только запустим программу, но еще не нажмем на кнопку формы, этот элемент будет еще не определен, поскольку данные из формы еще не переданы. Значит, условие истинно (перед элементом $ GET ['parol'] стоит символ отрицания, т. е. восклицательный знак). Условие будет означать следующее: если элемента суперглобального массива $ GET ['parol'] еще не существует, то выполнится блок команд в фигурных скобках (под номером 1). А в фигурных скобках у нас вывод формы в браузер;
И
Echo "<form action=newparol.php method=GET>"; - при помощи операторов Echo выводим форму, данные из которой при нажатии на кнопку в форме отправятся методом GET на страницу newparol.php, т. е. на эту же страницу; Echo "<input type=password name=parol>"; - текстовое поле для ввода пароля. Даем имя этому полю name=parol
Echo "<input type=submit value= 'Ввести пароль'>"; - отображаем кнопку для отправки данных из этой формы. Заметьте, что фраза 'Ввести пароль' берется в одинарные кавычки, поскольку двойные мы уже используем. Применение двойных кавычек внутри двойных может вызвать ошибку;
Echo "</form><br><br>";
1} - закрываем форму и завершаем этот блок программ. Весь этот блок будет выполняться, если кнопка еще не нажата!
Else - если же элемент массива $ GET ['parol'] уже существует, т. е. мы уже нажали кнопку и отправили пароль на эту же страницу, то выполнится только блок программ, представленный ниже (в фигурных скобках под номером 2). Прошлый же блок программ, представленный выше, выполняться уже не будет, т. е. форма выведена уже не будет. Вместо нее мы выведем в браузер простую надпись, что пароль уже введен; 2{
Echo "ПАРОЛЬ ВВЕДЕН!!!"; - вывод надписи в браузер;
$parol=$ GET['parol']; - переменной Sparol присваиваем значение суперглобального массива $ GET['parol'], т. е. введенный нами пароль;
$file= "parol.txt"; - переменной $file присваиваем путь к текстовому файлу, где у нас будет зашифрованный пароль. Пусть он будет у нас в той же папке Novosti, что и эта программа;
$newfile=fopen($file, "w+"); - открывается текстовый файл для пароля, стирая там все содержимое, или создается новый файл, если пароль вводим впервые;
$write=Jwrite($newfile, md5($parol)); - записываем в открытый текстовый файл пароль, хранящийся у нас в переменной $parol, зашифровав его при помощи функции md5;
Fclose($newflle); - закрываем текстовый файл с паролем. 2}
Итак, мы создали текстовый файл с зашифрованным паролем. Созданную страницу newparol.php нужно оставить только на своем компьютере (!) и не загружать ее на сервер в Интернете, куда вы потом будете загружать свой сайт, оплатив хостинг. На сервер нужно будет загрузить текстовый файл с зашифрованным паролем parol.txt. Потом, если вы вдруг забудете пароль или захотите его просто поменять, при помощи программы на вашем компьютере newparol.php создадите новый файл с паролем и с тем же названием Parol.txt и закачаете его на свой сервер в Интернете, заменив им старый файл с паролем.
Перейдем непосредственно к созданию интерфейса для редактирования новостей сайта, т. е. создадим программу, с помощью которой было бы легко и удобно заполнять сайт новостями или какой-либо другой информацией.
При запуске программы, которую мы создадим, в браузере сначала появится текстовое поле для ввода пароля, как на рис. 5.6.
Р Svoi.NET : РНР Edit - [C:VHome_serverApache2htdQCsMyBoQknovcstiVredaktNovost.p|ip}
Gj| Файп Редактор Вид ГКск Подсветка Закладки Вставка Помощь Язык Плагины
'> Й Н J3 Л ** <* * / /> / U - □ * Ь к Ч - -
Ф ^ Addiess! httpV/localhost/MyBook/novosti/redaktNovosst php Q f ^
Редактирование новостей сойта
| | Ввести пароль
Рис. 5.6
После ввода правильного пароля и нажатия на кнопку «Ввести пароль», Появится большое текстовое поле, в которое загрузится для редактирования текстовый файл с новостями (в нашем случае это novosti.txt). Получится, примерно, как на рис. 5.7.
Внизу мы пишем очередную новость и нажимаем кнопку «Добавить». После этого на нашей web-страничке для новостей сайта появится свежая запись, причем она будет стоять первой. В конце записи будет указана дата появления данной записи. Если же нам не нужно добавлять новую запись, а надо просто изменить уже существующие, то перед тем как нажать на кнопку, уберем галочку с надписи «Новая запись».
© Svoi. NET : РНР Edit [C:Home_serverApache2htdocsMyBooknovostire()aktNovost. php]
Файл Редактор Вид Пуск Подсветка Закладки Вставка Помощь Язык Плагины
TOC o "1-3" h z. j я я т з с, * * ч* ■ А :: / ^ / lc - а * Й. k т ц &
^ ^ Addtess 'hUp://localhost/MyBook/novostr/redaktNovost php? parol Q si^ ^
Первая новость вторая новость | третья новость четвёртая новость ;пятая новость || шестая новость, седьмая новость |
Редактирование ноеостей сайга
Яштшщшшшяяшт
V,". Г.,ч-сй -' -
Jy Новая-запись (добавляется дата заоисн) •
Добавить > - . ' • ' - '
Рис. 5.7
Для написания кода в PHP-редакторе создайте новый файл и сохраните его в папке novosti под именем, например, redaktNovost.php. Код программы в листинге 5.6.
Листинг 5.6 (файл RedaktNovost. php) <Html> <Head>
<Ш1Е>Редактор Новостей </title> <style type="text/css">
#lolo{font-size:14pt; color:red; font-family:Comic Sans MS}
</style> </head>
<body bgcolor="cyan">
<Centerxdiv Id^'1010'^Редактирование новостей CaftTa</div></Center>
<?
If((!$_GET['novosti']) and (!$_GET['parol']))
{
Echo "<form action=redaktNovost. php method=GET>"; echo "cinput type=PASSWORD name=parol>"; echo "cinput type=SUBMIT value='BeecTH Пароль'>";
Echo "</form><br><:br>"; }
$parol=$_GET['paroI']; $file="parol. txt";
$open=fopen($file, "Г"); $read=fread($open, filesize($file)); Fclose($open);
If(md5($parol)=$read)
{
$nov=fopen("novosti. txt", "r+"); @$redakt=fread($nov, filesize(" novosti. txt")); fclose($nov);
Echo "<form action=redaktNovost. php method=GET>";
Echo "<textarea name=novosti cols=50 rows=15 wrap=virtual>$redakt</textarea>"; echo "<input type=HIDDEN name=parol value=$parol>"; echo "<input type=CHECKBOX name=new CHECKED>HoBaa Запись (Добавляется Дата Записи)<Ьг>"; Echo "<input type=SUBMIT value=^o6aBHTb>"; echo "</form>";
If(isset($_GET['novosti?]))
{
$novosti=$_GET['novostif]; $data=date('d. m.Yf); $nov=fopen("novosti. txt", "w+");
If($_GET[,new'l=true)
{
Fwrite($nov, "$novosti"."($data)"."n");
}
Else {
Fwrite($nov, "$novosti");
}
Fclose($nov);
}
}
Else if($paroI)
{
Echo "Неправильный Пароль!";
}
?>
</body> </html>
Разберем теперь строчки этого кода: <html> - начало HTML-кода; <head> - начало заглавной части кода; <title>Редактор Новостей </title> - заголовок страницы; <style type= "text/ess "> - начало таблицы стилей;
Ttlolo[font-size: 14pt; color:red; font-family:Comic Sans MS} - вводим идентификатор стиля, чтобы потом использовать его для задания шрифта текста;
</style> - закрываем тег таблицы стилей;
</head> - конец заглавной части кода;
<hody bgcolor="cyan"> - начало основной части HTML-кода. Задаем цвет фона страницы;
<center><div id="lolo">Редактирование новостей сайта<^1у></сеШег> - Выводим в центре надпись в верху окна браузера. Надпись выводится внутри отдельного контейнера при помощи тега <div>. Этот контейнерный тег служит для выделения части документа, в нашем случае большого заголовка на странице. Шрифт надписи задается идентификатором стиля lolo
<? - начало РНР-кода;
If (!$_GET['parol']) - вначале проверяется условие, не вводился ли уже пароль. Естественно, вначале при загрузке этой странице в браузер пароль еще не вводился (см. начало кода прошлого листинга 5.5). Значит, условие в круглых скобках истинно (перед элементом $_GET['parol'] стоит символ отрицания, т. е. восклицательный знак). В этом случае выполнится блок команд в фигурных скобках ниже, т. е. вначале при загрузке этой страницы в браузер выведется форма с текстовым полем для ввода пароля и кнопки;
1{ - чтобы не было путаницы в фигурных скобках, я решил их попарно пронумеровать, т. е. номеру открывающейся скобки будет соответствовать номер закрывающейся скобки внизу;
Echo "<form action=redaktNovost.php method=GET>"; - при помощи операторов echo выводим форму, данные из которой при нажатии на кнопку в форме отправятся методом GET на страницу redaktNovost.php, т. е. на эту же страницу;
Echo "<input type=PASSWORD name=parol>"; - текстовое поле для ввода пароля. Даем имя этому полю name=parol. Слово PASSWORD можно вводить как заглавными, так и строчными буквами, значения не имеет;
Echo "<input type=SUBMIT value='Beecmu пароль'>"; - отображаем кнопку для отправки данных из этой формы; Echo "</form><br><br> ";
1} - закрываем форму и завершаем этот блок программ.
Если мы введем пароль и нажмем на кнопку «Ввести пароль», то опять перейдем на эту же страницу redaktNovost.php, но текстовое поле для пароля и нажатая кнопка исчезнут, поскольку блок команд в фигурных скобках выше исполняться уже не будет (условие if(!S GET ['parol']) станет ложным). Теперь выполнится код ниже:
$parol=$ GET ['parol']; - присваиваем переменной Sparol элемент суперглобального массива $ GET ['parol']. Этому элементу, при нажатии кнопки «Ввести пароль» было присвоено содержание текстового поля для ввода пароля с именем name=parol (см. выше). Теперь пароль у нас будет храниться в переменной Sparol,
Sfde="parol.txt"- в переменной Sfile будет содержаться путь к текстовому файлу, где у нас хранится зашифрованный пароль. Этот файл, если вы помните, был создан заранее;
Sopen=fopen(Sfile, "г"); - открываем файл с паролем для чтения и создаем его идентификатор в виде переменной Sopen;
$read=fread($open, filesize(Sfile)); - используя функцию fread, считываем содержимое файла с паролем и присваиваем его переменной Sread. Функция Filesize(Sfde) возвращает общее количество байтов в файле. Получается в нашем случае, что функция fread считывает все байты файла, ибо в качестве второго аргумента этой функции стоит общее число байтов в файле. Можно, конечно, вторым аргументом использовать просто число, например 100 (что мы и делали раньше). Сто байт будет достаточно для прочтения содержимого файла с паролем;
Fclose(Sopen); - закрываем файл с паролем;
If(md5(Sparol)^ =$read) - здесь проверяется условие, соответствует ли введенный вами пароль, который мы шифруем функцией md5, тому, что находится у нас в переменной Sread. А в эту переменную было записано содержимое файла с паролем, который мы создали раньше. Причем пароль там тоже зашифрован функцией md5. Естественно, если зашифрованные пароли совпадают друг с другом, то данное условное выражение будет истинным и выполнится большой блок команд ниже в фигурных скобках под номером 2;
2{ - для удобства понимания (это я указал чуть выше) я нумерую фигурные скобки, чтобы было видно, где начинается, а где заканчивается данный блок команд. Это очень важно, поскольку внутри этого блока будут другие подблоки со своими фигурными скобками. Можно легко запутаться; Snov=fopen("novosti.txt", "г+"); - итак, если пароль введен правильно, открываем файл с новостями novosti.txt для чтения;
@$redakt=fread($nov, filesize("novosti.txt")); - считываем этот файл полностью и присваиваем считанное переменной Sredakt. Символ амперсанда перед командой @ подавляет возникающие ошибки. Дело в том, что если файл с новостями еще пуст (допустим, вы еще не записали ни одной новости), то данная команда вызовет ошибку, поскольку функция fread не сможет прочесть пустой файл. Эта ошибка в общем-то незначительная, и ее можно подавить символом @:
Fclose($nov); - закрываем файл с новостями;
Echo "<form action=redaktNovost.php method=GET>"; - выводим форму для редактирования файла с новостями;
Echo "<textarea name=novosti cols=50 rows=15 wrap=virtual>$redakt </textarea>"; - создаем большое текстовое поле или текстовую область с именем name=novosti шириной в 50 символов и высотой в 15 строк. Здесь можете задать другие, удобные для вас параметры. Атрибут wrap включает автоматический перенос слов на другую строку. В эту текстовую область уже будет выведено содержлмое файла с новостями, которое у нас в переменной $redakt. Эта переменная, как вы видите, указывается между тегами <textarea> и </textarea>;
Echo "<input type=HIDDEN name=parol value=$parol>"; - вводим скрытое поле. Оно нам нужно для передачи переменной с паролем. В данном случае на страницу, которую мы указали в теге <form> (т. е. на эту же страницу), передастся переменная $parol. Она будет находиться в элементе суперглобального массива $ GET['parol']. Дело в том, что если мы эту переменную не передадим, то после нажатия кнопки этой формы и перехода опять на эту же страницу (страница как бы заново перезагрузится) элемент суперглобального массива $ GET ['parol'] снова не будет определен, и в браузер снова выведется форма с текстовым полем для пароля (см. начало кода);
Echo "<input type=СНЕ СКВ OX name=new CHECKED > Новая запись (добавляется дата записи)<Ъг>"; - создает флажок в виде маленького квадратика. Атрибут checked указывает, что данный флажок отмечен галочкой. Зачем нам этот элемент, поймете позже;
Echo "<input type^SUBMIT Уа1ие=Добавить>"; - кнопка для отправки данных из этой формы. Добавив в текстовую область новую информацию, нажимаем на эту кнопку и вновь переходим на эту же страницу;
Echo "</form> "; - закрываем форму;
If(isset($GET['novosti'])) - снова условный оператор, который проверяет при помощи функции isset, существует ли элемент суперглобального массива $ GET ['novosti']. В этом элементе, как вы уже догадались, находится уже измененное содержимое текстовой области, которой (см. выше) мы присвоили имя name=novosti. Бхли условие истинно, то выполнится блок команд в фигурных скобках под номером 3;
3{
Snovosti=S_GET['novosti']; - переменной Snovosti присваиваем измененное содержимое текстовой области. Это содержимое уже будет отличаться от содержимого в переменной Sredakt (в этой переменной, как указывалось выше, находится содержимое текстового файла новостей до внесенных изменений). Теперь нам остается заменить в файле novosti. txt старое содержимое новым;
Sdata=date('d.m.Y'); - в переменную Sdata, при помощи функции date записываем текущую дату в формате, как указанно в круглых скобках (день, месяц, год);
$nov=fopen("novosti.txt", "w+"); - открываем текстовый файл с новостями, стирая старое содержимое;
If($_GET['new']==true) - снова условный оператор. В элементе суперглобального массива $_GET['new'] содержится информация о состоянии флажка CHECKBOX в форме. Если помните, мы присвоили ему имя name=new. Если флажок отмечен галочкой, то элемент $_GET['new'] возвращает значение True. В этом случае условие истинно и выполнится код между фигурными скобками под номером 4;
4{
Fwrite($nov, "Snovosti"."(Sdata)"."п"); - а если условие истинно (флажок отмечен), то делаем запись в текстовый файл, которому мы присвоили идентификатор Snov. Эта запись состоит (второй аргумент функции) из нового содержимого текстовой области (в переменной Snovosti). К этому содержимому методом конкатенации (с помощью точки) добавляется текущая дата. Затем добавляется символ перевода строки «п». В результате выполнения этой команды в файл novosti.txt запишется новая информация, в конце которой в круглых скобках будет стоять дата записи. Затем курсор перейдет на новую строку, чтобы потом начать с нее новую запись;
4}
Else - если прошлое4 условие ложно, т. е. мы убрали галочку с флажка CHECKBOX (нам не нужно добавлять новую запись, а просто отредактировать старые), то новую запись запишем по-другому;
Fwrite(Snov, "Snovosti"); - в данном случае мы просто запишем в текстовый файл novosti.txt обновленное содержимое. Дату и перевод строки ставить не нужно;
5}
Fclose(Snov); - закрываем файл с новостями;
3} - закрывается скобка под номером 3, т. е. прекращается блок команд условного оператора if(isset(S_GET['novosti'])) (см. выше);
2} - прекращается блок команд истинности условного оператора If(md5($parol)=^Sread). Весь этот большой блок - от открывающейся до закрывающейся фигурной скобки под номером 2 - выполнится, если вы правильно ввели пароль;
Else if($parol) - если пароль был введен неправильно и переменная Sparol Существует, то выполнится команда в фигурных скобках под номером 6. Можно было, конечно, юсле оператора else не задавать дополнительного условия if($parol), проверяющего существование переменной Sparol, но в этом случае при запуске программы выполнилась бы и приведенная ниже строчка. Когда мы запускаем эту программу, то переменной Sparol еще не существует, но в коде-то она присут ствует при проверке условия if(md'5(Sparol) ==Sread) И получается, что сразу при запуске программы это условие, естественно, ложно, поэтому вместе с текстовым полем для ввода пароля, мы увидим и надпись, что введен негравильный пароль. Поэтому мы и проверяем существование переменной Sparol, чтобы приведенная ниже строчка не выполнялась сразу же после запуска этой программы; 61
Echo "Неправильный пароль!"; - надпись в браузере в случае ввода неверного пароля; б/
?> - конец РНР-кода;
</bodv> - конец основной части документа; </html> - конец HTML-кода.
Прежде чем запустить эту программу, полностью очистите содержимое текстового файла novosti.txt и сохраните его. Теперь запустите разобранную выше программу redaktNovost.php. Введите правильно пароль (тот, который вы вводили и шифровали при помощи программы newparol.php). Откроется текстовая область. Она будет пуста, поскольку вы должны были стереть содержимое файла новостей. Напишите там фразу «Первая новость» и нажмите на кнопку «Добавить». В браузере вы должны увидеть свою надпись (рис. 5.8).
Как видите, к записи автоматически добавилась текущая дата, а курсор перешел на другую строчку. Добавьте несколько других строк, например, «вторая новость», потом «третья новость» и т. д. до строчки «шестнадцатая новость». Не поленитесь это сделать, пригодится.
Уберите галочку у надписи «Новая запись...», измените какую-нибудь надпись и нажмите на кнопку <Добавить». В этом случае дата не должна добавляться. Перезапустите данную программу и введите неправильный пароль. После нажатия кнопки «Ввести пароль» в браузер выведется надпись: «Неправильный пароль!».
^ ffi Address: ;http:/Vlocalho$t/MyBook/noYostiAedaktNovost php? parolj Q |
1& Ш |
|
Редактирование |
||
Первая новость(15.08.2007) |
||
Р Новая запись (добавляет* |
||
Добавить 1 • ' |
Рис. 5.8 |
Откройте файл novosti.txt. Там вы увидите все введенные вами строчки. Теперь запустите программу, где все эти строчки выводятся в окно браузера. Если помните, это программа novl.php (листинг 5.4). После запуска в браузер выведутся последние 5 новостей. Если нужно, чтобы в браузер были выведены все новости, то измените переменную $chislo, которая определена в файле Novl.php (листинг 5.3). Там указано, что $chislo=5. Измените это число, например, на 1000 и сохраните файл. Запустите программу novl.php. В одноколонную таблицу будут выведены все новости, по крайней мере пока их меньше, чем 1000. Все это хорошо, но вы, наверное, согласны с тем, что выводить все новости на одну страницу нецелесообразно. Допустим, у вас 1000 новостей или каких-нибудь других записей. Вы хотите, чтобы на странице было не более пяти новостей. Остальные новости (тоже по пять) находились бы на других страницах, причем на каждой из страниц должны быть ссылки на остальные страницы. Эти остальные страницы создавать самому не нужно. Как я уже указывал выше, страница будет всего одна, на которую будет выводиться та или иная пятерка новостей, в зависимости от параметра. Ссылки на другие страницы - это ссылки на одну и ту же страницу (на страницу с новостями), но с другими параметрами. Все это вполне реализуемо. Вы будете только записывать новости в текстовый файл при помощи созданного нами интерфейса redaktNovost.php. Все остальное за вас сделает программа! Эту программу мы с вами сейчас и создадим.
Для начала нам нужно немного изменить программу novl.php. В коде этой программы (листинг 5.3) удалите строчки цикла foreach($lolo as $linel).
Этот цикл, если вы помните, выводит последние 5 новостей в браузер, но нам теперь нужно, чтобы зыводились все новости на нескольких страницах, по 5 новостей на каждой. Следовательно, в коде листинга 5.3 останутся всего 4 строчки:
Листинг 5.7 (исправленный листинг 5.3 программы Novl. php) <?Php
$filen="novosti. txt";
$chislo=5;
$Iolo=file($filen);
Krsort(Slolo);
?>
Данная программа будет только формировать массив новостей (строк) из текстового файла и сортировать в порядке, обратном их поступлению. Что же касается программы nov2.php, которая выводит новости в одноколонную таблицу, то нам ее придется почти полностью переделать, а лучше этот файл вообще удалить и создать новый, что мы и сделаем. В нашем РНР-редакторе создайте новую страницу. Назовите ее new 1.php и сохраните ее в папке novosti. В листинге 5.8 приведена программа для страницы с новостями New 1.php. Постарайтесь сначала разобраться сами в этом коде (если не сможете, разбор кода приведен ниже, после листинга 5.8), а уж потом набрать его в РНР-редакторе.
Листинг 5.8 (new 1.php) <html> <head>
<Ш1Е>Новости Сайта</titJe> <style type="text/css">
#lolo{font-size:12pt; color:brown; font-family:Comic Sans MS}
</sty! e> </head>
<body bgcolor="cyann>
<center><b id="Iolo" style="font-size:20pt">HoBoc™ canTa</b></centerxbr> <table width=M50%" border="2" bordercolor="green" bgcoior="silver" id="loIoM><trxtd> <?php
If (!$_GET[4'J)
{
$1=1; }
Else {
$i=$_GET|'i'];
}
Include ("novl. php");
Foreach($lolo as $line2)
{
$j++;
If(($j>$chislo*$i-$chislo)&&($j<=$chislo*$i)) {
Echo $line2."<br><br>";
}
}
Echo"</td></trx/table>"; echo "<centerxp>";
For($m=l; $m<=$j/$chislo+l; $m++) {
If ($m=$i) {
Echo "<b>$m</b>";
}
Else {
Echo "<a href='newl. php? i=$ml><b>$m</b></a>";
}
}
Echo "</px/center>"; ?>
</body> </html>
Наибольшая часть кода вам должна быть понятна. Вначале при помощи html-тегов создаем одноколонную таблицу. В эту таблицу записывается 5 новостей. Какие это будут по счету новости, зависит от значения переменной $I. Значение этой переменной (параметр /) мы передадим странице с новостями Newl.Php в адресной строке браузера (см. разд. 5.1). Разберем подробно листинг 5.8. Постарайтесь понять сам принцип передачи параметра I на страницу. Это очень важно, поскольку этот прием мы будем использовать при создании форума или при размещении на своих web-страницах картинок, фотографий и т. п.
<html> - начало HTML-кода. Некоторые строчки ниже оставляю без комментария, поскольку их назначение был рассмотрено в прошлых программах;
<head>
<titlЕ>Новости сайта</titIе> <style type= "text/ess ">
#lolo{font-size: 12pt; color:brown; font-family: Comic Sans MS}
</style>
</head>
<body bgcolor="cyan">
<center><b id= "lolo" style= "font-size:20pt">Новости сайта</Ь> </center> < br>
<table width="50%" border="2" bordercolor= "green" bgcolor="silver" id="lolo"><tr><td> - создаем одноколонную таблицу, задавая ее ширину и цвета по своему усмотрению. При помощи тегов <tr> и <td> открываем, соответственно, строку и единственную в этой строке ячейку;
<?php - начало РНР-кода;
If (!$_GET['i'J) - при загрузке данной страницы, мы должны сначала определиться со значением переменной $i. Ведь от нее зависит, какие новости будут выводиться. Смысл условия следующий: если переменная $i не получена (или мы ее не указали), то мы присваиваем ей значение единица;
(
$i=l; }
Else - иначе, если мы задали значение / в строке браузера, например, Newl.php?i=2, то присваиваем переменной $i указанное значение (это значение будет храниться в элементе суперглобального массива $_GET['i']);
{
$i=$_GET['i'J; }
Include ("novl.php"); - вставляем в наш код содержимое файла novl.php. В том файле, как нам известно, содержится код, который формирует массив новостей $lolo из текстового файла и сортирует новости;
Foreach($lolo as $Нпе2) - функция foreach обходит массив, указанный в переменной $lolo, построчно (см. код программы novl.php в листинге 5.7), т. е. выполняется цикл, причем столько раз, сколько строчек, т. е. записанных новостей, в массиве Slolo. При каждом выполнении цикла, переменной $Нпе2 Присваивается содержимое очередной строки, которое потом будет выводиться в окно браузера;
1{ - начало цикла foreach. Весь приведенный ниже небольшой блок команд будет исполнен до закрывающейся фигурной скобки под номером 1. Здесь я снова нумерую попарно фигурные скобки, чтобы вы в них не запутались;
$j++; - вводим счетчик цикла для подсчета количества новостей или других записей. При каждом исполнении цикла он будет увеличиваться на единицу;
If(($j>$chislo*$i-$chislo)&&($j<=$chislo*$i)) - условие, указывающее на интервал номеров выводимых новостей на страницу. Например, при $i=l условие будет истинно, если номера новостей ($j) будут соответствовать интервалу от 1 до 5. Переменная Schislo, если помните, равна 5. Это количество выводимых на страницу новостей. Переменная Schislo задана в файле novl.php, А сам файл был вставлен в эту страницу при помощи оператора include', 2{
Echo $line2."<br><br>"; - если условие if истинно, новость выведется на страницу;
2} - окончание условия if для вывода новостей на страницу; 1} - окончание цикла foreach',
Echo"</td></tr></table>"; - заканчиваем (закрываем) таблицу для новостей на странице;
Echo "<center><p>"; - после таблицы с 5 новостями, мы должны разместить ссылки на другие таблицы с другими 5 новостями. Ссылки выводим в центре, в отдельном блоке <р>;
For($m=l; $m<=$j/$chislo+1; $т++) - при помощи цикла for выводим ссылки на остальные страницы с новостями. Страниц с новостями у нас будет несколько, но все они как бы будут объединены в одну. Будет меняться только параметр $i и в зависимости от этого параметра на страницу будет выводиться та или иная порция из пяти новостей. В переменной $j у нас хранится общее число всех новостей в массиве $lolo. Число $j/$chislo+l означает, сколько всего должно быть страниц с новостями. Отсюда счетчик $ш означает у нас как бы номер страницы с новостями;
If ($m==$i) - проверяется условие, которое я сейчас попытаюсь объяснить. Итак, на странице, например newl.php?i=l, будут ссылки на другие таблицы с новостями (на страницы с другим параметром $i). Нам нужно сделать так, чтобы не срабатывала бы ссылка на ту страницу, на которой находится посетитель. Например, если посетитель находится на второй странице (в этом случае $i=$m=2), то зачем ему ссылка на вторую страницу? Выведется только числовой номер страницы (выполнится команда между фигурными скобками под номером 4);
Echo "<а href ='new 1.php? i=$m'><b>$m</b></a>"; - выводим ссылки на страницы с другими параметрами $i, на которых посетитель еще не нахо-
Дится;
3} - окончание цикла вывода ссылок;
Echo "</p></center> "; - закрываем блок ссылок;
?> - конец РНР-кода;
Результат работы программы приведен на рис. 5.9. При помощи программы redaktNovost.php (листинг 5.6) я ввел 23 строки, т. е. 23 новости. На новостной странице находятся последние 5 новостей. На следующих страницах (с другим параметром /) находятся более старые новости (рис. 5.10).
4{ Echo "<b>$m</b>"; 4} |
Просмотрите другие ссылки на страницы с новостями и посмотрите в строке браузера, как при этом меняется параметр /.
Mjfc ^b/- Address httpV/'loealhost/riovosti/'newl php|
Д&сщцать третья и«»ость.(24,12.2008) Дкадцоть втора* Ho»Octw(17 02.2008) двадцать парю* Ho*Octi»(17.02.2008) двадцатая М«»9СТЬ(!|$.02. девятнадцатая Ho»octw(15.02.200S)
Рис. 5.9
$ Address. hMp /VlocalhostWosti/newl php? i=4 Q fx|
Ьсеьма* но*о<ть(13.02.2008) Свцьмш» H9»4>Ctb{13.02.2008}
Пятая тл&€гь(02,02200Ш) Четв${**ш; к»«оеть(02&2.&008)
Рис. 5.10
Если вы разобрались в листинге 5.8, го должно быть понятно, что программа сначала добавляет новую запись в массив новостей, а затем все новости записываются разом в файл novosti.txt, полностью удаляя оттуда старую информацию. В конце ставится текущая дата. Я так сделал потому, чтобы вы могли не только записывать новые записи, но и редактировать старые при помощи того же интерфейса. Можно было бы упростить программы newl.php И redaktNovost.php так, чтобы вы только добавляли новые записи к старым, не перезаписывая текстовый файл с новостями. Нечто подобное мы рассмотрим в следующей главе, когда будем создавать книгу отзывов посетителей на странице со статьями.
И последнее, откройте нашу главную страницу сайта index.php. Нажмите на надпись (ссылку) «Новости сайта». Вы должны оказаться на странице с новостями newl.php. Если такого не произошло, проверьте, правильно ли указана ссылка (листинг 3.6). В нашем случае строка кода, указывающая на страницу с новостями, выглядит так: <А href="novosti/newl.php">Новости сайта</А><Ьг><Ъг>.
Если у вас путь к файлу newl.php другой, то измените его в этой строке. Итак, страница с новостями создана. Вы можете оформить ее по своему усмотрению, например добавить баннеры, какие-нибудь картинки, рисунки.