Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web - tec / PHP 5 для начинающи

.pdf
Скачиваний:
73
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

Введение в базы данных и SQL 393

Вывод команды описывает структуру таблицы user ++++++ какие поля определены и как они сконфигурированы. Например, из распечатки ясно, что в поле Host могут хранить+ ся значения длиной не более 60 символов и что это поле определено в качестве первич+ ного ключа. Поле User также определено как первичный ключ. Это не означает, что оба эти поля являются первичными ключами (это не допускается). Просто комбина+ ция полей Host и User работает в качестве первичного ключа в формате Host+User.

Например, если пользователю john на узле localhost даны права доступа к серве+ ру, то для его записи значением первичного ключа становится строка localhost-john. Записать в данную таблицу еще одного пользователя с именем john на узле localhost невозможно, но можно записать пользователя john на узле whatever.com.

Все поля в таблице user, кроме Host, User и Password, объявлены как ENUM(‘N’, ‘Y’). Это означает, что во всех этих полях может использоваться только одно значение из перечисленных в скобках (в данном случае N или Y). Необходимо отметить, что зна+ чением по умолчанию (когда значение не задано) будет буква N.

Использование SQL для просмотра данных

Все рассмотренные выше запросы к mysql+клиенту специфичны для СУБД MySQL и необязательно будут работать на других системах, поддерживающих SQL. Теперь, подойдя на шаг ближе к фактическим данным, можно использовать ‘‘настоящие’’ SQL+ операторы.

Предположим, что требуется выяснить, зарегистрированы ли в настоящий момент пользователи, имеющие привилегии для доступа с локальной машины localhost. Это можно сделать с помощью следующего SELECT+запроса:

mysql> SELECT User, Host FROM user;

+----------

+--------------

+

| User

| Host

+

+----------

+--------------

+

| root

|localhost

+

| dodge

|doggiesr

+

| james

|digistrawb

+

+------———-+—---------——--+ 3 rows in set (0.00 sec)

В запросе содержится лишь три записи, поэтому нетрудно заметить, что в текущий момент зарегистрирован только один локальный пользователь root. Конечно, выяс+ нить это будет сложнее при наличии нескольких сотен зарегистрированных пользо+ вателей, но на этот случай есть другой способ получения необходимого результата:

mysql> SELECT User FROM user WHERE Host='localhost';

+------------

 

+

| User

|

+------------

 

+

| root

|

+------------

 

+

1

row in set (0.00 sec)

Использование предложения WHERE сужает диапазон выбираемых записей. Это предложение работает подобно оператору if в PHP, кроме того, что в случае WHERE для проверки равенства используется один знак равенства (=), а не два (==), как в if.

Если требуется выбрать все доступные поля, а не несколько указанных, то можно использовать специальный символ *. Например:

mysql> SELECT * FROM tablename;

Данная команда выбирает все поля всех записей в таблице tablename.

394 Глава 9

Манипуляции данными

Создадим нового пользователя, вставив в таблицу user новую запись с помощью команды INSERT:

mysql> INSERT INTO user VALUES( -> 'localhost',

–> 'phpuser',

–> Password('phppass'),

–> 'N', 'N', 'N', 'N', 'N', 'N', 'N', –> 'N', 'N', 'N', 'N', 'N', 'N', 'N', –> 'N', 'N', 'N', 'N', 'N', 'N', 'N', –> 'N', 'N', 'N', 'N', 'N', 'N', 'N');

Query OK, 1 row affected (0.00 sec)

Данный INSERT+запрос создает в таблице user запись для пользователя phpuser, использующего пароль phppass, не предоставляя никаких прав доступа. Каждое строковое значение помещается между двумя одинарными кавычками (подробно этот момент обсуждается далее). Очевидно, что клиент mysql сообщает о том, что запрос был успешно выполнен и что была вставлена одна запись, как и ожидалось.

