Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите пожалуйста с гостевой книгой, очень нужно, Гостевая книга на языке perl 
V
    Опции темы
InstantX
  Дата 11.1.2006, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.1.2006

Репутация: нет
Всего: нет



Здравствуйте! Помогите пожалуйста с гостевой книгой на языке perl, я нашёл урок по её созданию, он тут:

Организация гостевой книги

Наша простая гостевая книга будет состоять из двух файлов: guestbook.pl и guestbook.html. Второй файл будет хранить записи, т.е. фактически он является файлом данных, а первый представляет собой программу на языке Perl для управления гостевой книгой.
Приведем содержимое двух этих файлов и подробно прокомментируем его.

Начальное содержимое файла guestbook.html (содержимое этого файла будет меняться, поскольку в него будут добавляться записи).
<h3>Добавление записи в гостевую книгу</h3>
<form method=post action=/cgi-bin/guestbook.pl>
<p><input type=text name=name value='Ваше имя'></p>
<p><textarea name=comment rows=5 cols=50>Комментарий</textarea></p>
<p><input type=submit value='Готово!'>

Файл guestbook.pl

# Подключим модуль CGI.pm
use CGI qw/:standard/;
# Функция вывода части HTML-файла до раздела
# данных
sub outhead {
print "<html>";
print "<head>";
print "<title>Простая гостевая книга</title>";
print "</head>";
print "<body>";
print "<h1>Гостевая книга</h1><hr>";
}
# Функция вывода части HTML-файла после
# раздела данных
sub outtail {
print "</body>";
print "</html>";
}
# Функция замены HTML-тегов
sub antihack {
$_[0] =~ s/</</g;
$_[0] =~ s/>/>/g;
}
# Основная программа
# Если параметры имеются, дописываем их
# в файл
if (param()){
open GB, ">> guestbook.html";
$name=param('name'); antihack($name);
$comment=param('comment'); antihack($comment);
print GB "\n<p>";
$lt=localtime; print GB "\n$lt<br>";
print GB "\n<b>Имя:</b> $name<br>";
print GB "\n<b>Комментарий</b>: $comment";
print GB "\n<hr>";
close GB;
}
# В любом случае выводим содержимое файла
print "Content-type:text/html\n\n";
&outhead;
open GB, "< guestbook.html";
while (<GB>) { print $_;}
close GB;
&outtail;


Я так понял что нужно первый код скопировать в созданный файл guestbook.html, а второй в guestbook.pl
я сделал это, загрузил их в нужные директории установил права 755 на guestbook.pl, страница guestbook.html загрузилась успешно, в форме для написания комментариев я ввёл всё как надо для теста, нажимаю "Готово!" после этого ошибка "500 Internal Server Error!" вот не знаю что делать?! smile я в что в php, что в perl даже не ориентируюсь.... smile Подскажите плиз, какой код нужно писать в guestbook.html, а какой в файл .pl, чтобы всё работало?!! очень нужно!
smile
PM MAIL   Вверх
Sheridan
Дата 11.1.2006, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 5.1.2006

Репутация: нет
Всего: 1



1)Есть кнопка Код...
2)Если нужна гостевуха, то зачем мучаться , вот полно готовых скриптов
Могу посоветовать вот эту работает вроде окей....
3)Если хочется написать самому....
То вот пример того же на PhP
4)Если только на Пёрл, то простите, не в тему+)

Это сообщение отредактировал(а) Sheridan - 11.1.2006, 03:19
--------------------
Гордыня предшествует падению
PM MAIL ICQ   Вверх
korob2001
Дата 11.1.2006, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Посмотри вот здесь, я приводил пример гостевой книги из одного .pl файла.
http://forum.vingrad.ru/index.php?showtopic=43044

Со своего примера ты можешь тоже сделать один .pl файл, только нужно его разбить на подпрограммы, а затем запускать по условию ту, которая нужна в данный момент. Только выкладывать в сеть не торопись эти примеры, они очень опасны.

Модератор: Тему переместил в раздел "Perl: CGI программирование"

Это сообщение отредактировал(а) korob2001 - 11.1.2006, 05:21


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
InstantX
Дата 11.1.2006, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.1.2006

Репутация: нет
Всего: нет



Спасибо!!! Я попробую всё что вы мне посоветовали! smile
PM MAIL   Вверх
Rezzonans
Дата 12.1.2006, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 21.4.2005

Репутация: нет
Всего: нет



Вообщем, если не возражаешь, я бы предложил тебе вот такой вариант гостевой:

Код

#!/usr/bin/perl -w                   #Путь к perl-интерпритатору

use CGI::Carp qw (fatalsToBrowser);  #модуль для обработки ошибок (не обязательно)

$data = "user.txt";                  #файл, в который будут записаны сообщения
#############################Расшифровка данных#################################

#читаем в переменную $inf информацию введённую пользователем
read(STDIN,$inf,$ENV{'CONTENT_LENGTH'});

#Информация пришла в зашифрованном виде. В следующей строке расшифруем
$inf =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#При кодировании данных все пробелы заменяются на +
#Поэтому в следующей строке заменим + на пробелы
$inf =~ tr/+/ /;
#В следующих двух строках заменим знаки < и > на &lt; и &gt; дабы
#никто не мог похакать гостевушку самым очевидным способом.
$inf =~ s/</&lt;/g;
$inf =~ s/>/&gt;/g;
#Заменяем " на ", дабы этот знак мог нормально отображаться в сообщениях
$inf =~ s/\"/\"/g;

