Ваш первый Сайт С использованием РНР-скриптов
АДМИНИСТРАТИВНАЯ ПАНЕЛЬ ДЛЯ МАГАЗИНА
Начнем мы с написания файла admin.php (рис. 9.4) и потом создадим при его помощи страницы с описанием и фотографиями наших товаров. Вы просто будете добавлять новый товар на сервер, все остальное php сделает за вас (разместит товар на витрине и создаст отдельную для него страницу). При входе на страницу admin.php нужно будет ввести пароль. Создать зашифрованный пароль можно при помощи программы newparol.php, как мы это делали в гл. 5. Этот файл вы должны были скопировать в папку magazin. Запустите в РНР-редакторе файл newparol.php из папки magazin. Введите пароль (запомните его!) и нажмите кнопку «Ввести пароль» (см. рис. 9.5).
В папке magazin у вас должен появиться текстовый файл parol.txt с зашифрованным паролем. Пароль зашифрован при помоши встроенной функции необратимого шифрования md5 (если забыли, что это такое, см. гл. 5).
Создайте в РНР-редакторе новый файл и сохраните его в папке magazin Под названием admin.php. Наберите код из листинга 9.2 (желательно, сначала разберитесь в нем, а потом наберите самостоятельно).
Листинг 9.2 (файл Admin. php) <Html> <Head>
<title>HoBbift Toeap</title>
<link rel="stylesheet" type="text/ess" href="stil. css"> </head> <body> <?php
If(!$_POST['paror])
{
Echo "<form action=admin. php method=POST>";
Echo "<input type=PASSWORD name=parol>";
Echo "<input type=SUBMIT name=knopka Уа1ие='Ввести пароль'>";
Echo "</formxbrxbr>"; }
$paroI=$_POST|,parol']; $file=" parol. txt"; $open=fopen($f! le, "г"); $read=fread($open, filesize($file)); fclose(Sopen);
If(md5($parol)=$read)
{
$knigi=" books"; $dir=opendir($knigi);
While($file=readdir($dir)) {
If (($file!=".")&&($file!="..")) $j=$j+l; }
Closedir(Sdir);
Echo "<form enctype^multipart/form-data' action='admin. php' method='POST'
Name=fforma'>
<>Автор книги<ЛхЬг>
<input type=TEXT name='avtor' size=50xbrxbr> <>Название книги<Л><Ьг>
<input type=TEXT name^'nazvanie' size=80xbrxbr> <>Стоимость книги<ЛхЬг> <input type=TEXT name='cena' size=30xbrxbr> <>Описание книги<ЛхЬг>
<textarea name='opisanie' rows=10 cols=50x/textareaxbrxbr>
<>Фотография<ЛхЬг>
<input type=FlLE name='zak'xbrxbr>
<input type=hidden name=parol value=$parol>
<input type=SUBMIT name^otpr' Уа1ие=,Отправить'хЬгхЬг>";
If (($_POST['otpr,]=true) && ($_POST[fnazvanie'Jo""))
{
$avtor=$_POST['avtor']; $nazvanie=$_POST [' naz anie' ]; $cena=$_POST['cena']; $opisanie=$_POST['opisanie, l; $next=$j+l;
$next="$knigi/bookOOO$next. php"; $prev="$knigi/bookOOO$j. php"; include "zagryzka. php"; $new=fopen($next, "w");
$list='<htmlxhead> <Ш1е>Книга</Ш1е>
<meta name="avtor" content="'."$avtor".,,,> <meta name="nazvanie" content=,M."$nazvanie'V"> <meta name="stoimost" content="'."$cena".,"> <link rel="stylesheet" type="text/ess" href="stili2.css"> </head>
<body bgcoloH="cyan"> <?php
$teg=get_meta_tags(basename($_SERVER[VPHP_SELFVJ));
Echo "<div id=lolo3>$teg[avtor]   $teg[nazvanie]</divxbr><hr>";
$file='".$file.'";
If (f11e_exists("fotoshop/$file")) echo "<img src="fotoshop/$ffle" border=Oxbr>"; $opisanie=",.$opisanie. M';
Echo $opisanie;
?>
</body> </html>';
Fwrite($new, $list); fclose($new); $new=fopen($next, "r"); $old=fopen ($prev, "r"); $oldread=fread($old, 1024); $newread=fread($new, 1024);
If ($oldread=$newread)
{
Fclose($new); unlink($next);
Fclose($old); }
Else
{
Fclose($new);
Fclose(Sold); }
}
Echo "<a href=,magazin. php'>BepHyTbCH в магазин</а>"; }
Else if($parol)
{
Echo "Пароль неверен!"; }
?>
</body> </html>
Разберем некоторые строчки кода: <html> <head>
<Ш1е>Новый moeap</title>
<link rel="stylesheet" type = "text/ess" href="stil.css"> - указывам на таблицу стилей stil.css, которая должна находиться в той же папке (magazin), что и данная программа (Admin.php);
</head> <body> < ?php
If(!$_POST['parol']) - если пароль еще не был получен, а при запуске данной программы это будет действительно так, элемент суперглобального массива $_POST['parol'] еще не будет определен и выполнится программный код между фигурными скобками под номером 1, т. е. выведется форма для ввода пароля. После ввода пароля в текстовое поле с именем name=parol и нажатии кнопки «Ввести пароль», мы опять попадем на эту же страницу admin.php (в теге <form> указан параметр action=admin.php), но элемент $ POST ['parol'] Уже будет определен (он будет содержать пароль, введенный вами в текстовое поле с именем пате=рагоГ). В этом случае код между фигурными скобками под номером 1 уже не будет выполняться;
Ц
Echo "<form action^admin. php method=POST>";
Echo "<input type=PASSWORD name=parol> ";
Echo "<input type ^SUBMIT name=knopka value='Beecmu Пароль'>";
Echo "</form><br><br> ";
1} - окончание кода, выполняющегося, если еще не нажата кнопка «Ввести пароль». Если кнопка уже нажата, то выполнится только код после этой закрывающейся скобки;
$parol=$ POST ['parol']; - присваиваем переменной $parol пароль, который был введен ранее в текстовое поле для ввода пароля;
$file="parol.txt"; - переменной $file присваиваем название файла с нашим зашифрованным паролем, который мы создали раньше при помощи программы newparol.php;
$open=fopen($file, "г"); - открываем файл с паролем для чтения;
$read=fread($open, fdesize($fde)); - считываем содержимое файла и сохраняем его в переменной $read
Fclose(Sopen); - закрываем файл с паролем;
If(md5($parol)-=$read) - далее мы сравниваем введенный пароль (сначала зашифровав его при помощи функции md5) с зашифрованным паролем в файле parol.txt. Если пароли совпадают, то выполнится весь код между фигурными скобками под номером 2; 2{
$knigi= "books"; - присваиваем переменной Sknigi название каталога, где у нас будут содержаться страницы для каждого товара. Этот каталог (books) Вы должны были создать в папке magazin;
$dir=opendir($knigi); - открываем каталог books и присваиваем ему идентификатор $dir
While($file=readdir($dir)) - знакомый нам цикл, который перебирает все файлы в каталоге, присваивая переменой $fde название очередного файла из каталога при каждом выполнении цикла. Чуть раньше мы присваивали переменной $file название файла с нашим зашифрованным паролем parol.txt. Здесь мы снова используем эту переменную, но для других целей. Старое значение переменной $file= "parol.txt" можно «затереть», так как оно уже нам не понадобится. После цикла while данную переменную можно использовать вновь для других целей, что мы и сделаем позже;
3{
If (($fde !=".")&&($fde !="..")) $j=$j+l; - данный цикл while, как вы уже поняли, просто подсчитывает общее количество файлов в каталоге books, т. е. количество страниц для товаров (или количество товаров нашего магазина). Зачем нам это нужно, поймете позже;
3}
Closedir($dir); - закрываем каталог;
Echo "<form enctype='multipart/form-data' action='admin.php' method^'POST' name='forma'> - выводим форму с полями для ввода данных нового товара: автора и названия книги, цены книги, описания, фотографии данного товара. После нажатия кнопки «Отправить» все эти данные отправятся на эту же страницу (action^'admin.php'). Все это вам должно быть знакомо. Я лишь объясню смысл некоторых полей;
<i>Автор muau</i><br>
<input type=TEXTname= 'avtor'size=50><br><br> <1>Название Книги<Д> <br>
<input type=TEXT name= 'nazvanie' size=80><br> <br> <i>Стоимость Книги<Д><br> <input type=TEXTname='cena'size=30><br><br> <i>Описание Книги<Д><Ьг>
<textarea name='opisanie' rows=10 cols=50></textarea><br><br> <1>Фотография</1><Ьг>
<input type=FILE name='zak'><br><br> - поле для закачки с вашего компьютера фотографии товара;
<input type=hidden name=parol value=$parol> - передаем в скрытом поле переменную $parol. Дело в том, что после нажатия кнопки «Отправить», элемент суперглобального массива $_POST['parol'] вновь будет не определен и опять начнет выполняться код между фигурными скобками под номером 1, т. е. нам опять придется вводить пароль. Поэтому мы вводим скрытый элемент с именем name=parol и со значением value=$parol. В результате после нажатия кнопки «Отправить» элемент $_POST['parol'] будет уже вновь определен и ему будет присвоено значение $parol, т. е. введенный нами пароль. Если помните, мы такой прием уже делали в файле для редактирования новостей сайта redaktNovost.php в гл. 5;
<input type=SUBMIT name='otpr' value='Omnpaeumb'><br><br>"; - заполнив все данные для нового товара, нажимаем на кнопку «Отправить», которая имеет имя name='otpr'. Все данные передадутся, как было отмечено выше, на эту же страницу;
If ($_POST['otpr']==true) - после нажатия кнопки элемент суперглобального массива $_POST['otpr] будет иметь значение true. Код между фигурными скобками под номером 4 начнет выполняться только после нажатия кнопки «Отправить»;
4{
$avtor=$ POST'[avtor]; - сохраняем в переменных содержание заполненных текстовых полей: автора книги, названия книги, цену книги, описание книги. Все эти данные, как вам должно быть известно, были переданы на эту страницу методом POST, после нажатия в форме кнопки «Отправить», и сохранены в массиве $_POST; $nazvanie=$ POST['nazvanie']; $cena=$_POST['cena']; $opisanie=$_POST['opisanie];
$next=$j+l; - переменной $next присваиваем значение на единицу больше, чем общее количество листов для описания товаров в папке books (общего количества товаров). Дело в том, как вы увидите тремя строчками кода ниже, страницы для описания товара и размещения там его фотографии будут создаваться автоматически и называться так: bookOOOX.php, где X - порядковый номер страницы в папке books (название этой папки, если помните, находится в переменной $knigi). Если, к примеру, число товаров у нас равно 5, то последняя созданная для пятого товара страница будет иметь название Book0005.php. Если мы отправим данные для нового (шестого) товара, то должна быть автоматически сформирована новая страница ЬоокОООб. рИр; $next="$knigi/bookOOO$next.php"; - название (путь) для новой страницы, которая еще только сформируется, сохраняем в переменной $next
$prev="$knigi/bookOOO$j.php"; - в переменной $prev сохраняем путь к последней, ранее сформированной странице. Эта переменная нам понадобится позже;
Include "zagryzka.php"; - включаем в эту страницу код для загрузки графических файлов на сервер. Файл zagjyzka.php вы должны были скопировать из папки risynki в папку magazin и немного изменить этот файл (см. разд. 9.1 и листинг 9.1);
$new=fopen($next, "w"); - создаем новый файл (новую PHP-страницу) для нового товара. Путь к новому файлу указан в переменной $next. Новой странице присваиваем идентификатор $new;
$list='<html><head> - далее в переменную $list мы будем писать код для
Созданной страницы;
<Ш1е>Книга<Ше>
<meta name="avtor" content="'."$avtor".'"> - на новой странице создаем мета-теги. Зачем нужны эти теги и как их использовать, рассказано в гл. 6, где мы при помощи мета-тегов выводили в браузер название и автора той или иной статьи. Здесь мы переносим переменные $avtor, Snazvanie и $сепа Со страницы, где находится весь этот код (Admin.php), на новую создающуюся страницу в значение мета-тега content. Этот метод (переноса переменных на новые формирующиеся страницы) мы использовали в прошлых главах, например при формировании новых PHP-страниц для вывода мини-картинок в прошлой главе. Содержимое в мета-тегах, а именно, значения пате и content заключаются в двойные кавычки; <meta name="nazvanie" content="'. "Snazvanie". '"> <meta name="stoimost" content="'. "Scena". '">
<link rel="stylesheet" type = "text/ess" href ="stili2.ess"> - на новой странице указываем на лист стилей, который должен находиться в папке book. У меня, например, он называется stili2.css;
</head>
<body bgcolor= "cyan "> < ?php
$teg=get_metaJags(basename($_SERVER['PHP_SELF'])); - элемент суперглобального массива $ SERVERf'PHP SELF'] возвращает путь к странице, на которой находится посетитель. В данном случае он возвратит путь к этой новой странице, содержимое которой мы. и записываем сейчас в переменную $/ist. Здесь мы используем символ экранирования «» для одинарных кавычек, поскольку эти кавычки находятся внутри тоже одинарных кавычек (все содержание переменной $list заключено в одинарные кавычки). Само понятие экранирования объяснено в гл. 4. Функция basename, если помните, оставляет только название страницы с расширением. Функция get jneta Jags считывает содержимое мета-гегов из страницы, в данном случае из этой новой страницы, т. е. считывает содержимое мета-тегов, которые мы создали несколькими строчками раньше. Эта функция возвратит массив $teg (мы так его назовем) с тремя элементами: $teg[avtor] (туда запишется автор книги из переменной $avtoi% которая была указана в параметре content мета-тега <meta>), $teg[nazvanie] (туда запишется название книги из переменной $naz- vanie), $teg[cena] (туда запишется цена книги из переменной $сепа)
Echo "<div id=lolo3>Stegfavtor]   $teg[nazvanie]</div><br><hr>"; - выводим на новой странице содержимое мета-тегов, а именно автора книги и название книги через пробел между ними (оператор   обозначает пробел);
$fde="'.$fde.'"; - передаем на новую страницу переменную $fde. Как вы думаете, что она будет содержать? Перед тем как начать записывать код для новой страницы в переменную $list, мы вставили на эту (Admin.php) страницу код файла для загрузки графических изображений при помощи команды include "zagryzka.php". Так вот, в этом файле (Zagryzka.php) в переменную Sfile Записывается название графического файла с фотографией, которую мы и закачали на сервер для данного товара. Теперь эту переменную мы переносим на новую страницу;
If (file _exists("fotoshop/Sfile")) echo "<img src="fotoshop/$file" border=0><br>"; - если фотография для нового товара была закачана, т. е. файл Sfile в папке fotoshop существует, то это фото выводится на новой странице. Здесь мы тоже применяем символ экранирования для двойных кавычек, которые расположены внутри двойных кавычек;
$opisanie='".$opisanie.'"; - также на новую страницу переносим переменную Sopisanie, в которой находится введенное вами описание для данного товара;
Echo Sopisanie; - выводим это описание на создаваемую страницу. Итак, на образованной новой странице у нас будет написано: автор и название но
вой книги, выведена фотография товара, а под фотографией - описание данного товара (см. рис. 9.2);
?>
</body>
</html>'; - окончание кода для новой страницы, заканчиваем писать переменную $list
Fwrite($new, $list); - вставляем теперь код, записанный в переменной $list, На новую страницу, которой мы присвоили идентификатор $new
Fclose(Snew); - закрываем созданную страницу;
Jk |
Отмена |
$new=fopen($next, "г"); - далее следуют строчки кода, которые опять открывают только что созданную страницу, открывают предыдущую созданную страницу, считывается и потом сравнивается содержимое этих страниц. Зачем это нужно? Попробую объяснить. Если вы запустите файл с формой (admin.php) у себя на компьютере, введете данные для нового товара, загрузите фото для товара и нажмете на кнопку «Отправить», то в браузере появится форма (рис. 9.6).
Microsoft Internet Explorer
- V He удается обновить страницу без повторной отправки данных. * Нажмите соответствующую кнопку для повторной отправки данных или отмените операцию для возврата к открываемой странице.
Повтор
Рис. 9.6
При нажатии кнопки «Отмена» ничего не произойдет. Вам останется нажать только кнопку «Повтор» и введенные вами данные повторно отправятся на сервер, а программа admin.php снова начнет формировать новую страницу с теми же данными. В результате в папке books появяться две страницы с абсолютно одинаковым содержимым, т. е. одна и та же книга будет потом добавлена на витрину магазина дважды. Позже, ради эксперимента, попробуйте удалить строки кода, начиная со строки: $new=fopen($next, "г") до закрывающейся фигурной скобки под номером 6 включительно (то, что отмечено курсивом в листинге 9.2), и посмотрите потом, как будет работать программа. Она будет дважды выводить на витрину магазина один и тот же товар. Поэтому, чтобы такого не было, мы сравниваем только что созданную страницу с предыдущей, и если они идентичны, то новая страница удаляется; $old=fopen ($prev, "г"); $oldread=fread(Sold, 1024); $newread=fread($new, 1024);
If ($oldread= ==$newread) - если содержимое страниц одинаково (новой и предыдущей), то выполнится код в фигурных скобках под номером 5;
5!
Fclose(Snew);
Unlink(Snext); - удаляем созданную новую страницу при помощи встроенной
Php-функции unlink (такая функция упоминалась в гл. 4);
Fclose($old);
V
Else - иначе, если содержимое страниц разное, то ничего не удаляем, а просто закрываем эти страницы при помощи функции/с/о^г; Б{
Fclose($new); fclose($old); 6}
4} - окончание кода, который выполнится после нажатия кнопки «Отправить» в форме;
Echo "<а href='magazin.php'>Вернуться в магазин</а>"; - делаем ссылку для возврата на главную страницу (витрину) магазина. Эту страницу (Maga- zin.php) мы пока не создали;
2} - окончание кода, который выполнится, если введенный вами пароль для входа на страницу admin.php был верен;
Else if($parol) - иначе, если пароль был введен (переменная Sparol существует), но введен неверно, то выведется об этом надпись;
7/
Echo "Пароль неверен!";
7}
?>
</body>
</html> - окончание кода.
В РНР-редакторе запустите эту программу. Сначала вам предложат ввести пароль. Введите тот пароль, который вы создали при помощи программы Newparol.php. Далее заполните текстовые поля, хотя бы как на рис. 9.7.
В поле «фотография» выберите какой-нибудь рисунок (формата gif jpg Или png) на вашем компьютере (можно любой, поскольку фотографии данного товара (книги) у вас, скорее всего, нет). Нажмите кнопку отправить. Если вы все сделали правильно, то в папке books у вас должна появиться страничка bookOOOl.php (можете тоже запустить ее в редакторе), содержащая название и описание книги, а также закачанную вами фотографию. Код программно созданной страницы может быть таким, как в листинге 9.2, а.
Листинг 9.2, а (файл BookOOOl. php. Его создавать не нужно!
Он создастся автоматически, т. е. программно) <Html> <Head> <Ш1е>Книга</Ш1е>
"«г: |
<meta name="avtor" content="M. Булгаков"> <meta name="nazvanie" content=" Роковые яйца"> <meta name="stoimost" content="100"> <link reI="stylesheetM type="text/ess" href="stili2.css"> </head>
<body bgcolor="cyan"> <?php
$teg=get_meta_tags(basename($_SERV ER[,PHP_SELF, J));
Echo "<div id=lolo3>$teg|avtorj   $teg|nazvanie)</div><br><hr>";
$file=" Bulgakov. jpg";
If (file_exists("fotoshop/$file")) echo "<img src="fotoshop/$file" border=0><br>"; $opisanie=" Бессмертное произведение великого писателя";
Echo Sopisanie;
?>
</body> </html>
Как видно из кода, введенные нами данные о книге (автор, название, цена) будут храниться в мета-тегах <meta>. Данные об авторе книги и ее названии чуть ниже выведутся в браузер. Затем выведется фотография книги Bulgakov.jpg, а под ней описание книги. Сама фотография должна быть в подпапке fotoshop. Итак, первый товар на витрине магазина у вас есть.