MySQL сохраняет пользовательские пароли, предварительно зашифровав их. Для шифрования паролей в MySQL используется собственная схема (которая отличается от схемы Linux) с применением встроенной MySQL+функции password().

Предположим теперь, что пользователю phpuser (который в данный момент не имеет прав доступа вообще) необходимо назначить административные права Reload_priv и Shutdown_priv. Обновить таблицу user можно с помощью следую+ щего UPDATE+запроса:

mysql> UPDATE user SET Reload_priv='Y', Shutdown_priv='Y' -> WHERE User='phpuser';

Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

Клиент mysql сообщает, что условию соответствовала только одна запись и что она была успешно обновлена. Теперь пользователь phpuser обладает некоторыми при+ вилегиями администратора сервера: ему разрешено только перезагружать и останав+ ливать сервер.

Предложение WHERE является необязательным и если оно опущено, то UPDATE+ запрос изменяет все записи в заданной таблице, используя при этом новые значения. Предупреждение: необходимо исключить случайное изменение записей. Ночной кошмар может стать реальностью, если невнимательно созданный UPDATE+запрос, например, обновит 10 000 пользовательских записей, назначив им один и тот же па+ роль. Еще хуже, если все записи в таблице будут случайно удалены в результате вы+ полнения следующего DELETE+запроса:

mysql> DELETE FROM test;

Query OK, 0 rows affected (0.00 sec)

Вданном случае были удалены все записи в таблице test. Отчет mysql может ввести

взаблуждение, поскольку сообщает, что запрос не затронул ни одной записи. На самом деле это не так. После выполнения запроса сервер не может определить количество за+ тронутых (удаленных) строк, так как в результате запроса они удаляются безвозвратно. Следует отметить, что в этом примере команда DELETE не содержала никаких предло+ жений. С помощью предложения WHERE можно точно указать удаляемые записи:

DELETE FROM имятаблицы WHERE условие(я);

Введение в базы данных и SQL 395

Предположим теперь, что пользователю phpuser необходимо предоставить все привилегии администратора сервера. Что для этого требуется? Можно создать другой UPDATE+запрос или с помощью REPLACE+запроса заменить целиком запись данного пользователя. В последнем случае синтаксис весьма прост:

