Именно так. У мен возникла проблема, при изучении книги "Разработка CGI-приложений на PERL". То есть там есть пример скрипта составления статистики посещения сайта. То есть инфо о посетителе выводится скриптом "viewlog.cgi", собирается информация с помощью "vislog.cgi" + собственный модуль LogConnect.pm для подключения к базе данных visitors на MySQL сервере localhost. Так вот. Несмотря на многочисленные проблемы, я привёл скрипты вот в такой результат, который я вам сейчас продемонстрирую. LogConnect.pm:
| Код | package LogConnect; use DBI; use strict; use CGI::Carp qw(fatalsToBrowser); sub connect { my $log_dsn = "DBI:mysql:database=visitors;host=localhost"; my $log_dbh = DBI->connect($log_dsn, "mysql", ""); if (!defined($log_dbh)) { print "Content-Type: text/html\n\n"; print qq( <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=KOI8-R"> <title>\u041e\u0448\u0438\u0431\u043a\u0430!</title> </head> <body bgcolor="white">); print "<p><font color='red'>error: \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a \u0434\u0430\u043d\u043d\u044b\u0445 MySQL:</font></p>"; print "<p><font color='blue'>"; print DBI->errstr; print "</font></p>"; print "-" x.25."\n"; return; } } 1;
|
vislog.cgi:
| Код | #!/usr/local/bin/perl5 -wT #\u0420\u0443\u0441\u0441\u043a\u0438\u0439 #\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043b\u0438\u0447\u043d\u043e \u043c\u043d\u043e\u044e (SantaXP) \u0434\u043b\u044f \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0430\u0439\u0442\u0430 #\u0421\u043e\u0437\u0434\u0430\u043d 25 \u0438\u044e\u043d\u044f 2005 \u0433\u043e\u0434\u0430 #\u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 SantaXP #English #This csript was written by me (SantaXP) to make a statistic of visitors of my web-sait #Made in june 25 2005 year #All rigths reserved by SantaXP #\u041e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 \u041a\u0435\u0432\u0438\u043d\u0430 \u041c\u0435\u043b\u044c\u0442\u0446\u0435\u0440\u0430 \u0438 \u0411\u0440\u0435\u043d\u0442\u0430 \u041c\u0438\u0445\u0430\u043b\u044c\u0441\u043a\u0438 "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 CGI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 PERL"
use POSIX; use Socket; use lib qw(.); use LogConnect; use CGI::Carp qw(fatalsToBrowser);
my $dbh = LogConnect->connect; my $ip = $ENV{'REMOTE_ADDR'}; my $browser = $ENV{'HTTP_USER_AGENT'}; my $referer = $ENV{'HTTP_REFERER'}; my $here = $ENV{'REQUEST_URI'};
my @digits = split(/\./, $ip); my $adress = pack("C4", @digits); my $host = gethostbyaddr($address, AF_INET);
my $time = strftime("%Y-%m-%d %H:%M:%S",gmtime);
my $query = qq( insert into acess_log values ("$ip","$host","$browser","$here","$referer","$time")); my $sth = $dbh->prepare($query); $sth->execute; $dbh->disconnect;
|
viewlog.cgi:
| Код | #!/usr/local/bin/perl5 -wT #\u0420\u0443\u0441\u0441\u043a\u0438\u0439 #\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043b\u0438\u0447\u043d\u043e \u043c\u043d\u043e\u044e (SantaXP) \u0434\u043b\u044f \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0430\u0439\u0442\u0430 #\u0421\u043e\u0437\u0434\u0430\u043d 25 \u0438\u044e\u043d\u044f 2005 \u0433\u043e\u0434\u0430 #\u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 SantaXP #English #This csript was written by me (SantaXP) to make a statistic of visitors of my web-sait #Made in june 25 2005 year #All rigths reserved by SantaXP #\u041e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 \u041a\u0435\u0432\u0438\u043d\u0430 \u041c\u0435\u043b\u044c\u0442\u0446\u0435\u0440\u0430 \u0438 \u0411\u0440\u0435\u043d\u0442\u0430 \u041c\u0438\u0445\u0430\u043b\u044c\u0441\u043a\u0438 "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 CGI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 PERL"
use strict; use lib qw(.); use LogConnect; use CGI::Carp qw(fatalsToBrowser); print "Content-Type: text/html\n\n";
my $dbh = LogConnect->connect; my $query = qq(select CLIENT from acess_log); my $sth = $dbh->prepare($query); $sth->execute; my %clients; while (x$_ = $sth->fetchrow) { $clients{$_}++; } $dbh->disconnect; my @clients = sort {$clients{$b} <=> $clients{$a}} keys %clients; print <<HTML; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=KOI8-R"> <title>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0442\u0447\u0451\u0442</title> </head> <body bgcolor="white"> <center><h2>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0442\u0447\u0451\u0442</h2></center> <center><h3>\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 Web-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432</h3></center> <hr noshade> <center> <table border=1 cellpadding=3 cellspacing=3> HTML foreach (@clients) { print qq(<td align=center>$_</td><td align=center> $clients{$_}</td><tr>); } print qq( </table> </center> </body> </html>);
|
Раньше ко всем 3-ём скриптам прилагалась строка: use strict; Однако, от неё было больше проблем, чем пользы. И так, при запуске, либо viewlog.cgi, либо vislog.cgi выдаётся лишь вот такое сообщение, отличающееся в двух вариантах, лишь номером строки с prepare:
| Цитата | Content-type: text/html Software error:
Can't call method "prepare" without a package or object reference at /usr/local/apache/cgi-bin/viewlog.cgi line 20.
For help, please send mail to the webmaster (santaxp@localhost), giving this error message and the time and date of the error.
|
-----
Спасибо всем за внимание, я с большим трудом проделал многое, чтобы дойти до того варианта, в котором я задаю вопрос вам и, поскольку, я активно занят обучением CGI программирования на PERL этот вопрос для меня крайне актуален и посему я решил попросить помощи у более опытных и лучших программистов, чем я. Заранее спасибо за внимание! |