Функции соединения с сервером MySQL
Основной функцией для соединения с сервером MySQL является
mysql_connect(), которая подключает скрипт к серверу баз данных MySQL и
выполяет авторизацию пользователя базой данных. Синтаксис у данной
функции такой:
mysql_connect ([string $hostname] [, string $user] [, sting $password]);
Как вы наверно заметили, все параметры данной функции являются
необязательными, поскольку значения по умолчанию можно прописать в
конфигурационном файле php.ini.
Если вы хотите указать другие имя MySQL-хоста, пользователя и пароль,
вы всегда можете это сделать. Параметр $hostname может быть указан в
виде: хост:порт.
Функция возвращает идентификатор (типа int) соединения, вся дальнейщая работа осуществляется только через этот идентификатор. При следующем вызове функции mysql_connect() с теми же параметрами новое соединение не будет открыто, а функция возвратит идентификатор существующего соединения.
Для закрытия соединения предназначена функция mysql_close(int $connection_id).
Вообще, соединение можно и не закрывать - оно будет закрыто
автоматически при завершении работы PHP скрипта. Если вы используете
более одного соединения, при вызове mysql_close()
нужно указать идентификатор соединения, которое вы хотите закрыть.
Вообще не закрывать соединения - плохой стиль, лучше закрывать
соединения с MySQL самостоятельно, а не надеясь на автоматизм PHP, хотя
это ваше право.
Если вы будете использовать только одно соединение с базой данных
MySQL за все время работы сценария, можно не сохранять его
идентификатор и не указывать идентификатор при вызове остальных функций.
Функция mysql_connect() устанавливает обыкновенное соединение с MySQL. Однако, PHP поддерживает постоянные соединения - для этого используйте функцию mysql_pconnect(). Аргументы этой функции такие же, как и у mysql_connect().
В чем разница между постоянным соединением и обыкновенным
соединением с MySQL? Постоянное соединение не закрывается после
завершения работы скрипта, даже если скрипт вызвал функцию mysql_close().
Соединение привязывается к PID потомка веб сервера Apache (от имени
которого он и работает) и закрывается лишь тогда, когда удаляется
процесс-владелец (например, при завершении работы или перезагрузке
веб-сервера Apache).
PHP работает с постоянными соединениями примерно так: при вызове функции mysql_pconnect()
PHP проверяет, было ли ранее установлено соединение. Если да, то
возвращается его идентификатор, а если нет, то открывается новое
соединение и возвращается идентификатор.
Постоянные соединения позволяют значительно снизить нагрузку на
сервер, а также повысить скорость работы PHP скриптов, использующих
базы данных.
При работе с постоянными соединениями нужно следить, чтобы
максимальное число клиентов Apache не преывшало максимального числа
клиентов MySQL, то есть параметр MaxClient (в конфигурационном файле Apache - httpd.conf) должен быть меньше или равен параметру max_user_connection (параметр MySQL).
Функция выбора базы данных
Функция mysql_select_db (string $db [, int $id])
выбирает базу данных, с которой будет работать PHP скрипт. Если открыто
не более одного соединения, можно не указывать параметр $id.
// Попытка установить соединение с MySQL:
if (!mysql_connect($server, $user, $ password)) {
echo "Ошибка подключения к серверу MySQL";
exit;
}
// Соединились, теперь выбираем базу данных:
mysql_select_db($db);
Функции обработки ошибок
Если произойдет ошибка соединения с MySQL, то вы получите
соответствующее сообщение и скрипт завершит свою работу. Это не всегда
бывает удобно, прежде всего, при отладке скриптов. Поэтому, в PHP есть
следующие две функции:
- mysql_errno(int $id);
- mysql_error(int $id);
Первая функция возвращает номер ошибки, а вторая - сообщение об ошибке. В результате мы можем использовать следующее:
echo "ERROR ".mysql_errno()." ".mysql_error()."\n";
Теперь вы будете знать, из-за чего произошла ошибка - вы увидите соответствующим образом оформленное сообщение.
Функции выполнения запросов к серверу баз данных
Все запросы к текущей базе данных отправляются функцией mysql_query().
Этой функции нужно передать один параметр - текст запроса. Текст
запроса модет содержать пробельные символы и символы новой строки (\n).
Текст должен быть составлен по правилам синтаксиса SQL. Пример запроса:
$q = mysql_query("SELECT * FROM mytable");
Приведенный запрос должен вернуть содержимое таблицы mytable. Результат запроса присваивается переменной $q. Результат - это набор данных, который после выполнения запроса нужно обработать определенным образом.
Функции обработки результатов запроса
Если запрос, выполненный с помощью функции mysql_query() успешно выполнился, то в результате клиент получит набор записей, который может быть обработан следующими функциями PHP:
- mysql_result() - получить необходимый элемент из набора записей;
- mysql_fetch_array() - занести запись в массив;
- mysql_fetch_row() - занести запись в массив;
- mysql_fetch_assoc() - занести запись в ассоциативный массив;
- mysql_fetch_object() - занести запись в объект.
Также можно определить количество содержащихся записей и полей в результате запроса. Функция mysql_num_rows() позволяет узнать, сколько записей содержит результат запроса:
$q = mysql_query("SELECT * FROM mytable");
echo "В таблице mytable ".mysql_num_rows($q)." записей";
Запись состоит из полей (колонок). С помощью функции mysql_num_fields() можно узнать, сколько полей содержит каждая запись результата:
$q = mysql_query("SELECT * FROM mytable");
echo "В таблице mytable ".mysql_num_fields($q)." полей ";
У нас также есть возможность узнать значение каждого поля. Это можно сделать с помощью следующей функции:
mysql_result (int $result, int $row, mixed $field);
Параметр функции $row задает номер записи, а параметр $field - имя или порядковый номер поля.
Предположим, SQL-запрос вернул следующий набор данных:
Email Name Last_Name
------------------------------------
ivanov@mail.ru Ivan Ivanov
petrov@mail.ru Petr Petrov
Вывести это в браузер можно следующим образом:
$rows = mysql_num_rows($q);
$fields = mysql_num_fields($q);
echo "<pre>";
for ($c=0; $c<$rows; $c++) {
for ($cc=0; $cc<$fields; $cc++) {
echo mysql_result($q, $c, $cc)."\t";
echo "\n";
}
}
echo "</pre>";
Следует отметить, что функция mysql_result()
универсальна: зная количество записей и количество полей, можно
"обойти" весь результат, но в тоже время, скорость работы данной
функции достаточно низка. Поэтому, для обработки больших наборов
записей рекомендуется использовать функции mysql_fecth_row(), mysql_fecth_array(), и.т.д.
Функция mysql_fecth_row(int $res) получает сразу всю строку, соответствующую текущей записи результата $res.
Каждый следующий вызов функции перемещает указатель запроса на
следующую позицию (как при работе с файлами) и получает следующую
запись. Если более нет записей, то функция возвращает FALSE. Пример
использования данной функции:
$q = mysql_query("SELECT * FROM mytable WHERE month=\"$db_m\" AND day=\"$db_d\");
for ($c=0; $c<mysql_num_rows($q); $c++) {
$f = mysql_fetch_row($q);
echo $f;
}
Использовать функцию mysql_fecth_row() не всегда удобно, так как значения всех полей одной записи находятся все в одной строке. Удобнее использовать функцию mysql_fetch_array(), которая возвращает ассоциативный массив, ключами которого будут имена полей.
Функция mysql_fecth_array(int $res [, int $result_type])
возвращает не ассоциативный массив, а массив, заданный необязательным
параметром $result_type, который может принимать следующие значения:
- MYSQL_ASSOC - возвращает ассоциативный массив;
- MYSQL_NUM -возвращает массив с числовыми индексами, как в функции mysql_fecth_row();
- MYSQL_BOTH
- возвращает массив с двойными индексами, то есть вы можете работать с
ним, как с ассоциативным массивом и как со списком (MYSQL_BOTH - это
значение по умолчанию для параметра $result_type.
В PHP есть функция, возвращающая ассоциативный массив с одним индексом:
mysql_fetch_assoc(int $res);
Фактически, данная функция является синонимом для mysql_fetch_array($res, MYSQL_ASSOC);
Пример использования функции mysql_fecth_array():
$q = mysql_query("SELECT * FROM mytable WHERE month=\"$db_m\" AND day=\"$db_d\");
for ($c=0; $c<mysql_num_rows($q); $c++)
{
$f = mysql_fetch_array($q);
echo "$f[email] $f[name] $f[month] $f[day] <br>";
}
Как видно, использовать функцию mysql_fetch_array() намного удобнее, чем mysql_fetch_row().
Функции получения информации о результатах SQL-запросов
PHP предоставляет еще несколько полезных функций, которые позволяют узнать информацию о результах SQL-запросов.
- Функция mysql_field_name(int $result, int $offset)
возвращает имя поля, находящегося в результате $result с номером
$offset (нумерация начинается с 0). Другими словами, функция возвращает
имя поля с номером $offset.
- Функция mysql_field_type(int $result, int $offset) возвращает тип поля с номером $offset в результате $result (номер задается относительно результата, а не таблицы);
- Функция mysql_field_flags(int $result, int $offset)
возвращает пречисленные через пробел флаги (модификаторы), которые
имеются у поля с номером $offset. Перечислим все поддерживаемые MySQL
флаги:
Флаг |
Описание |
not_Null |
Поле не может содержать неопределенного значения (NULL), то есть поле должно быть явно инициализировано |
Primary_Key |
Поле будет первичным ключом - идентификатором записи, по которому можно однозначно идентифицировать запись; |
auto_increment |
При
вставке новой записи значение этого поля будет автоматически увеличено
на единицу, потому в таблице никогда не будет двух записей с одинаковым
значением этого поля; |
Unique_Key |
Поле должно содержать уникальное значение; |
Multiple_Key |
Индекс |
Blob |
Поле может содержать бинарный блок данных |
Unsigned |
Поле содержит беззнаковые числа |
Zerofill |
Вместо пробелов используются символы с кодом \0 |
Binary |
Поле содержит двоичные данные |
enum |
Поле может содержать один элемент из нескольких возможных (элемент перечисления) |
timestamp |
В поле автоматически заносится текущая дата и время при его модификации |
Функция mysql_field_flags() возвращает флаги в виде строки, в которой флаги разделяются пробелами.
Практический пример использования функций PHP-MySQL
Скрипт вывода содержимого таблицы MySQL в виде HTML:
<?php
$host = "localhost";
$user = "user";
$password = "secret_password";
// Производим попытку подключения к серверу MySQL:
if (!mysql_connect($host, $user, $password))
{
echo "<h2>MySQL Error!</h2>";
exit;
}
// Выбираем базу данных:
mysql_select_db($db);
// Выводим заголовок таблицы:
echo "<table border=\"1\" width=\"100%\" bgcolor=\"#FFFFE1\">";
echo "<tr><td>Email</td><td>Имя</td><td>Месяц</td>";
echo "<td>Число</td><td>Пол</td></tr>";
// SQL-запрос:
$q = mysql_query ("SELECT * FROM mytable");
// Выводим таблицу:
for ($c=0; $c<mysql_num_rows($q); $c++)
{
echo "<tr>";
$f = mysql_fetch_array($q);
echo "<td>$f[email]</td><td>$f[name]</td><td>$f[month]</td>";
echo "<td>$f[day]</td><td>$[s]</td>";
echo "</tr>";
}
echo "</table>";
?>
|