#Избавляемся от знаков & в сообщении, путём записи данных в массив
@message = split(/&/, $inf);

#Организуем цикл по всем элементам массива
foreach $dif (@message){
#Избавляемся от знаков = в сообщении
         ($name, $value) = split(/=/, $dif);
#Расфасовываем сообщение в хеш-массив
         $hash_form{$name} = $value;
}
##################################Конец расшифровки#############################

#Если вдруг пользователь ввёл сообщение, заполнив поля name и msg
#Записываем его в файл user.txt
#В противном случае, если вдруг одно или оба поля оказались пустыми
#ничего не делаем

if ($hash_form{'name'} && $hash_form{'msg'}){

#формируем нужный формат записи. В данном случае, сообщение в файл будет
#записано в форме: имя <~> сообщение
     $step_new = "$hash_form{'name'} <~> $hash_form{'msg'}";
#Открываем файл на дозапись в конец
     open(USERS,">>$data");
#Записываем
     print USERS "$step_new\n";
#Закрываем
     close(USERS);
#Выводим пользователю сообщение о том, что всё хорошо, и ссылку назад в гостевую
print qq~
         <html>
         <head><title>Гостевая книга</title></head>
         <body bgcolor = "#FFFFFF">
         <h1>Ваше сообщение добавлено!</h1>
         <br>
         <a href = "$ENV{'SCRIPT_NAME'}"><<Назад...</a>
         </body>
         </html>
~;
exit 0;
}

#выводим саму формочку, в которой сообщения будут вводиться

print qq~
         <html>
         <head><title>Гостевая книга</title></head>
         <body bgcolor = "#FFFFFF">
         <form method = 'POST'>
         Имя:<br>
         <input type = 'text' name = 'name' size = 65><br>
         Сообщение:<br>
         <textarea name = 'msg' rows = 10 cols = 50></textarea><br>
         <input type = 'submit' value = 'Отправить'>
         </form>
         </body>
         </html>
~;

#Читаем уже записанные сообщения из файла user.txt
#и выводим их на экран
open(DATA, "<$data");
while($fn = <DATA>){
      $fn =~ s/<~>/<br>/g;
      print "$fn<br><hr>";
}
print "<br><br>";
close(DATA);


#Конец программы



Копируешь всё это дело в блокнот. Сохраняешь в файл, к примеру, guestbook.pl, копируешь в директорию с cgi-скриптами и назначаешь на этот файл права 755. После этого, твоя гостевая книга будет доступна по адресу http://твой_сервер.ru/cgi-bin/guestbook.pl
При этом все сообщения сохраняются в файл user.txt, который автоматически создастся в директории с cgi-скриптами. И никаких замутов с html страничками.
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 12.1.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Эту строку:
Код

use CGI::Carp qw (fatalsToBrowser);

Нужно вообще удалить или закоментировать в рабочем скрипте. Эти сообщения полезны разработчику, а вот рядовому пользователю их видеть не нужно.

А так же советую блокировать файл при открытии его для записи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rezzonans
Дата 12.1.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 21.4.2005

Репутация: нет
Всего: нет



В смысле, каким образом блокировать файл? korob2001, покажи если можно
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 12.1.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Код

use Fcntl qw(:flock);

sub start_lock {
       open(BLOCK, "> lock.smx") or die "Can't open block file: $!\n";
       flock(BLOCK, LOCK_EX) or die "Can't locked file: $!\n";
}

sub stop_lock { close(BLOCK) };



# Блокируем файл
start_lock();

# Открываем файл для записи
open(F, ">> file.txt") or die "Can't open file 'file.txt': $!\n";
        # Добавляем запись
close(F); #Закрываем файл

# Снимаем блокировку
stop_lock();

Этим мы гарантируем, что не произойдёт одновременной записи в файл несколькими пользователями. Если этого не делать, то при одновременной записи в файл, данные могут круто повредиться, т.е. они наложатся друг на друга. Но это не значит, что если один человек заблокировал файл, то второй будет отшит. Будет создана очередь и как только файл освободится, то тот кто стоит в очереди точно так же заблокирует его, на время открытия.

Вот здесь я как-то приводил пример кода, которым можно всё это наглядно увидеть в работе.
http://forum.vingrad.ru/index.php?showtopi...=1&hl=fcntl


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rezzonans
Дата 13.1.2006, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 21.4.2005

Репутация: нет
Всего: нет



чёрт, как-то никогда об этом не задумывался. Спасибо, korob2001
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 13.1.2006, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Да незачто. smile
Кстати, файл можно блокировать и не используя модуль Fcntl. Посмотри документацию perldoc -f flock, но лично я предпочитаю использовать Fcntl, который входит в стандартную библиотеку Perl.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 17.1.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



С базой данных на MySQL гостевушка сразу преобретает массу хороших функций и на много упрощается ее программирование smile

И никаких блокировок файла не надо smile

Это сообщение отредактировал(а) rcdimon - 17.1.2006, 19:59
PM MAIL ICQ   Вверх
korob2001
Дата 17.1.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата

С базой данных на MySQL гостевушка сразу преобретает массу хороших функций и на много упрощается ее программирование

Согласен с тобой, но не всегда она доступна. smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.