4. Запустите Internet Explorer (Пуск → Все программы → Internet Explorer) или любой другой браузер. В адресной строке браузера введите следующий адрес: http:// localhost/cgi-bin/test.pl. Появление текста «Работа с MySQL» (рис. 4.20) на вебстранице означает, что Perl-приложения выполняются нормально.
Рис. 4.20. Результат выполнения приложения
Аналогичная последовательность действий используется для создания всех последующих сценариев Perl в данном разделе. Приступим к разработке приложения, взаимодействующего с базой данных MySQL.
Подключение к базе данных
Прежде чем использовать команду подключения к базе данных MySQL, укажем интерпретатору Perl, что необходимо использовать модуль Perl DBI. Для этого включим в сценарий командуuse DBI;
Для подключения к базе данных используется метод
connect(«DBI:mysql:database=<Имя базы данных>;host=<Имя
хоста>[;port=<Номер порта>]»,»Имя
пользователя»,»Пароль»[,<Режим обработки ошибок>]);Метод connect() создает соединение с базой данных и возвращает дескриптор соединения – указатель на объект, отвечающий за взаимодействие с базой данных и реализующий все методы работы с БД. Если установить соединение не удалось, метод connect() возвращает значение undef.
Примечание
Необязательный параметр port по умолчанию принимает значение 3306. Режим обработки ошибок мы обсудим в подразделе «Обработка ошибок».
Например, вызов метода my $dbh = DBI —»
my $dbh = DBI ->
connect(«DBI:mysql:database=SalesDept;host=localhost»,
“username”,”userpassword”);осуществляет подключение к серверу MySQL, работающему на локальном компьютере, используя имя пользователя username и пароль userpassword. При этом база данных SalesDept выбирается в качестве текущей. Дескриптор соединения сохраняется в переменной $dbh.
Совет
В целях защиты от несанкционированного доступа рекомендуется подключаться к базе данных не от имени пользователя root, а от имени специально созданного пользователя с минимально необходимыми правами доступа. О регистрации пользователей и настройке прав далее будет рассказано подробно.
После окончания работы с базой данных отключимся от нее с помощью метода disconnect();
Рассмотрим пример приложения, которое подключается к базе данных и выводит диагностическое сообщение. Создайте в папке cgi-bin корневой папки XAMPP файл connect.pl и введите в него код, представленный в листинге 4.10.
Листинг 4.10.
Подключение к базе данных
#!»C:\Program Files\xampp\perl\bin\perl.exe»
print «Content-type: text/html; charset=windows-1251\n\n»;
#Подключаем модуль DBI
use DBI;
#Подсоединяемся к базе данных
my $dbh = DBI -> connect(“DBI:mysql:database=SalesDept;host=localhost”,
“username”,”userpassword”);
if(!$dbh)
{
print(“Ошибка доступа к базе данных. Приносим свои извинения”);
}
else
{
print “Подключение выполнено успешно”;
}
#Отсоединяемся от базы данных
$dbh->disconnect();
Сохраните файл connect.pl, а затем наберите в адресной строке браузера адрес http://localhost/cgi-bin/connect.pl. При успешном подключении на веб-странице появится соответствующее сообщение (рис. 4.21). Рис. 4.21. Результат подключения к базе данных
После подключения к серверу MySQL вы можете получать данные из базы и записывать их в базу. В следующем подразделе вы узнаете о сохранении данных.
Ввод данных в базу
В этом подразделе приводятся сведения о том, как создать приложение, которое записывает в базу введенные пользователем данные. Вначале рассмотрим метод, позволяющий выполнить SQL-команду, не предполагающую получения данных из базы (например, INSERT, UPDATE или DELETE):do(«<Текст команды>»[, <Неиспользуемый параметр>,<Привязываемые параметры>])
Метод do() возвращает количество строк, с которыми была выполнена операция, значение -1, если количество строк неизвестно, и значение undef в случае ошибки.
Примечание
Если SQL-команда была выполнена успешно, но не произвела действий с одной строкой, то метод do() возвращает значение E0E, которое рассматривается как числовое значение 0 и как логическое значение TRUE.
Единственным обязательным параметром метода do() является текст SQL-команды, которую необходимо выполнить. Например, установить кодировку можно следующим образом:
$dbh -> do(«SET NAMES cp1251»);
Совет
Установка кодировки перед началом работы с данными позволяет избежать некорректного отображения и сохранения в базе данных символов русского алфавита. Была выбрана кодировка Windows (CP-1251), так как именно в ней был создан сценарий input.pl.
Привязка параметров используется в случае, когда необходимо выполнить динамическую SQL-команду, содержащую переменные величины. В тексте команды эти величины нужно заменить символами? а их значения передать в качестве параметров метода do(). Например, пусть имя, телефон и адрес клиента хранятся, соответственно, в переменных $name, $phone и $address. Записать эти данные в базу можно с помощью вызова метода
$dbh – > do(«INSERT INTO Customers (name,phone,address)
VALUES (?,?,?)»,
undef,$name,$phone,$address);Перед выполнением SQL-команды INSERT вместо знаков вопроса будут подставлены значения переменных $name, $phone и $address (неиспользуемому параметру было присвоено значение undef). При этом интерпретатор Perl автоматически вставляет кавычки там, где это необходимо, экранирует спецсимволы и т. п.
В качестве примера использования метода do() рассмотрим форму саморегистрации нового клиента, в которой клиент может ввести свое имя, телефон и адрес. Помимо метода do(), для создания такого приложения нам потребуется дополнительный модуль Perl CGI и функция param(), которая возвращает список значений, введенных пользователем в поля формы. Функция param() позволяет объединить вывод формы и обработку введенных данных в одном сценарии: если функция вернула непустое значение, значит, нужно обработать введенные пользователем данные, а если пустое – отобразить форму для ввода данных. Если же в качестве аргумента функции param() указывается имя поля формы, то функция вернет значение из этого поля.
Итак, в папке cgi-bin корневой папки XAMPP создайте файл input.pl, содержащий код, представленный в листинге 4.11.
Листинг 4.11. Ввод данных#!”C:\Program Files\xampp\perl\bin\perl.exe”
print “Content-type: text/html; charset=windows-1251\n\n”;
#Подключаем модуль DBI
use DBI;
#Подключаем модуль CGI
use CGI \':all\
#Если список значений формы пуст, выводим форму
if(!param())
{
print «
Пожалуйста, заполните следующие поля:
Ваше имя: Телефон: Адрес:
”;
}
#Если список значений формы непуст, сохраняем эти значения
else
{
#Подсоединяемся к базе данных
my $dbh = DBI ->
connect(«DBI:mysql:database=SalesDept;host=localhost»,
«username»,»userpassword»);
if (!$dbh)
{
print «Ошибка доступа к базе данных. Приносим свои извинения”;
die();
}
#Устанавливаем кодировку CP-1251
$dbh->do(«SET NAMES cp1251»);
#Записываем данные о клиенте в таблицу Customers (Клиенты)
#param(\'CustomerName\'), param(\'CustomerPhone\') и param(\'CustomerAddress\') –
#значения, полученные из полей формы с именами
#CustomerName, CustomerPhone и CustomerAddress
my $insert = $dbh -> do(«INSERT INTO Customers (name,phone,address)
values (?, ?, ?)»,
undef,
param(\'CustomerName\'), param(\'CustomerPhone\'), param(\'CustomerAddress\'));
if(!$insert)
{
print “Ошибка доступа к базе данных. Приносим свои извинения”;
die();
}
#Отсоединяемся от базы данных
$dbh->disconnect();
#Выводим итоговое сообщение