Чтение онлайн

на главную

Жанры

MySQL 5.0. Библиотека программиста

Гольцман Виктор

Шрифт:

mysql_fetch_assoc(<Указатель на результат запроса>)

или

mysql_fetch_array(<Указатель результат запроса>)

Функция mysql_fetch_assoc получает очередную строку из результата запроса и возвращает ее в виде ассоциативного массива. Иными словами, вы получаете возможность работать со значениями в строке, используя для доступа к ним названия столбцов.

Проиллюстрируем работу этой функции на примере вывода списка товаров, то есть данных из таблицы Products (Товары). Добавим в сценарий output.php вызов функций mysql_query и mysql_fetch_assoc (листинг 4.4).

Листинг 4.4. Получение информации и отображение ее на странице

<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_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>

В этом примере функция mysql_query выполняет запрос SELECT * FROM Products;, а функция mysql_fetch_assoc в цикле while преобразует каждую из строк, полученных запросом, в массив $product. Затем мы извлекаем элементы массива $product с именами description (наименование), details (описание) и price (цена), что соответствует значениям в столбцах description, details и price таблицы Products (Товары).

После обновления страницывы увидите следующий результат (рис. 4.11).

Рис. 4.11. Отображение полученной информации на странице

Полезно также изучить HTML-код этой страницы (в Internet Explorer для этого нужно нажать кнопку Страница и в появившемся меню выбрать пункт Просмотр HTML-кода). Вы увидите результат работы цикла while и, в частности, значения элементов массива (рис. 4.12).

Рис. 4.12. HTML-код страницы

В некоторых случаях вместо названий элементов массива удобнее использовать числовые индексы. Например, если в результате запроса присутствуют несколько столбцов с одинаковыми именами (это возможно в случае получения информации из нескольких таблиц), то функция 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 «\n<tr><td>{$product[1]}</td>

<td>{$product[2]}</td>

<td>{$product[3]}</td></tr>\n»;

}

?>

</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.»\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 показана веб-страница, сгенерированная этим кодом.

Рис. 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).

Рис. 4.14. Результат сохранения данных

Мы почти завершили создание приложения, которое записывает информацию в базу данных. Однако нужно сделать важное дополнение, связанное с некорректным сохранением значений, содержащих спецсимволы. Предположим, например, что пользователь вводит на веб-странице в поле Ваше имя значение д\'Артаньян. Тогда вызов PHP-функции

Поделиться:
Популярные книги

Ведьма

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.54
рейтинг книги
Ведьма

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Большая игра

Ланцов Михаил Алексеевич
4. Иван Московский
Фантастика:
альтернативная история
5.00
рейтинг книги
Большая игра

Хозяйка Междуречья

Алеева Елена
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Хозяйка Междуречья

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Жена моего брата

Рам Янка
1. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Жена моего брата

Генерал Империи

Ланцов Михаил Алексеевич
4. Безумный Макс
Фантастика:
альтернативная история
5.62
рейтинг книги
Генерал Империи

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Светлая ведьма для Темного ректора

Дари Адриана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Светлая ведьма для Темного ректора

Хроники разрушителя миров. Книга 8

Ермоленков Алексей
8. Хроники разрушителя миров
Фантастика:
фэнтези
5.00
рейтинг книги
Хроники разрушителя миров. Книга 8