MySQL 5.0. Библиотека программиста
Шрифт:
error_reporting(0)
В случае возникновения ошибки сформируем собственное сообщение, содержащее дату и время, номер и описание ошибки. Записать это сообщение в log-файл или отправлять по электронной почте позволяет функция
error_log(«<Текст сообщения>», <Тип сообщения>,»<Адрес доставки>»)
Дополните сценарий output.php обработкой ошибок (листинг 4.6). Листинг 4.6. Обработка ошибок
<html>
<head>
<title>Работа с MySQL</title>
</head>
<body>
<h1>Список товаров</h1>
<!– Выводим список товаров –>
<table>
<!– Выводим заголовок списка товаров –>
<tr>
<th>Наименование</th>
<th>Описание</th>
<th>Цена</th>
</tr>
<?php
//Отключаем вывод системных сообщений об ошибках
error_reporting(0);
//Соединяемся с сервером MySQL
$connection = mysql_connect(«localhost»,»username»,»userpassword»);
if(!$connection) die(“Ошибка доступа к базе данных.
Приносим свои извинения”);
//Выбираем базу данных SalesDept (Отдел продаж)
//В случае ошибки формируем сообщение, записываем его в файл
//и отправляем по электронной
if(!mysql_select_db(“SalesDept”))
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno.» «.mysql_error.»\r\n»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»admin@somedomain.ru»);
die(“Ошибка доступа к базе данных. Приносим свои извинения”);
}
//Устанавливаем кодировку CP-1251
mysql_query(«SET NAMES cp1251»);
//Получаем список товаров
$qresult = mysql_query(«SELECT * FROM Products»);
//Проверяем результат выполнения запроса; в случае ошибки формируем //
сообщение, записываем его в файл и отправляем по электронной почте
if(!$qresult)
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno.» «.mysql_error.»\r\n»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»admin@somedomain.ru»);
die(“Ошибка доступа к базе данных. Приносим свои извинения”);
}
//Очередную строку из результата запроса (информацию о товаре)
// записываем в ассоциативный массив $product
while ($product=mysql_fetch_assoc($qresult))
{
//выводим элементы массива $product с именами description (наименование), //
details (описание) и price (цена)
print «\n<tr><td>{$product[«description»]}</td>
<td>{$product[«details»]}</td>
<td>{$product[«price»]}</td></tr>\n»;
}
?>
</table>
</body>Если при выполнении запроса произойдет ошибка, например окажется, что таблица Products (Товары) была удалена, то сообщение вида 2008.06.15 14:22:53 1146 Table \'salesdept.products\' doesn\'t exist будет записано в файл mysqlerror.log, находящийся в папке htdocs корневой папки XAMPP, и отправлено на адрес admin@somedomain.ru (тип сообщения 3 соответствует записи в файл, тип 1 – отправке по электронной почте). На веб-странице при этом отобразится нейтральное сообщение: «Ошибка доступа к базе данных. Приносим свои извинения».
Итак, мы завершили создание приложения, которое получает информацию из базы данных. В следующем подразделе мы рассмотрим обратный пример – приложение, которое записывает в базу данные, введенные пользователем на вебстранице.
Ввод данных в базу
В этом подразделе вы узнаете, как создать PHP-приложение для ввода данных в базу. Такие приложения обычно состоят из двух взаимосвязанных страниц. Первая страница представляет собой веб-форму, в которую пользователь может ввести данные. Вторая – собственно PHP-сценарий, обрабатывающий эти данные.
В качестве примера рассмотрим форму саморегистрации нового клиента, где клиент указывает свое имя, телефон и адрес. Создадим в папке htdocs корневой папки XAMPP файл input.php, содержащий следующий код (листинг 4.7).
Листинг 4.7. Форма ввода данных<html>
<head>
<title>Работа с MySQL</title>
</head>
<body>
<h1>Пожалуйста, заполните следующие поля:</h1>
<!– Создаем форму для ввода данных –>
<!– Обрабатывать введенные данные будет сценарий save.php –>
<form method=»post» action=»save.php»>
<table>
<!– Создаем поле для ввода имени заказчика –>
<tr>
<td>Ваше имя:</td>
<td><input type=»text» name=»CustomerName» value=»»></td>
</tr>
<!– Создаем поле для ввода телефона заказчика –>
<tr>
<td>Телефон:</td>
<td><input type=»text» name=»CustomerPhone» value=»(495)»></td>
</tr>
<!– Создаем поле для ввода адреса заказчика –>
<tr>
<td>Адрес:</td>
<td><input type=»text» name=»CustomerAddress» value=»»></td>
</tr>
</table>
<br>
<!– Создаем кнопку для подтверждения данных –>
<input type=»submit» value=»Отправить»>
</form>
</body>
</html>На рис. 4.13 показана веб-страница, сгенерированная этим кодом.
Создавая эту форму, я указал, что при ее подтверждении (то есть при нажатии кнопки Отправить) введенные пользователем значения полей будут переданы в сценарий save.php по методу POST. В сценарии save.php мы будем использовать уже известные нам PHP-функции:
• функции подключения к серверу MySQL и выбора базы данных, которые мы рассматривали в подразделе «Подготовительные действия»;
• функцию mysql_query, которая обеспечивает выполнение SQL-команды на сервере MySQL. Если SQL-команда не предполагает получение данных из базы (такими командами являются, например, команды INSERT, UPDATE, DELETE), то функция возвращает значение TRUE в случае успешного выполнения команды и значение FALSE в случае ошибки;
• функции обработки ошибок, о которых вы узнали в подразделе «Обработка ошибок».
Итак, создадим в папке htdocs корневой папки XAMPP файл save.php, содержащий следующий код (листинг 4.8).
Листинг 4.8. Сохранение данных в базе<html>
<head>
<title>Работа с MySQL</title>
</head>
<body>
<?php
//Отключаем вывод системных сообщений об ошибках
error_reporting(0);
//Получаем данные из формы input.php
$phone=$_POST[«CustomerPhone»];
//Если номер телефона не введен, то связаться с клиентом невозможно.
//Предлагаем клиенту вернуться к заполнению формы
if(empty($phone) or ($phone == «(495)»))
{
print “<h3>Пожалуйста, введите номер телефона</h3>”;
print “<input type=\'button\' value=\'Вернуться к редактированию данных\'
onClick=\'history.go(-1)\'”;
}
//Если номер телефона введен, продолжаем обработку данных
else
{
//Получаем из формы имя и адрес клиента
$name=$_POST[«CustomerName»];
$address=$_POST[«CustomerAddress»];
//Соединяемся с сервером MySQL
$connection = mysql_connect(«localhost»,»username»,»userpassword»);
if(!$connection) die(“Ошибка доступа к базе данных.
Приносим свои извинения”);
//Выбираем базу данных SalesDept (Отдел продаж)
//В случае ошибки формируем сообщение, записываем его в файл
//и отправляем по электронной почте
if(!mysql_select_db(“SalesDept”))
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno.» «.mysql_error.»\r\n»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»admin@somedomain.ru»);
die(“Ошибка доступа к базе данных. Приносим свои извинения”);
}
//Устанавливаем кодировку CP-1251
mysql_query(«SET NAMES cp1251»);
//Записываем данные о заказчике в таблицу Customers (Клиенты)
$qresult = mysql_query(«INSERT INTO Customers (name,phone,address)
VALUES
(\'».$name.»\',\'».$phone.»\',\'».$address.»\')»);
//Проверяем результат выполнения команды; в случае ошибки формируем //
сообщение, записываем его в файл и отправляем по электронной почте
if(!$qresult)
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno.» «.mysql_error.»\r\n»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»admin@somedomain.ru»);
die(“Ошибка при сохранении данных. Приносим свои извинения”);
}
print “<h3>Поздравляем! Регистрация завершена успешно</h3>”;
}
?>
</body>
</html>Если, например, в форме были введены значения полей Иванов, 157400 и Москва, а/я 255, то вызов функции
$qresult = mysql_query(«INSERT INTO Customers
(name,phone,address)
VALUES
(\'».$name.»\',\'».$phone.»\',\'».$address.»\')»);после подстановки значений переменных $name, $phone и $address будет выглядеть следующим образом:
$qresult = mysql_query(«INSERT INTO Customers
(name,phone,address)
VALUES
(\'Иванов\',\'157400\',\'Москва, а/я 225\')»);Если команда INSERT была выполнена успешно, то сценарий save.php выведет на странице соответствующее сообщение (рис. 4.14).
Мы почти завершили создание приложения, которое записывает информацию в базу данных. Однако нужно сделать важное дополнение, связанное с некорректным сохранением значений, содержащих спецсимволы. Предположим, например, что пользователь вводит на веб-странице в поле Ваше имя значение д\'Артаньян. Тогда вызов PHP-функции
mysql_query(“INSERT INTO Customers (name,phone,address)
VALUES
(\'”.$name.”\',\'”.$phone.”\',\'”.$address.”\')”);приведет к попытке выполнения некорректной SQL-команды
INSERT INTO Customers
(name,phone,address)
VALUES (\'д\'Артаньян\',\'Телефон\',\'Адрес\');В результате произойдет ошибка и сохранить в базе введенные пользователем данные не удастся. Избежать этой ошибки можно с помощью функции
mysql_real_escape_string(«<Строка>»[, <Указатель на соединение>]);
Функция mysql_real_escape_string экранирует строку, полученную в качестве аргумента, то есть перед каждым специальным символом в этой строке (например, перед одинарной кавычкой) помещает обратную косую черту. Например, если в качестве аргумента передана строка д\'Артаньян, то функция возвращает значение д\\'Артаньян. Таким образом, при вызове PHP-функции
mysql_query(“INSERT INTO Customers (name,phone,address)
VALUES
(\'”.mysql_real_escape_string($name).”\',
\'”.mysql_real_escape_string($phone).”\',
\'”.mysql_real_escape_string($address).”\')”);будет выполнена корректная SQL-команда
INSERT INTO Customers
(name,phone,address)
VALUES (\'д\\'Артаньян\',\'Телефон\',\'Адрес\');Кроме того, в ряде случаев функция mysql_real_escape_string позволяет обезопасить PHP-приложение от SQL-инъекций, то есть предотвратить выполнение SQL-команд, которые недобросовестный пользователь может ввести в текстовые поля на веб-странице.
Исправим сценарий save.php, добавив вызов функции mysql_real_escape_string (листинг 4.9).
Листинг 4.9. Сохранение данных в базе<html>
<head>
<title>Работа с MySQL</title>
</head>
<body>
<?php
//Отключаем вывод системных сообщений об ошибках
error_reporting(0);
//Получаем данные из формы input.php
$phone=$_POST[“CustomerPhone”];
//Если номер телефона не введен, то связаться с клиентом невозможно.
//Предлагаем клиенту вернуться к заполнению формы
if(empty($phone) or ($phone == «(495)»))
{
print “<h3>Пожалуйста, введите номер телефона</h3>”;
print “<input type=\'button\' value=\'Вернуться к редактированию данных\'
onClick=\'history.go(-1)\'”;
}
//Если номер телефона введен, продолжаем обработку данных
else
{
//Получаем из формы имя и адрес клиента
$name=$_POST[«CustomerName»];
$address=$_POST[«CustomerAddress»];
//Соединяемся с сервером MySQL
$connection = mysql_connect(«localhost»,»username»,»userpassword»);
if(!$connection) die(“Ошибка доступа к базе данных.
Приносим свои извинения”);
//Выбираем базу данных SalesDept (Отдел продаж)
//В случае ошибки формируем сообщение, записываем его в файл
//и отправляем по электронной почте
if(!mysql_select_db(“SalesDept”))
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno.» «.mysql_error.»\r\n»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»admin@somedomain.ru»);
die(“Ошибка доступа к базе данных. Приносим свои извинения”);
}
//Устанавливаем кодировку CP-1251
mysql_query(«SET NAMES cp1251»);
//Записываем данные о заказчике в таблицу Customers (Клиенты)
$qresult = mysql_query(«INSERT INTO Customers (name,phone,address)
VALUES
(\'».mysql_real_escape_string($name).»\',
\'».mysql_real_escape_string($phone).»\',
\'».mysql_real_escape_string($address).»\')»);
//Проверяем результат выполнения команды; в случае ошибки формируем //
сообщение, записываем его в файл и отправляем по электронной почте
if(!$qresult)
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno.» «.mysql_error.»\r\n»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»admin@somedomain.ru»);
die(“Ошибка при сохранении данных. Приносим свои извинения”);
}
print “<h3>Поздравляем! Регистрация завершена успешно</h3>”;
}
?>
</body>
</html>На этом мы завершаем изучение PHP-функций, позволяющих организовать обмен данными с MySQL. В завершение кратко обобщим изложенные выше сведения.
Итоги
В разделе 4.1 «Интерфейс с PHP» вы познакомились с примерами PHP-приложений, использующих базу данных MySQL. Все они имеют сходную структуру:
• подключение к серверу MySQL;
• выбор базы данных;
• установка кодировки;
• выполнение SQL-команды (ввод, изменение или получение данных);
• обработка ошибки.
При этом мы рассмотрели только самые необходимые для взаимодействия с MySQL функции языка PHP. Полный список этих функций вы можете найти в Руководстве по PHP на странице http://www.php.net/manual/ru/ref.mysql.php.
В следующем разделе мы поговорим о том, как взаимодействуют с базой данных веб-приложения на языке Perl.
4.2. Интерфейс с Perl
В этом разделе мы рассмотрим процесс создания веб-приложения на языке Perl, выполняющего получение информации из базы данных и запись ее в базу.
Выбор платформы для развертывания Perl-приложения аналогичен выбору платформы для PHP-приложения: вы можете воспользоваться хостингом с поддержкой Perl и MySQL либо установить на своем компьютере веб-сервер Apache и интерпретатор языка Perl. При этом все замечания и рекомендации из подраздела «Выбор платформы» остаются в силе.
В последующих примерах мы будем использовать пакет XAMPP, установку которого мы описывали в подразделе «Установка пакета XAMPP». Кроме того, нам потребуются дополнительные модули Perl DBI (Database Interface – интерфейс к базе данных) и Perl CGI (Common Gateway Interface – стандартный интерфейс между сценарием и веб-сервером). Об их установке вы узнаете из следующего подраздела.