Рисунок 4 - Структура таблицы Messages
Содержимое файла testform.pl
#!/usr/local/perl/bin/perl
use DBI;
require "cgi-lib.pl";
&ReadParse(*input);
# Имя пользователя БД
$opt_user="root";
# Пароль доступа к БД
$opt_password="";
# Имя базы
$database="guest";
$url="http://localhost/db/form.html";
$cgi="http://localhost/cgi-bin/db/result.pl ";
# Вывод http-заголовка
print "Content-type: text/html\n\n";
# Подключение к базе
$dbh = DBI->connect("DBI:mysql:database=$database",
$opt_user,$opt_password) ||
die "Can't connect: $DBI::errstr\n";
$query="INSERT INTO messages (user_name, user_email, user_message) values ('$input{'user_name'}','$input{'user_email'}',’$input{'user_messages'}’)";
# Подготовка
$sth = $dbh->prepare($query);
$sth->execute();
# Отключение от базы
$rc = $sth->finish;
$rc = $dbh->disconnect;
print "<br><a href='$url'>Вернуться на страницу форм</a><br>";
print "<br><a href='$cgi'>Просмотреть сообщения</a><br>";
Листинг формирования результатов в таблице
В следующем скрипте показана возможность извлечения данных из таблицы и представление извлеченной информации в виде таблицы.
Фрагмент скрипта perl result.pl
#!/usr/local/perl/bin/perl
use DBI;
# Имя пользователя БД
$opt_user="root";
# Пароль доступа к БД
$opt_password="";
# Имя базы
$database="guest";
$url="http://localhost/db/form.html";
$cgi="http://localhost/cgi-bin/ ";
# Вывод http-заголовка
print "Content-type: text/html\n\n";
# Подключение к базе
$dbh = DBI->connect("DBI:mysql:database=$database",
$opt_user,$opt_password) ||
die "Can't connect: $DBI::errstr\n";
# Чтение введенных в форме данных (данный пример рассматривает случай, когда была осуществлена передача одного поля формы.) В других скриптах функция включена в библиотеку cgi-lib и вызывается &ReadParse(*input);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$input{$name} = $value;
}
$query="select * from messages";
# Подготовка
$sth = $dbh->prepare($query);
$sth->execute();
$cols=$sth->{NUM_OF_FIELDS};
#Формирование таблицы и её заголовка
print "<table width=70% align=center cellspacing=0 cellpadding=1 border=1>";
print "<tr valign=middle align=center>";
@fieldname=@{ $sth->{NAME}};
for($i=0;$i<$cols;$i++)
{
print "<td><b>$fieldname[$i]</b></td>\n";
}
print "</tr>";
#Заполнение таблицы содержимым, исходя из запроса
while (my $ref=$sth->fetchrow_arrayref())
{
print "<tr align=center>";
for($i=0;$i<$cols;$i++)
{
print "<td>",$ref->[$i],"</td>";
}
print "<tr>\n";
}
print "</table>";
Листинг формирования результатов в списке
print "<SELECT name=column>\n";
# заполняем список таблиц
$sth = $dbh->prepare("show tables");
$sth->execute;
while (@line = $sth->fetchrow_array()) {
print " <OPTION>$line[0]</OPTION>\n";[1]
}
print "</SELECT>”;
Шаг 3. Тестирование скрипта
Проверив скрипт визуально на наличие ошибок - отсутствие ";" в конце строк, наличие непарных скобок и кавычек и т.п., запустите скрипт для проверки в баузере, перейдя предварительно в каталог cgi-bin (http://localhost/cgi-bin/db/testform.pl).
Если в скрипте содержатся ошибки, то вы увидите сообщение типа:
syntax error at testform.pl line 18, near "open"Execution of testform.pl aborted due to compilation errors.В этом случае проверьте текст около указанной строки. Помните, что причина ошибки может быть выше на несколько, иногда достаточно много строк. В случае если скрипт запускался через web browser, то сообщения выводяться в файл \usr\local\Apache\logs\error.log
Исправленный скрипт сохраните, и тестируйте так до тех пор, пока он не выдаст корректных выходных данных.
Шаг 4. Тестирование скрипта с формой
Если скрипт работает сам по себе, вы можете оттестировать его с формой:
1. Убедитесь, что web-сервер запущен.
2. Запустите ваш браузер.
3. Наберите URL по которому находится ваша форма (обратите внимание, что строка должна начинаться с http://, а не с file://. В нашем случае http://localhost/bd/form.html
4. Введите ваше имя в поле формы и нажмите кнопку "Зарегистрировать".
Рисунок 5 - Результат работы скрипта testform.pl
Это и есть страница, сгенерированная скриптом "на лету". Если вы получили сообщение об ошибке сервера, проверьте правильность расположения скрипта и правильность значения параметра action в тэге form.
6. Если вы видите правильно сгенерированную страницу, нажмите на ссылку “Посмотреть сообщения”. Вы должны будете увидеть новую страницу, созданную скриптом примерно в таком виде:
Рисунок 6 -Результат работы скрипта result.pl
Если вы не видите этого, проверьте правильность URL. В противном случае форма и скрипт правильно работают вместе. Вы успешно создали первое web-приложение.
Для изучения различных переменных создайте следующий скрипт: #!/usr/local/perl/bin/perl#vars.cgisub urldecode{ #очень полезная функция декодировани local($val)=@_; #запроса,будет почти в каждой вашей CGI-программе $val=~s/\+/ /g; $val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge; return $val; }print "Content-Type: text/html\n\n";print "<HTML><HEAD><TITLE>CGI-Variables</TITLE></HEAD>\n";print "<BODY>\n";print "Enter here something:<ISINDEX><BR>\n";print "Your request is:$ENV{'REQUEST_STRING'}<BR>\n";print "Decoded request is:urldecode($ENV{'REQUEST_STRING'})<BR>\n";print "<HR>\n";print "Variables:<BR>\n";print "<I><B>REQUEST_METHOD</B></I>=$ENV{'REQUEST_METHOD'}<BR>\n";print "<I><B>QUERY_STRING</B></I>=$ENV{'QUERY_STRING'}<BR>\n";print "<I><B>CONTENT_LENGTH</B></I>=$ENV{'CONTENT_LENGTH'}<BR>\n";print "<I><B>CONTENT_TYPE</B></I>=$ENV{'CONTENT_TYPE'}<BR>\n";print "<I><B>GATEWAY_INTERFACE</B></I>=$ENV{'GATEWAY_INTERFACE'}<BR>\n";print "<I><B>REMOTE_ADDR</B></I>=$ENV{'REMOTE_ADDR'}<BR>\n";print "<I><B>REMOTE_HOST</B></I>=$ENV{'REMOTE_HOST'}<BR>\n";print "<I><B>SCRIPT_NAME</B></I>=$ENV{'SCRIPT_NAME'}<BR>\n";print "<I><B>SCRIPT_FILENAME</B></I>=$ENV{'SCRIPT_FILENAME'}<BR>\n";print "<I><B>SERVER_NAME</B></I>=$ENV{'SERVER_NAME'}<BR>\n";print "<I><B>SERVER_PORT</B></I>=$ENV{'SERVER_PORT'}<BR>\n";print "<I><B>SERVER_PROTOCOL</B></I>=$ENV{'SERVER_PROTOCOL'}<BR>\n";print "<I><B>SERVER_SOFTWARE</B></I>=$ENV{'SERVER_SOFTWARE'}<BR>\n";print "<I><B>HTTP_ACCEPT</B></I>=$ENV{'HTTP_ACCEPT'}<BR>\n";print "<I><B>HTTP_USER_AGENT</B></I>=$ENV{'HTTP_USER_AGENT'}<BR>\n";print "<I><B>HTTP_HOST</B></I>=$ENV{'HTTP_HOST'}<BR>\n";print "<HR>\n";print "All enviroment:<BR>\n";foreach $env_var (keys %ENV){ print "<I>$env_var=$ENV{$env_var}</I><BR>\n"; }print "</BODY></HTML>\n"; вызов скрипта осуществляется http://localhost/cgi-bin/var.cgiЗадание
1. Создайте таблицу Messages в соответствии с предложенной структурой.
2. Получите работающее приложение, обеспечивающее внесение пользователем данных в таблицу Messages.
3. Представьте в web браузере информацию, содержащуюся в таблице Messages.
4. Внесите изменения в структуру таблицы Messages, HTML –форму, скрипты и SQL запросы для решения задач:
· Отображения даты внесения сообщения (добавьте новое поле в таблице);
· Адреса пользователя (добавьте новое поле на форму и поле в таблице)
· REMOTE_HOST (добавьте новое поле в таблице)
Учебное издание
ПОНОМАРЕВ Алексей Анатольевич
Часть 3
Методические указания к выполнению лабораторных работ
по курсу «Базы данных» для студентов III курса специальностей 230105 «Программное обеспечение вычислительной техники и автоматизированных систем». 230201 «Информационные системы и технологии».
Научный редактор
доктор технических наук,
профессор Г.П. Цапко
Подписано к печати 26.11.2009. Формат 60х84/16. Бумага «Снегурочка». Печать Xerox. Усл. печ. л. 000. Уч.-изд. л. 000. Заказ ХХХ. Тираж ХХХ экз. | ||
Томский политехнический университет Система менеджмента качества Томского политехнического университета сертифицирована NATIONAL QUALITY ASSURANCE по стандарту ISO 9001:2000 | ||
. 634050, г. Томск, пр. Ленина, 30. |
[1] Если требуется заполнять список несколькими полями в строке, то команда примет вид print " <OPTION value=$line[0]>$line[0] $line[1]</OPTION>\n";[1] где 0 и 1 номера соответствующих атрибутов, возвращаемых запросом select