Например, если в результате запроса присутствуют несколько столбцов с одинаковыми именами (это возможно в случае получения информации из нескольких таблиц), то функция mysql_fetch_assoc() предоставляет доступ только к последнему из этих столбцов. Избежать этого позволяет функция mysql_fetch_array().
Функция mysql_fetch_array() возвращает как ассоциативный массив, так и массив с числовыми индексами. Таким образом, вы можете обращаться к значению, хранящемуся в строке, используя либо имя столбца, либо порядковый номер столбца в результате запроса. Например, код, представленный в листинге 4.4, можно переписать следующим образом (листинг 4.5).
Листинг 4.5. Получение информации и отображение ее на странице
<html>
<head>
<title>Работа с MySQL</title>
</head>
<body>
<h1>Список товаров</h1>
<!– Выводим список товаров –>
<table>
<!– Выводим заголовок списка товаров –>
<tr>
<th>Наименование</th>
<th>Описание</th>
<th>Цена</th>
</tr>
<?php
//Соединяемся с сервером MySQL
$connection = mysql_connect («localhost»,»username»,»userpassword»);
if(!$connection) die(“Ошибка доступа к базе данных.
Приносим свои извинения”);
//Выбираем базу данных SalesDept (Отдел продаж)
if(!mysql_select_db(«SalesDept»))
die (“База данных отсутствует. Приносим свои извинения”);
//Устанавливаем кодировку CP-1251
mysql_query(“SET NAMES cp1251”);
//Получаем список товаров
$qresult = mysql_query(«SELECT * FROM Products»);
if(!$qresult) die(“Ошибка доступа к базе данных.
Приносим свои извинения”);
//Очередную строку из результата запроса (информацию о товаре)
// записываем в массив $product
while ($product=mysql_fetch_array($qresult))
{
//выводим элементы массива $product с номерами 1, 2, 3
print «
<tr><td>{$product[1]}</td>
<td>{$product[2]}</td>
<td>{$product[3]}</td></tr>
»;
}
?>
</table>
</body> Результат выполнения приложения при этом не изменится.
Итак, мы рассмотрели функции, обеспечивающие получение данных из базы и работу с этими данными. Однако при выполнении запросов к базе данных возможно возникновение ошибок. Чтобы устранить эти ошибки, необходимо иметь подробную информацию о них. В следующем подразделе мы рассмотрим этот вопрос подробнее.
Обработка ошибок
Для получения сведений о возникшей ошибке взаимодействия с базой данных предназначены функции
mysql_error([<Указатель на соединение>])
и
mysql_errno([<Указатель на соединение>])
Функция mysql_error() возвращает описание ошибки, произошедшей при выполнении последней SQL-команды (или пустую строку, если команда была выполнена успешно). Функция mysql_errno () возвращает код ошибки, произошедшей при выполнении последней SQL-команды (или 0, если команда была выполнена успешно).
Значения, возвращаемые функциями mysql_error() и mysql_errno(), как и системные сообщения об ошибках, нежелательно отображать на веб-странице, чтобы не раскрывать информацию об архитектуре приложения. Вместо этого рекомендуется записывать сведения об ошибке в файл или отсылать по электронной почте разработчику или администратору приложения.
Чтобы отключить вывод системных сообщений об ошибках, добавьте в код приложения вызов функции
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().»
»;
error_log ($err_message,3,»/mysqlerror.log»);
error_log ($err_message,1,»[email protected]»);
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().»
»;
error_log ($err_message,3,»/mysqlerror.log»);
error_log ($err_message,1,»[email protected]»);
die(“Ошибка доступа к базе данных. Приносим свои извинения”);
}
//Очередную строку из результата запроса (информацию о товаре)
// записываем в ассоциативный массив $product