Анатолий Мотев СанктПетербург бхвпетербург 2006 удк 681 06 ббк 32. 973. 26018. 2 М85
Скачать 4.25 Mb.
|
Список читателей библиотеки#соединяемся с сервером $id_con=mysql_connect("localhost", "root", "") or die("Невозможно соединиться с сервером"); #выбираем БД mysql_select_db("library") or die("Невозможно выбрать БД"); #посылаем запрос $res_id=mysql_query("select * from reader") or die("Неверный запрос"); #обрабатываем результат while($mr=mysql_fetch_row($res_id)) { echo "$mr[1] "; } ×àñòü IV. PHP è MySQL 168 mysql_close($id_con); ?> Óðîê 15. Îòîáðàæåíèå è âñòàâêà äàííûõ 169 Рис. 15.1. Результат работы сценария Итак, выводить данные таблиц мы научились. Но этого не достаточно. Давайте создадим несложный web-интерфейс и на примере таблицы author посмотрим, как можно работать с данными БД. Для начала откройте текстовый редактор, наберите следующий код и сохра- ните его в файле с именем DBCONNECT.PHP в корневом каталоге сервера. $id_con=mysql_connect("localhost", "root", "") or die("Невозможно соединиться с сервером"); mysql_select_db("library") or die("Невозможно выбрать БД"); ?> Данный сценарий осуществляет соединение с сервером и выбирает БД или выводит сообщение об ошибке в случае неудачи. Этот файл будет подклю- чаться к остальным сценариям. Для начала создадим сценарий AUTHOR_LIST.PHP (листинг 15.2), который выберет фамилии всех авторов и сформирует на странице раскрывающийся список ( ×àñòü IV. PHP è MySQL 170 Листинг 15.2. Файл AUTHOR_LIST.PHP ?> $res_id=mysql_query("select * from author") or die(mysql_error()); #узнаем общее количество выбранных записей $num=mysql_num_rows($res_id); echo "Всего в базе: $num"; ?> Список авторовÓðîê 15. Îòîáðàæåíèå è âñòàâêà äàííûõ 171 Рис. 15.2. Список авторов Рис. 15.3. Результат изменений ×àñòü IV. PHP è MySQL 172 Листинг 15.3. Изменение кода предыдущего скрипта Теперь нужно реализовать обработку формы. В форму, как вы заметили, был добавлен параметр action="add_author.php" . Это сценарий, который будет запускаться при отправке формы и обрабатывать пришедшие данные, а именно — добавлять нового автора в таблицу. Наберите следующий код (листинг 15.4) и сохраните его в файле в корневом каталоге. Листинг 15.4. Обработка формы { $query="insert into author values('','".$_POST['new_author']."')"; if(mysql_query($query)) { echo "Запись добавлена"; } else { echo mysql_error(); } } ?> После добавления автора вы увидите сообщение "Запись добавлена". Верни- тесь в браузере на страницу AUTOR_LIST.PHP и нажмите кнопку Обновить. В раскрывающемся списке вы увидите добавленного автора (рис. 15.4). Óðîê 15. Îòîáðàæåíèå è âñòàâêà äàííûõ 173 Рис. 15.4. Просмотр результатов Как можно заметить, в обоих наших сценариях мы использовали функцию require() для подключения файла DBCONNECT.PHP (этот сценарий выпол- няет соединение с сервером и выбор БД). Таким образом, использование под- ключаемых файлов позволяет избежать многократного описания процесса подключения в каждом из создаваемых сценариев. Кроме того, это позволяет вносить глобальные изменения сразу во все сценарии, использующие данный файл (например, при изменении имени сервера). Кроме функции require() можно использовать функцию include(). Эти функции идентичны почти во всем, за исключением того, как они обрабаты- вают неудачное выполнение. Функция include() выводит на экран предупре- ждение ( Warning! ), а функция require() генерирует ошибку ( Fatal Error ). Другими словами, используйте функцию require() , если вам нужно, чтобы отсутствующий файл останавливал обработку страницы. В случае использо- вания функции include() скрипт все равно продолжит работу. Для вывода сообщений об ошибке мы использовали конструкцию die() . Она печатает сообщение об ошибке и завершает работу сценария. Также для за- вершения работы сценария можно использовать функцию exit() ÓÐÎÊ 16 Îáðàáîòêà ðåçóëüòàòîâ çàïðîñà Давайте рассмотрим в деталях процесс выполнения запроса к MySQL и обра- ботку результатов. Для отправки запроса мы использовали функцию mysql_query() и указывали в качестве аргумента SQL-запрос или перемен- ную, содержащую запрос: $result_id=mysql_query("запрос"); или $query="запрос"; $result_id=mysql_query($query); Эта функция возвращает идентификатор результирующего набора (при за- просе SELECT ) или значение FALSE в случае неудачи. Если использовались та- кие запросы, как DELETE , INSERT , UPDATE , REPLACE , функция возвращает значе- ние TRUE , если все прошло успешно, или значение FALSE при ошибке. Получе- ние значения TRUE после запроса на изменение данных еще не означает, что все в порядке. Допустим, мы написали следующий код: $result_id=mysql_query("delete from reader where id_reader=35"); if($result_id) { echo "Читатель с номером 35 удален"; } else { echo "Ошибка запроса"; } В данном случае оператор DELETE вернет значение TRUE , даже если ничего удалено не будет (читатель с таким номером не присутствует в таблице). По- этому данный код неверен. Перепишем его немного по-другому: Óðîê 16. Îáðàáîòêà ðåçóëüòàòîâ çàïðîñà 175 $result_id=mysql_query("delete from reader where id_reader=35"); if(!$result_id) { echo "Ошибка запроса"; } else if(mysql_affected_rows()<1) { echo "Запись с номером 35 не найдена"; } else { echo "Читатель с номером 35 удален"; } Здесь использована функция mysql_affected_rows() , которая возвращает ко- личество обработанных записей. Иногда начинающие программисты при работе с mysql_query() могут пола- гать, что возвращаемое значение является непосредственно данными или что это счетчик выбранных строк. И то и другое неверно. Получение данных после выполнения запроса SELECT производится при по- мощи функции mysql_fetch_row() по идентификатору результата. Есть и другие функции, получающие результат выборки (см. приложение 2). В случае если возникла ошибка, и функции был передан неверный идентифи- катор, вы увидите на экране примерно следующее: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in path/script_name.php on line n. Можно проверять идентификатор, прежде чем пытаться получить данные: $result_id=mysql_query("select * from reader"); if(!$result_id) { echo "Ошибка выполнения запроса"; } else { $num=mysql_num_rows($result_id); echo "Количество читателей: $num"; } Ошибка выполнения запроса может возникнуть, если: запрос содержит синтаксическую ошибку; выполняется бессмысленный запрос (например, попытка выборки данных из несуществующего поля); ×àñòü IV. PHP è MySQL 176 вы не имеете достаточных прав на выполнение данного запроса; по какой-то причине недоступен сервер MySQL. Для подавления ошибок в различных функциях вы можете использовать сим- вол '@' . Например: $connect_id=@mysql_connect("host", "login", "password"); Кроме этого есть возможность включения/выключения сообщений об ошиб- ках с помощью функции error_reporting() , позволяющей настроить обра- ботку ошибок. Существует несколько уровней обработки ошибок: E_ALL — все предупреждения и ошибки; E_ERROR — ошибки обычных функций; E_WARNING — предупреждения; E_PARSE — ошибки синтаксиса; E_NOTICE — замечания; E_CORE_ERROR — ошибки обработчика; E_CORE_WARNING — предупреждения обработчика; E_COMPILE_ERROR — ошибки времени трансляции; E_COMPILE_WARNING — предупреждения времени трансляции; E_USER_ERROR — ошибки, сгенерированные пользователем; E_USER_WARNING — предупреждения, сгенерированные пользователем; E_USER_NOTICE — замечания, сгенерированные пользователем. Для подавления вывода ошибок можно вызвать функцию error_reporting() так: error_reporting(E_PARSE | E_NOTICE); Отключать ошибки синтаксического анализатора не стоит, т. к. это усложнит исправление ваших SQL-запросов. А предупреждения E_NOTICE в большинст- ве случаев можно игнорировать. Для просмотра ошибки предназначена функция mysql_error() По окончании работы сценария вы можете очистить результирующий набор, вызвав функцию mysql_free_result() : mysql_free_result($result_id); На самом деле, PHP самостоятельно очищает память после завершения рабо- ты сценария. То есть использовать эту функцию целесообразно только при работе с большим количеством запросов или при запросах, возвращающих большое количество данных. Óðîê 16. Îáðàáîòêà ðåçóëüòàòîâ çàïðîñà 177 Давайте разберем еще пару сценариев. Создадим интерфейс для добавления и просмотра читателей, зарегистриро- ванных в библиотеке. Откройте текстовый редактор, наберите текст листин- га 16.1 и сохраните его в файле с именем READER_LIST.PHP в корневом ка- талоге (все скрипты, описанные в этой книге, вы сможете найти на сопрово- дительном компакт-диске книги). Листинг 16.1 |