Наиболее типичным примером программирования является Гостевая книга. В этой статье мы с Вами напишем простенькую Гостевую книгу, записывающую данные в файл.
Наиболее типичным примером программирования является Гостевая книга. В этой статье мы с Вами напишем простенькую Гостевую книгу, записывающую данные в файл. Для начала немного об самом скрипте, реализован он в виде одного файла. Как он будет работать. При запуске скрипта будет выводиться список сообщений, а в конце будет форма для записи нового сообщения. Скрипт будет проверять наличие параметров запроса, если скрипт получает данные из формы, он их записывает в файл и производит редирект, на список сообщений.
#!/usr/bin/perl
use strict; # Директива для ужесточения стилистического контроля use CGI; # подключаем модуль CGI my $gb_path="gb.dat"; #Файл, где будут храниться записи
my $query=new CGI; # создаем объект CGI
#Если запрос нулевой то выводим список сообщений if(!$query->param){ #Заголовок print $query->header,$query->start_html(Записи в гостевой книге);
#Открываем файл open(GB_DAT,"$gb_path") die("Невозможно открыть файл - $gb_path"); my @lst=<GB_DAT>; # Помещаем строки в массив #Выводим данные for(my $i=@lst-1;$i>=0;$i-=3){ # пробегаемся по всем строкам # выводим имя автора как ссылку на его e-mail print "<hr>Автор: <a href=mailto:$lst[$i-1]>$lst[$i-2]</a><br>"; # выводим сообщение print "Сообщение:<br>$lst[$i]<br>"; } #Закрываем файл close(GB_DAT);
HTML print $query->end_html; # конец html-документа
}else{ #Обработка данных из формы
#Открываем файл для дописи open(GB_DAT,">>$gb_path") die("Невозможно открыть файл - $gb_path"); # Блокируем файл для записи другими пользователями flock(GB_DAT,2) die("Невозможно заблокировать файл - $gb_path"); #записываем данные print GB_DAT $query->param(aname)," ";# Имя записавшего print GB_DAT $query->param(email)," "; # E-mail my $message=$query->param(mess); # считываем сообщение $message=~tr/ / /; #Заменяем возвраты каретки на пробелы print GB_DAT "$message "; # Записываем сообщение в файл #Закрываем файл close(GB_DAT); #Перенаправляем пользователя на список print $query->redirect(gb.cgi); }
Данные записываются в файл указанный в переменной $gb_path. Для работы необходимо создать файл указываемый в gb_path и установить ему права на запись (для Unix).
Зачем нужна блокировка файла при записи? функция flock блокирует файл для доступа другими пользователями, чтобы не произошло неразберихи при записи, если, допустим, к данному скрипту одновременно обратились несколько пользователей и один начал запись сообщения, когда как другой пользователь в это время тоже записывает сообщение, может возникнуть ситуация когда их записи перепутаются, какой бкдет результат, думаю, вы поняли. Для этого и блокируется файл.
Замечания по работе скрипта...
Скрипт носит демонстрационный характер и содержит минимум форматирования.
Цель написания данного скрипта заключается в демонстрации обработки форм и записи результатов в файл.
Данный скрипт проверен на Apache под операционными системами Win2000 и FreeBSD.