mysql> REPLACE INTO user VALUES(

–> 'localhost', 'phpuser', Password('phppass'), –> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y',

–> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', –> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', –> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');

Query OK, 1 row affected (0.00 sec)

REPLACE+запрос заменяет старую запись новой. Обратите внимание, что и старая и новая записи должны иметь одинаковое значение в поле, которое определено как ключ (или в полях Host и User (в данном случае) для комбинированного ключа). Различие между командами UPDATE и REPLACE заключается в том, что UPDATE заменяет только выбранный набор полей в записи, а REPLACE заменяет всю запись новыми значениями.

Наконец, чтобы активизировать заново созданную учетную запись phpuser, необ+ ходимо обновить привилегии, перезагрузив информацию о них из таблицы. (Сервер обычно считывает информацию о привилегиях доступа только однажды при загруз+ ке.) Для этого сначала следует выйти из mysql+клиента, введя в командной строке ко+ манду quit (в противном случае программа выдаст сообщение о некорректном SQL+ синтаксисе). Затем можно ввести команду:

> mysqladmin -uUSER -pPASSWORD -hHOST flush-privileges

или после входа в mysql можно ввести команду FLUSH PRIVILEGES, чтобы изменения отразились в клиентской программе:

mysql> FLUSH PRIVILEGES;

Использование команд GRANT и REVOKE

Команды GRANT и REVOKE позволяют распределять и отменять привилегии на ис+ пользование баз данных. Указанные команды применимы на разных уровнях структу+ ры привилегий в СУБД: на глобальном уровне баз данных, на уровне таблиц, а также на уровне столбцов ++++++ в зависимости от того, насколько точный контроль необходим администратору. Естественно, любые права, предоставленные пользователю, можно отменить с помощью соответствующей команды REVOKE.

В последующих разделах показано, как использовать команды для управления пра+ вами доступа к таблицам. Например, в предыдущем разделе новый пользователь соз+ давался путем непосредственного внесения изменений в таблицу user. Той же цели можно достичь более простым способом, используя команду GRANT. Рассмотрим эту команду подробнее.

GRANT

Ниже представлена простейшая форма команды GRANT:

mysql> GRANT ALL PRIVILEGES ON *.* TO

-> phpuser@localhost IDENTIFIED BY 'phppass';

Данная команда предоставляет пользователю phpuser, использующему пароль phppass, на узле localhost все права доступа к каждой базе данных в системе. Обра+ тите внимание, что аргументы user и host указываются без кавычек.

396 Глава 9

Если требуется предоставить этому пользователю доступ только к таблицам базы данных test, команда будет выглядеть так:

mysql> GRANT ALL PRIVILEGES ON test.*

-> TO phpuser@localhost IDENTIFIED BY 'phppass';

Здесь запись test.* обозначает все таблицы в базе данных test. Аналогично, можно предоставлять доступ только к одной таблице в базе данных, например, к таб+ лице sample базы данных test:

mysql> GRANT ALL PRIVILEGES ON test.sample

-> TO phpuser@localhost IDENTIFIED BY 'phppass';

Заменив ключевые слова ALL PRIVILEGES перечнем типов запросов, можно пре+ доставить ограниченное множество привилегий доступа:

mysql> GRANT SELECT,INSERT,UPDATE ON test.* -> TO phpuser@% IDENTIFIED BY 'phppass';

Данная команда разрешает пользователю phpuser вводить только запросы SELECT, INSERT и UPDATE к любой таблице в базе данных test. Все остальные запро+ сы, такие как DELETE, не допускаются. Весьма полезны специальные символы, такие как *. Например, заменив localhost на специальный символ %, можно предоставить пользователю phpuser доступ к указанным таблицам с любого узла.

Узел также можно указать с помощью частично заданного имени домена: напри+ мер, с помощью записи phpuser@%.whatever.com можно предоставить доступ к серверу только пользователям с идентификатором phpuser, подключающимся с до+ мена whatever.com.

Можно еще точнее определить полномочия пользователя, указав поля, к которым пользователь может иметь доступ:

mysql> GRANT SELECT (User, Host) ON mysql.user

-> TO phpuser@localhost IDENTIFIED BY 'phppass';

В данном случае пользователь phpuser может вводить только SELECT+запросы на поля User и Host в таблице user.

Можно использовать предложение WITH GRANT OPTION. Оно позволяет предоста+ вить определенному пользователю возможность назначать другим пользователям лю+ бой уровень привилегий (в пределах разрешенных для него самого уровней):

mysql> GRANT ALL PRIVILEGES ON test.*

-> TO phpuser@localhost IDENTIFIED BY 'phppass' WITH GRANT OPTION;

Данная команда эквивалентна созданию другого суперпользователя с именем phpuser. Соблюдайте осторожность, используя предложение WITH GRANT OPTION: два пользователя с разными привилегиями, обменявшись ими, могут легко расширить свои привилегии.

REVOKE

Команда REVOKE отменяет привилегии определенного пользователя. Например, если требуется отменить все привилегии пользователя phpuser, то можно ввести сле+ дующую команду:

mysql> REVOKE ALL PRIVILEGES ON *.* FROM phpuser;

Можно указать несколько пользователей, разделяя их имена запятыми:

mysql> REVOKE ALL PRIVILEGES ON *.*

-> FROM phpuser@localhost, phpuser2, phpuser3;

Введение в базы данных и SQL 397

Команда будет работать верно только в том случае, когда все заданные пользовате+ ли существуют и указаны правильные привилегии.

Следующая команда отнимает у пользователя phpuser только право на ввод SELECT+запроса:

mysql> REVOKE SELECT ON *.* FROM phpuser@localhost;

Кроме того, можно задать необходимые имена полей:

mysql> REVOKE SELECT (User, Host) ON mysql.user FROM phpuser@localhost;

Если с помощью команд GRANT или REVOKE модифицируются таблицы привиле+ гий, то изменения вступают в действие немедленно. Обновлять привилегии или пере+ загружать сервер необязательно.

Подключение к базам данных MySQL из PHP-программ

Вернемся к PHP и рассмотрим возможность использования всей мощи баз данных в динамических Web+страницах, написанных на PHP.

На данной стадии запоминать все эти сложные SQL*операторы необязательно, как и разбираться во всех мельчайших деталях. В настоящий момент достаточно общего понимания методики и способов взаимодействия с реляционными базами данных, такими как MySQL. Гораздо более полное понимание всей специфики баз данных придет потом при разработке собственных приложений.

Подобно тому как для доступа к серверу баз данных MySQL требуется клиентская программа, PHP+программам требуется клиентский код для обмена данными с MySQL.

Во времена PHP4 осуществить это было нетрудно, поскольку весь необходимый код был интегрирован в сам PHP. К сожалению, теперь это не так, и PHP5 ожидает, что клиентские библиотеки MySQL с поддержкой PHP присутствуют в системе еще до компиляции PHP. Для Linux+пользователей эта проблема решается весьма просто: стоит лишь скомпилировать PHP5 с параметром --with-mysql.

Для Windows+пользователей дело обстоит несколько сложнее. Необходимо выпол+ нить следующие действия:

1.Убедиться, что библиотека libmysql.dll находится в корневом каталоге сис+ темы (libmysqli для версий MySQL 4.1 и выше).

2.Раскомментировать mysql+расширение в разделе расширений файла php.ini.

3.Убедиться, что файл php_mysql.dll находится в таком каталоге, который PHP может найти (параметр extension_dir в php.ini).

4.Перезапустить Web+сервер после внесения изменений.

Здесь нет ничего сложного ++++++ все делается так же, как и для других расширений в PHP. Теперь рассмотрим, как заставить PHP5 и MySQL обмениваться данными друг с другом.

Связь PHP и MySQL

Для работы PHP+программ с MySQL+сервером (или любой другой СУРБД) необхо+ димо выполнить следующие действия.

398 Глава 9

1.Открыть соединение с сервером.

2.Выполнить работу с базами данных на сервере.

3.Закрыть соединение.

Эта последовательность аналогична последовательности при работе с файлами и каталогами.

Основные функции соединения

Рассмотрим несколько базовых PHP+функций для работы с MySQL.

mysql_connect(): создает соединение с MySQL+сервером. Принимает три строковых аргумента: имя узла, имя пользователя базы данных и пароль поль+ зователя. Функция в случае успешного подключения к заданному MySQL+ серверу возвращает идентификатор соединения (или NULL в случае ошибки):

$link_id = mysql_connect("localhost", "phpuser", "phppass");

Идентификатор соединения работает во многом так же, как и дескриптор файла или каталога. Он используется позднее для ввода запросов. Все эти аргументы являются не+ обязательными, и если все они пропущены, то по умолчанию используются значение "localhost", пользовательское имя владельца Web+сервера и пустой пароль.

mysql_close(): соединение с MySQL+сервером закрывается после завершения ра+ боты сценария. Чтобы закрыть соединение раньше, необходимо использовать сле+ дующую функцию, передав ей в качестве аргумента идентификатор соединения:

mysql_close($link_id);

Функция возвращает true при успешном выполнении и false в случае ошибки. Если идентификатор соединения опущен, то используется открытое ранее соедине+ ние (если иное не оговорено особо, то все mysql_*+функции, принимающие необяза+ тельный аргумент идентификатора соединения, в случае отсутствия этого аргумента используют ранее открытое соединение).

mysql_list_dbs(): PHP+эквивалент MySQL+команды SHOW DATABASES. Един+ ственным аргументом (необязательным) является идентификатор соединения. Функция возвращает указатель ($result) на массив, содержащий имена дос+ тупных баз данных:

$result = mysql_list_dbs($link_id);

mysql_select_db(): используется для выбора базы данных и возвращает true при успешном выполнении и false, если возникла ошибка. В качестве аргумента данная функция принимает имя базы данных, хотя аргумент иден+ тификатора соединения является необязательным. Например:

mysql_select_db("mysql", $link_id);

Если соединение не было установлено заранее, то перед выбором заданной базы данных функция пытается установить соединение. Рассмотрим пример, который ил+ люстрирует подключение к локальному MySQL+серверу из PHP+программы с исполь+ зованием учетной записи, созданной ранее:

$link_id = mysql_connect("localhost", "phpuser", "phppass"); if(mysql_select_db("mysql", $link_id)) echo "Подключение к узлу localhost выполнено."; else die ("Подключение не состоялось.");

Введение в базы данных и SQL 399

Код устанавливает соединение с локальным MySQL+сервером и выбирает базу дан+ ных привилегий mysql. Если соединение установить не удалось, то отображается со+ ответствующее сообщение об ошибке.

mysql_list_tables(): эквивалент MySQL+команды SHOW TABLES. В качестве аргументов принимается имя базы данных и необязательный идентификатор соединения. Функция возвращает указатель на массив, содержащий имена дос+ тупных таблиц, связанных с этой базой данных:

$result = mysql_list_tables("mysql", $link_id);

mysql_num_rows(): используется для определения количества строк в резуль+ тирующем множестве, возвращаемом заданным запросом. В качестве аргумента функция принимает указатель на результирующее множество:

$num_rows = mysql_num_rows($result);

Эту функцию следует применять к результирующим множествам, возвращаемым SELECT+запросами и другими функциями, выбирающими записи баз данных.

mysql_affected_rows(): используется для получения количества записей, затронутых запросами INSERT, UPDATE или DELETE, вместо функции mysql_num_rows(). Аргументом данной функции является необязательный идентификатор соединения:

$num_rows = mysql_affected_rows($link_id);

DELETE*запрос без предложения WHERE удаляет все записи в заданной таблице и заставляет функцию mysql_affected_rows() возвращать нуль.

Возвращаемое функцией mysql_num_rows() или mysql_affected_rows()

значение фактически представляет собой количество выбранных/измененных записей. Возвращаемым значением функций mysql_list_dbs() и mysq_list_tables()

является указатель на результирующее множество.

mysql_fetch_row(): используется для выборки строк из возвращаемого серве+ ром результирующего множества. Функция принимает указатель на результи+ рующее множество, возвращенный предыдущим запросом, и возвращает массив, соответствующий выбранной строке (или false, если строк больше не осталось):

$fetched_row = mysql_fetch_row($result_set);

PHP создает внутренний указатель на строку, возвращенную предыдущим запро+ сом. Каждый последующий вызов данной функции передвигает этот указатель на сле+ дующую доступную строку. Когда указатель выходит за пределы результирующего множества, функция mysql_fetch_row() возвращает False.

Полный перечень MySQL+функций представлен в приложении B.

Практика Подключение к MySQL-серверу из PHP-программы

В следующем примере сценария, db_connect.php, используются упомянутые выше функции для перечисления доступных MySQL+пользователю phpuser баз дан+ ных и таблиц:

<?php

$link_id = mysql_connect("localhost", "phpuser", "phppass"); $result = mysql_list_dbs($link_id);

400 Глава 9

while($db_data = mysql_fetch_row($result)) { echo $db_data[0]. "<BR>";

$result2 = mysql_list_tables($db_data[0]); $num_rows = mysql_num_rows($result2); while($table_data = mysql_fetch_row($result2)) {

echo "--" . $table_data[0]. "<BR>";

}

echo "==> $num_rows таблиц в " . $db_data[0] . "<P>";

}

?>

Сценарий отображает все доступные базы данных и все таблицы в каждой из них; пример вывода:

mysql --columns_priv --db

--func --host --tables_priv --user

==> 6 table(s) in mysql test_db --sample_table1 --sample_table2

==> 2 table(s) in test_db

При использовании этих SQL+команд возможно появление сообщений об ошиб+ ках. Если это так, тогда следует еще раз прочесть разделы GRANT и REVOKE и предос+ тавить пользователю phpuser достаточные привилегии для просмотра таблиц в базах данных, а затем запустить сценарий снова. Полезные рекомендации также содержат+ ся в разделе по обработке ошибок.

Как это работает

Сначала сценарий устанавливает соединение с сервером, используя заданный на+ бор значений: localhost, phpuser и phppass. В случае использования других пара+ метров доступа данные значения следует заменить.

Идентификатор соединения, возвращаемый функцией mysql_connect(), ис+ пользуется функцией mysql_list_dbs(). Фактически передавать идентификатор соединения необязательно, поскольку mysql_list_dbs() в случае отсутствия аргу+ мента будет использовать последнее открытое соединение:

$result = mysql_list_dbs();

Весьма распространенной ошибкой является перезапись указателя результата при вводе другого запроса во время прохождения по результирующему множеству, воз+ вращенному предыдущим запросом. Подобно тому как можно открыть множество файлов, используя различные дескрипторы файлов, следует создавать несколько ре+ зультирующих множеств, назначая каждому из них уникальный указатель.

В данном случае для обработки результирующего множества, возвращенного функ+ цией mysql_list_dbs(), в сценарии используется цикл while. Еще один цикл while просматривает каждый элемент в результирующем множестве, возвращенном функцией mysql_list_tables(). Оба цикла завершаются, когда в результирующих множествах не остается строк, потому что переменные $db_data и $table_data равны False, ко+ гда функция mysql_fetch_row() заканчивает выборку возвращенных строк.

Введение в базы данных и SQL 401

while($db_data = mysql_fetch_row($result)) { echo $db_data[0]. "<BR>";

$result2 = mysql_list_tables($db_data[0]); $num_rows = mysql_num_rows($result2); while($table_data = mysql_fetch_row($result2)) {

echo "--" . $table_data[0]. "<BR>";

}

echo "==> $num_rows таблиц в " . $db_data[0] . "<P>";

}

Каждый из массивов, возвращенных функциями mysql_list_dbs() и mysql_ list_tables(), содержит только один элемент; имя базы данных $db_data[0] и имя таблицы $table_data[0] соответственно. Если нужно получить несколько полей из таблицы, то можно обратиться к каждому из них, используя соответствующий индекс:

$result_set = mysql_fetch_row($result); $first_column = $result_set[0]; $second_column = $result_set[1]; $third_column = $result_set[2];

Здесь не использовалась функция mysql_close(), она редко используется в ре+ альных приложениях, если нет необходимости по какой+либо причине закрывать со+ единение до завершения работы приложения. PHP автоматически закрывает откры+ тое соединение перед завершением работы сценария.

В последующих главах работа тандема MySQL+PHP рассматривается более подробно.

Обработка серверных ошибок

Теперь попытаемся заменить имя пользователя базы данных в последнем сцена+ рии на no_such_user. Если в файле php.ini не настроено подавление ошибок, то сценарий выдаст следующие сообщения:

Warning: MySQL Connection Failed: Access denied for user: 'no_such_user@local

host' (Using password: YES) in /home/apache/htdocs/db_connect.php on line 3

Предупреждение: ошибка подключения к MySQL: пользователю 'no_such_user@local host' отказано в доступе (использование пароля: да) файл

/home/apache/htdocs/db_connect.php строка 3

Warning: Supplied argument is not a valid MySQL-Link resource in /home/apache/

htdocs/db_connect.php on line 5

Предупреждение: неверная ссылка на MySQL-соединение файл /home/apache/ htdocs/db_connect.php строка 5

Warning: Supplied argument is not a valid MySQL result resource in /home/

apache/htdocs/db_connect.php on line 6

Предупреждение: неверная ссылка на MySQL-результат файл /home/apache/ htdocs/db_connect.php строка 6

Warning: Supplied argument is not a valid MySQL result resource in /home/

apache/htdocs/db_connect.php on line 8

Предупреждение: неверная ссылка на MySQL-результат файл /home/apache/ htdocs/db_connect.php строка 8

Почему появились подобные неинформативные сообщения? Все просто ++++++ только что созданный сценарий не способен определить, какие последствия повлекла за со+ бой ошибка; сценарий ‘‘знает’’ лишь то, что он попытался получить доступ к MySQL+ ресурсам, но потерпел неудачу. Сообщения генерируются PHP+интерпретатором, од+ нако ошибка возникла на сервере баз данных.

PHP представляет две функции, которые перехватывают серверные ошибки и оп+ ределяют, что произошло, используя значения от собственного обработчика ошибок

402 Глава 9

сервера. Если MySQL+сервер сталкивается с ошибкой при выполнении определенной задачи, то он возвращает текст и номер сообщения об ошибке. Эти значения можно получить с помощью PHP+функций mysql_errno() и mysql_error().

Функция mysql_errno() возвращает номер ошибки, а mysql_error() ++++++ текст ошибки от предыдущей MySQL+операции. Обе эти функции принимают в качестве ар+ гумента необязательный идентификатор соединения (по умолчанию ++++++ идентифика+ тор ранее открытого соединения):

$MYSQL_ERRNO = mysql_errno($link_id); $MYSQL_ERROR = mysql_error($link_id);

Упомянутые функции предполагают, что соединение с сервером уже установлено, поэтому если вызвать их, для того чтобы узнать, почему соединение не устанавливает+ ся, никакой информации об ошибках они не дадут, так как нет доступного открытого соединения. Однако, как уже было показано, можно использовать функцию die() для прерывания сценария и выдачи сообщения о неудачной попытке соединения:

if(!mysql_connect("localhost", "no_such_user", "phppass")) die("Подключение не установлено!");

Единственная проблема, связанная с данным подходом, заключается в том, что PHP при неудачной попытке подключения все равно выдает множество однотипных сооб+ щений об ошибках. Чтобы предотвратить появление предупреждений или/и сообще+ ний об ошибках, можно либо предварить вызов функции оператором @ (подавляющим сообщения об ошибках), либо использовать функцию error_reporting().

Функцию error_reporting() можно использовать для того, чтобы задать уровень отображения ошибок, который PHP применит к последующему коду. Вызов error_ reporting(0) гарантирует, что никаких PHP+сообщений об ошибках или предупре+ ждений не появится. Примеры использования этих функций рассматриваются далее.

Устанавливать высокий уровень отображения ошибок в реальной среде нежелательно, потому что предупреждения и ошибки могут отпугнуть пользователей. Высокий уровень рекомендуется использовать только для отладки приложения.

Практика Обработка серверных ошибок

Рассмотрим несколько функций, которые окажутся очень полезными в последующих разделах. Создайте файл с именем common_db.inc и введите в него следующий код:

<?php

$dbhost = 'localhost'; $dbusername = 'phpuser'; $dbuserpassword = 'phppass'; $default_dbname = 'mysql';

$MYSQL_ERRNO = ''; $MYSQL_ERROR = '';

function db_connect($dbname='') {

global $dbhost, $dbusername, $dbuserpassword, $default_dbname; global $MYSQL_ERRNO, $MYSQL_ERROR;

$link_id = mysql_connect($dbhost, $dbusername, $dbuserpassword); if(!$link_id) {

$MYSQL_ERRNO = 0;

Соседние файлы в папке web - tec