формируем //
сообщение, записываем его в файл и отправляем по электронной почте
if(!$qresult)
{
$err_message=date(«Y.m.d H:i:s»).»
«.mysql_errno().» «.mysql_error().»
»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»[email protected]»);
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).
Рис. 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().»
»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»[email protected]»);
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().»
»;
error_log($err_message,3,»/mysqlerror.log»);
error_log($err_message,1,»[email protected]»);
die(“Ошибка при сохранении данных. Приносим свои извинения”);
}
print “<h3>Поздравляем! Регистрация завершена успешно</h3>”;
}
?>
</body>
</html> На этом мы завершаем изучение PHP- функций, позволяющих организовать обмен данными с MySQL. В завершение кратко обобщим изложенные выше сведения.