Ваш первый Сайт С использованием РНР-скриптов
СОЗДАНИЕ ГОСТЕВОЙ КНИГИ
Гостевая книга будет состоять из трех файлов, а именно, текстового файла CSVfile.txt. В нем в табличном виде будут храниться данные от посетителей и их сообщения, а также ваши ответы на эти сообщения. Если файл CSVfile.txt у вас уже есть в папке gostevaja, то удалите его, так как он потом создастся сам. Потом мы создадим файл gostevl.php. Это будет «лицевая» страница нашей гостевой книги (рис. 7.1). На ней будут находиться последние 3 записи посетителей (можно сделать и больше) и ваши ответы на них. На данный момент на рис. 7.1 находятся пока только одна запись и ответ на него. Чуть выше записи выводятся данные от посетителя: имя, ссылки на E-mail и сайт посетителя. Указываются также дата и время поступления записи. Слева вверху находится кнопка «Добавить новую запись», при нажатии на которую посетитель попадает на страницу gostev.php.
Td Поздравляю с первой записью |
Рис. 7.1
Третий файл gostev.php будет представлять собой программу с формой для ввода данных от посетителей, обработки и записи этих данных в текстовый файл CSVfile.txt (рис. 7.2).
Д^^ЛШйС ШГЖЩ
Рис. 7.2 |
Посетитель заполняет текстовые поля и нажимает на кнопку «Добавить запись». Если текстовая область для сообщения не будет пустой, данные от посетителя обработаются и запишутся в текстовый файл, а сам посетитель сможет опять возвратиться на главную страницу гостевой книги gostevl.php И увидеть свою запись.
Приступим к написанию кода. Сначала мы напишем код для страницы ввода новых записей gostev.php (см. рис. 7.2). В РНРтредакторе создайте новый файл, сохраните его в папке gostevaja под названием gostev.php. Код представлен в листинге 7.3. Желательно сначала разобраться в этом коде (разбор строк кода после листинга), а потом самостоятельно набрать его.
Листинг 73 (файл Gostev.Php) <Html> <Head>
<title>HoBaH Запись</Ш1Е>
<link type="text/css" rel=" stylesheet" href="stil. css">
</head>
<body>
<centerxb id^'10103'^Добавление 3aniicii</bx/center> <?php
$csv=" CSVfile. txt";
If(!$_POST['add'l)
{
Echo "<form action=gostev. php method=POST> <Ь>Ваше Имя: </bxinput type=text size=25 name=imja><br> <Ь>Ваш E-mail: </bxinput type=text size=45 name=email><br> <b>URL Вашего Сайта: </bxinput type=text size=45 name=urlxbr> <Ь>Новая Запись:</bxbr>
<textarea name=text rows=6 cols=70x/textareaxbr> <input type=submit name=add value=fДобавить Запись'> <input type=reset name=reset Уа1Ие=?Отмена'>
</form>"; }
Else
{
If(!$_POST['text'])
{
Exit; }
$imja=$_POST[fimja'l; $email=$_POST['emairi; $url=$_POST['uiT]; $text=$_POST [' text' ]; $data=date("d. m.Y H:i:s");
$strok=" r.strip_tags($imja).,,r.$data.,,l,,.strip_tags($email).Mr.strip_tags($url).Mr.
Strip_tags($text);
$strok=$strok. chr(13).chr(10);
$open=fopen($csv, "a");
Fwrite($open,$strok);
Fclose($open);
Echo "<a href=,gostevl. php,>BepHyTbCH</a>";
}
?>
</body> </html>
Разберем строчки этого кода: <html> <head>
<title>Hoean 3anucb</title> - оглавление страницы;
<link type= "text/ess" rel-"'stylesheet" href="stil.css"> - делаем указание об использовании таблицы стилей stil.css в данной папке. Кстати, этого файла, в котором задаются типы и цвета шрифтов, в папке gostevaja еще нет. Поэтому скопируйте его из главной папки htdocs, где мы его создавали раньше, в папку, где будут находиться все файлы гостевой книги, т. е. в папку gostevaja. Правда, можно и не копировать таблицу стилей, а просто указать на нее, изменив ссылку href="stil.css" на href="../stil.css". То есть указать на каталог, который выше каталога gostevaja, в нашем случае каталог htdocs, где и находится файл стилей stil.css. </head> <body>
<center><b id="lolo3">Добавление 3anucu</b></center> - вводим надпись вверху этой страницы. Тип и цвет шрифта задается идентификатором 1о1оЗ, который имеется у меня в таблице стилей stil.css. Например, у меня там есть такая запись: #lolo3{font-size:18pt; color:Ш)00066; font-family:Comic Sans MS} <?php - начало РНР-кода;
$csv= "CSVfile.txt"; - присваиваем переменной $csv название текстового файла для записи данных от посетителей;
If(!$_POST['add']) - в элементе суперглобального массива $_POST['add'] Должны находиться переданные из формы данные от элемента этой формы с именем add. Форма выводится чуть ниже в следующих строках кода. Имя Name=add имеет кнопка «Добавить запись». Элемент массива $_POST['add'J Будет определен только тогда, когда кнопка будет нажата. Поскольку в условии стоит восклицательный знак (символ отрицания), то оно будет истинным, если кнопка <Добавить запись» еще не нажата. Как только мы зайдем на данную страницу, данное условие будет пока истинно и в браузер выведется форма для ввода данных, как на рис. 7.2.
Ц
Echo "<form Ас tion= gostev.php method=POST> - делаем форму для ввода данных, которые после нажатия кнопки «Добавить запись» передадутся методом POST На эту же страницу gostev.php; <Ь>Ваше имя: </b><input type=text size=25 name=imja><br> <Ь>Ваш E-mail: </b><input type=text size=45 name=email><br>
<b>URL Вашего сайта: </b><input type=text size=45 name=url><br> - далее следуют 3 текстовых поля, разделенные строкой, для ввода имени посетителя, его электронного адреса и названия его сайта. По программе эти поля заполнять необязательно; <Ь>Новая запись:</b><br>
<textarea name=text rows=6 cols=70></textarea><br> - далее следует текстовая область для ввода сообщения от посетителя. Эта область не должна быть пустой, иначе, как будет показано ниже в этой программе, данные в текстовый файл записываться не будут;
<input type=submit name=add value=Добавить запись'> - кнопка для отправки введенных посетителем данных и его сообщения программе-обработчику (в данном случае этой же программе gostev.php);
<Input Type=Reset Name=Reset Value='OmMeHa'> - кнопка для отмены введенных данных. Все текстовые поля и области очищаются;
</form> ";
1} - конец блока команд, выполняющегося, когда кнопка «Добавить запись» Еще не нажата;
Else - если кнопка уже нажата, т. е. посетитель отправил свои данные и сообщение, то выполнится весь блок команд в фигурных скобках под номером 2;
Строганов А. С. Ваш первый сайт с использованием РНР-скриптов {2
If(!$_POST['text']) - далее проверяется условие, переданы ли данные из текстовой области формы с именем name=text. Если данных нет, т. е. посетитель не ввел никакого сообщения, то выполнится единственная команда в фигурных скобках под номером 3;
{3
Exit; - это команда выхода из программы. Посетитель может не указывать свои данные в первых трех текстовых полях, но если он оставил пустой текстовую область для ввода сообщения, программа дальше выполняться не будет и запись данных в текстовый файл производиться не будет;
3}
$imja=$_POST['imja']; $email=$_POST['email']; $url=$_POSTf'url'J;
$text=$_POST['text']; - присваиваем четырем произвольным переменным значения элементов суперглобального массива $_POST. В этих элементах, как вы знаете, содержатся введенные пользователем данные - соответственно имя, E-mail, URL сайта, а в элементе $_POST['text'J содержится сообщение посетителя;
$data=date("d.m.Y H:i:s"); - переменной $data присваиваем текущую дату
И время в формате: число. месяц. год час. минуты. секунды;
$strok="| ".stripjags($imja). "| ".$data. "| ".strip_tags($email). " ".strip_tags($url). "|".
Strip_tags($text); - записываем все полученные из формы данные в строку, разделяя их символом «|». Введенные данные обрабатываем функцией Strip tags, которая удалит все теги и слэши, если вдруг они были введены посетителем. Зачем это нужно, объяснено в разд. 6.1. Полученную строку сохраняем в переменной $strok;
$strok=$strok.chr(13).chr(10); - добавляем к строке два символа chr(13) wchr(lO), означающие перевод строки, чтобы данные от следующего посетителя записывались бы с новой строки; $open=fopen($csv, "а"); - открываем текстовый файл для записи;
Fwrite($open,$strok); - записываем туда нашу строку Sstrok. После выполнения данных команд в текстовом файле CSVfde.txt появится строка. Сначала после пробела будет стоять символ «|». Это потом вместо пробела вы будете писать ответы на сообщения посетителей. Далее в строке будут идти имя посетителя, дата отсылки сообщения, E-mail посетителя, URL сайта посетителя и, наконец, после последнего символа «|» будет записано сообщение посетителя. Итого, получится 6 ячеек (в первой ячейке будет пока пробел);
Fclose($open); - закрываем текстовый файл; 158
Echo "<а href='gostevl.php'>BepHymbCR</a>"; - после выполнения всей этой программы выводится ссылка на главную страницу гостевой книги;
2} - завершение блока команд, который выполнится только после нажатия в форме кнопки «Добавить запись»;
?> - завершение РНР-кода.
</body> </html>
Итак, код разобран, но это еще не все. Вы, наверное, заметили, что я не использовал функции блокировки текстового файла при записи. Я не стал это делать сразу, чтобы вы не запутались в этом коде. Блокировку можно и не использовать, но тогда есть риск разушения информации в текстовом файле.
Еще раз посмотрите на листинг файла blok.php (листинг 7.2), который мы составили в разд. 7.3. Эта функция, которая открывает файл, переданный ей в качестве первого аргумента, блокирует его, делает в него запись того, что передано ей в качестве второго аргумента, и, наконец, закрывает файл. Если мы данную функцию вставим в наш разобранный выше код, то 3 строки в конце кода (в листинге 7.3 файла gostev.php они выделены курсивом) будут лишними.
Замените в листинге 7.3 файла gostev.php три строки в конце кода:
$open=fopen($csv, "А");
Fwrite($open,$strok);
Fclose(Sopen);
Следующими строками:
Include "blok. php"; blokir($csv, Sstrok);
Первая строка вставляет код функции на разбираемую нами страницу Gostev.php. Далее мы вызываем эту функцию (в коде blok.php она была названа blokir) и передаем ей в качестве аргументов название текстового файла для записи, находящегося в переменной $csv (именно само название файла, а не его идентификатор!) и составленную нами строку с данными $strok. Все, далее вызванная функция делает свою работу.
Теперь рассмотрим и разберем следующий листинг 7.4 для главной страницы нашей гостевой книги gostevl.php (см. рис. 7.1). Данный код считывает данные из текстового файла CSVfile.txt и выводит 3 сообщения в окно браузера в зависимости от значения переменной $i. Для считывания данных из файла CSVfile.txt, а они у нас там будут в виде двумерной таблицы, воспользуемся ранее составленной нами функцией для считывания func.php (листинг 7.1).
Листинг 7.4 (файл GostevLphp) <Html> <Head>
<Ш1Е>Гостевая Книга</Ш1Е>
<link type="text/css" rel=" stylesheet" href="stil. css">
</head>
<body>
<centerxb id="lolo3"> Гостевая Книга </bx/center> <?php
If (!$_GET['i'l) {
$1=1; }
Else
{
$i=$_GETITl; }
$chislo=3;
Include "func. php"; $csv="CSVfile. txt"; $m=read($csv, "|");
Echo "<form action=gostev. php method=POST>
<input type=submit name=new value='Добавить Новую Запись'>
</formxbr>";
If($m!=NULL) {
Krsort($m);
Foreach($m as Sstroka)
{
$n++;
If(($n>$i*$chislo-$chislo)&&($n<=$i*$chislo)) {
Echo "<b>$n. Sstroka[l]</b> Sstroka[2]<br>
<b>E-mail: </bxa href=$stroka[3]>$stroka[31</a>
<b> Сайт: </bxa href=$stroka[4]>$stroka[41</axbrxbr>
<textarea rows=6 cols=70>$stroka[5]</textareaxbr>";
If($stroka[0])
{
Echo "<Ь>Ответ:</ЬхЬг>
<textarea rows=4 cols=70>$stroka[0]</textareaxbr>"; }
Echo "<hr id=lolo3>";
} }
Echo "Количество Записей: $n<br>";
}
Echo "<centerxp>,f;
For($k=l; $k<=$n/$chislo+l; $k++) {
If ($k—$i) {
Echo "<b>$k</b>"; }
Else
{
Echo "<a href=,gostevl. php? i=$k, xb>$k</bx/a>";
}
}
Echo "</px/center>"; ?>
</body> </html>
Разберем некоторые строчки кода: <title>Гостевая книга</Га1е> - оглавление страницы;
<link type= "text/ess" rel="stylesheet" href="stilcss"> - указываем браузеру на применение листа стилей stil.css;
</head> <body>
<center><b id="lolo3"> Гостевая Книга cauma</b></center> < ?php
If (!$_GET['i'J) - при загрузке данной страницы, мы должны сначала определиться со значением переменной $i. От нее зависит, какие 3 записи гостевой книги будут выводиться на странице. Смысл условия следующий: если переменная $i не получена (или мы ее не указали), то мы присваиваем ей значение единица;
Строганов А. С. Ваш первый сайт с использованием РНР-скриптов {
$i=l; }
Else - иначе, если мы задали значение / в строке браузера, например, GostevJ.php?i=2, то присваиваем переменной Si указанное значение (это значение будет храниться в элементе суперглобального массива $_GET['i'J); {
$i=$_GET['i']; }
$chislo=3; - вводим переменную, которой присваиваем число 3. Именно столько записей будет на одной странице гостевой книги. По желанию можете увеличить данное число;
Include "func.php"; - вставляем в данную страницу программный код файла Func.php. Если помните, там мы создали функцию для считывания данных из csv-файлов, т. е. файлов с табличными данными (листинг 7.1);
$csv="CSVfde.txt"; - переменной $csv присваиваем название текстового файла для записи;
$m=read($csv, ""); - вызываем функцию для считывания содержимого текстового файла read. Именно так мы назвали эту функцию в func.php. В качестве аргументов передаем название файла и символ разделителя данных в строке текстового файла. Функция read возвращает содержимое текстового файла в виде двумерного массива строк и ячеек в каждой строке. Массив присваиваем переменной $т;
Echo "<form action-gostev.php method=POST> - делаем небольшую форму с одной кнопкой «Добавить новую запись», при нажатии на которую посетитель перейдет на страницу для добавления записи gostev.php, программный код которой в прошлом листинге 7.3;
<input type=submit name=new value='Добавить Новую Запись'> </form><br> ";
If($m!=NULL) - теперь нам надо вывести записи из текстового файла в браузер, но вначале проверяется условие, не пуст ли массив $т, т. е. существует ли хотя бы одна запись в гостевой книге. Если массив $т не пуст, то выполнится весь код между фигурными скобками под номером 1;
Ц
Krsort($m); - сортировка массива с данными. Функция krsort сортирует массив в порядке убывания индексов, т. е. свежие записи окажутся наверху;
Foreach($m as Sstroka) - эта функция, как вам уже известно, присваивает переменной Sstroka элемент массива $т (строку с данными) и выполняет весь
Программный код между фигурными скобками под номером 2. Причем в переменной Sstroka будет не просто строка, а массив данных в этой строке (строчный массив). Данный цикл повторяется до тех пор, пока не закончатся все элементы массива, т. е. пока функция foreach не переберет все строки в текстовом файле; 2!
$п++; - вводим счетчик числа сообщений, увеличивая его на единицу при каждом выполнении цикла;
If(($n>$i*$chislo-$chislo)&&($n<=:$i*$chislo)) - условие, указывающее на интервал номеров выводимых сообщений (записей) гостевой книги на страницу. Например, при $i=l условие будет истинно, если номера сообщений (5л) будут соответствовать интервалу от 1 до 3;
3{
Echo "<b>$n. $stroka[l]</b> $stroka[2]<br> - если помните прошлый листинг, данные в строке отделяются друг от друга символом «|». В строке у нас 6 ячеек. Содержимое первой ячейки будет являться элементом строчного массива Sstroka с индексом 0, т. е. $stroka[0J. Содержимое второй ячейки строки - первый элемент массива $stroka[ 1] и т. д. Вспомним прошлый листинг. Первая ячейка ($stroka[0]) содержала пробел, вторая ($stroka[l]) - имя посетителя, третья ($stroka[2]) - дату и время добавления записи. Итак, сначала в браузер (см. рис. 7.1) выводится номер сообщения $п, затем имя посетителя жирным текстом (используются теги <Ь> и </Ь>), потом дата и время добавления сообщения. Далее стоит тег пропуска строки <br>;
<b>E-mail: </b><a href=$stroka[3]>$stroka[3]</a> - во второй строке жирным шрифтом выводится надпись «E-mail.», а затем выводится содержимое четвертой ячейки строки (элемент массива $stroka[3J). Это E-mail посетителя. При помощи тега <а> указываем ссылку на указанный посетителем электронный адрес;
<Ь> Сайт: </b><a href=$stroka[4]>$stroka[4]</a><br><br> - далее выводим содержимое пятой ячейки строки (элемент массива $stroka[4]), делая ссылку на сайт посетителя. Потом пропускаем пару строк;
<textarea rows=6 cols=70>$stroka[5]</textarea><br>"; - далее создаем текстовую область и выводим туда содержимое шестой ячейки строки (элемент массива $stroka[5]). Там у нас текст сообщения от посетителя;
If($stroka[0]) - далее проверяется условие, есть ли что-нибудь в первой ячейке строки. В первую ячейку, как я уже отмечал, вы будете вписывать ответ на сообщение. Если вы еще ничего не вписали, то код в фигурных скобках под номером 4 выполняться не будет;
4{
Echo "<b>Ответ:</b><br> - если же вы вписали ответ вместо пробела в первую ячейку строки перед первым символом «|», то в браузер выведется текстовая область с вашим ответом;
<textarea rows=4 cols=70>$stroka[0]</textarea><br>"; - вывод текстовой области с вашим ответом на сообщение посетителя. Ответ, как нетрудно догадаться, находится в нулевом элементе строчного массива $stroka[0] (в первой ячейке строки текстового файла);
4}
Echo "<hr id=lolo3> "; - выводим горизонтальную линию, отделяя сообщения друг от друга. Цвет линии задается параметром 1о1оЗ, который у меня присутствует в листе стилей stil.css',
3} - завершение вывода записей посетителя. Выведутся 3 записи;
2} - окончание выполнения цикла foreach. Он переберет все строки, но согласно условию if(($n>$i*$chislo-$chislo)&&($n<=$i*$chislo)) в браузер выведутся данные только из трех строк. Какие именно строки - зависит от значения переменной $i;
Echo "Количество записей: $n<br> "; - выводится общее число записей. Поскольку функция foreach перебирает все строки, увеличивая переменную $п На единицу, после окончания цикла в переменной $п будет общее число этих строк, т. е. общее число сообщений;
1} - конец действия условия if($m!=NULL) (см. выше);
Echo "<center><p>"; - после вывода трех сообщений гостевой книги мы должны разместить ссылки на другие сообщения. Ссылки выводим в центре, в отдельном блоке <р>',
For($k=l; $k<=$n/$chislo+I; $k++) - при помощи цикла for выводим ссылки на остальные страницы с сообщениями гостевой книги. Страниц с сообщениями у нас будет несколько, но все они как бы будут объединены в одну. Будет меняться только параметр $i, и в зависимости от этого параметра на страницу будет выводиться та или иная порция из трех сообщений. В переменной $п у нас хранится общее число всех сообщений в массиве $т. Число $n/$chislo+l означает, сколько всего должно быть страниц с записями гостевой книги. Отсюда счетчик $к означает у нас как бы номер страницы с очередными тремя сообщениями гостевой книги;
If ($k==$i) - прежде чем выводить ссылки - проверяется условие. Нечто подобное я уже объяснял при выводе ссылок новостей сайта в листинге 5.8 (файл new 1.php). Итак, на странице, например gostevl.php?i=2, будут ссылки на другие 3 записи гостевой книги (на страницы с другим параметром $i). Нам нужно сделать так, чтобы не срабатывала ссылка на ту страницу, на которой находится посетитель. Например, если посетитель находится на второй странице (в этом случае $i=$k=2), то зачем ему ссылка на вторую страницу? Выведется только числовой номер страницы (выполнится команда между фигурными скобками под номером 6); Б{
Echo "<b>Sk</b>"; 6}
Else
7{
Echo "<а href='gostevl.php?i=$k'><b>$k</b></a>"; - выводим ссылки на страницы с другими параметрами $i, на которых посетитель еще не находится;
7}
5} - окончание цикла вывода ссылок;
Echo "</p></center>"; - закрываем блок ссылок;
?> - окончание РНР-кода;
</body>
</html> - конец кода.
Итак, гостевая книга готова. Запустите программу gostevl.php. Введите десять записей. Данные десяти посетителей можете просто выдумать. После ввода десятой записи и возврата опять на страницу gostevl.php вы увидите там последние 3 записи, а также ссылки на страницы гостевой книги с другим параметром /: gostevl.php?i=2, gostevl.php?i=3, gostevl.php?'^4. Перейдите последнюю страницу gostevl.php?i=4. Вы должны увидеть там свою первую запись. Теперь откройте текстовый файл с записями CSVfile.txt И в самом начале последней десятой строки, до символа «|», введите текст, например «Ответ на десятую запись». Сохраните и закройте текстовый файл. Перезапустите опять программу gostevl.php. Вы опять увидите последние 3 записи, но самая верхняя запись будет уже с ответом (рис. 7.3).
Если вы хотите редактировать текстовый файл CSVfde.txt не заходя на сервер, где будет находиться ваш сайт, составьте программу наподобие RedaktNovost.php (листинг 5.6). Эта программа создавала интерфейс для редактирования текстового файла с новостями. Создать подобную программу для редактирования текстового файла с сообщениями гостевой книги для вас уже не составит особого труда.
Q ^ -5Ш |
Address ' http //localhost/gostevaia/goslevl php
Гостеао* |
- - Д.- - » > ч.. * ; ^ ^ чу ^ ^^ |Ну и, наконец, десятая запись |
Добавить новую запись |
Мой ответ на десятую запись
2. Алексей 26 12 200? 09 38 13
{Девятая запись
Шй |
Рис. 7.3