Работа с базами данных. Начало
Автор: Дмитрий Лебедев
Источник: detail.phpclub.ru
Всё, что я могу сказать в качестве рекомендации к
использованию БД - это то, что жизнь без них - просто смерть!
База данных - луч exe-шного света в тёмном царстве обработки
данных интерпретируемой программой. База данных приносит
немножко головной боли, но снимает гораздо больше.
В качестве примера взят сервер баз данных MySQL (полагаю,
что освоив его, вы без большого труда освоите и другие.
Когда-нибудь я напишу и о них, если сам освою :).
Первый разговор пойдет о функциях PHP, используемых для
работы с MySQL. Итак, начнём.
1. Администрирование базы данных
Способы администрирования БД в порядке убывания
удобства:
- phpMyAdmin (весьма рекомендую!)
- Написать скрипт, который бы передёргивал базу (см.
пример)
- mysql.exe в пакете mysql
- mysql_manager.exe (там, вроде, как-то можно, только на
грани шаманства)
Особенно рекомендую первый способ. С ним не придётся
изучать запросы ALTER TABLE, ADD COLUMN и т.п. Я их не знаю до
сих пор. Тем более, что "такие вопросы, товарищ посол, с
кондачка не решаются" - когда вам понадобится автоматически
изменить структуру базы или таблицы? Пару слов о втором
способе. Это так сказать обходная технология, которую я
применял, не зная про phpMyAdmin и утилиту mysqldump. В
скрипте пишутся команды, удаляющие базу и создающие её вновь.
Когда-то помогало, но вообще это, ещё раз скажу, обходная
технология, "подпорка".
На будущее: если у вас будет несколько сайтов, использующих
БД, то хотя бы в пределах домашнего сервера создайте несколько
баз. Это облегчит работу серверу и исключит возможность
путаницы таблиц. В общем, правила работы с БД те же, что и с
сайтом - держать в отдельной директории от других.
2. Соединение с сервером БД
...осуществляется при помощи функции mysql_connect:
$connect = mysql_connect(<хост>, <логин>,
<пароль>); По умолчанию, на mysql-сервере в таблице
пользователей есть пользователь root, который может иметь
доступ только с localhost-а, то бишь с того же самого
компьютера, где стоит сервер mysql. ВНИМАНИЕ! "Иметь доступ с
localhost-а" значит, что доступ имеет ваш скрипт PHP, а вы
можете обращаться к нему с любого другого компьютера.
Что происходит, когда мы вызываем функцию mysql_connect? С
началом выполнения вашего скрипта, php выделяет в своей памяти
место для информации о нём и его переменных. В информации о
выполняемом скрипте хранится, в том числе, и информация о
соединениях с базами данных. Переменная $connect - грубо
говоря указатель на место, где данная информация хранится.
Переменная эта точно такая же, как и остальные - если вы
используете функции, то надо объявлять глобальные переменные,
чтобы обратиться к ней.
Почему вообще используется переменная? Это на случай, если
для работы вам необходимо использовать несколько серверов баз
данных (или, например, для обеспечения бОльшей безопасности вы
используете разные логины, у которых могут быть разные
привилегии). В таких случаях в каждом запросе нужна
определённость, по какому, так сказать, каналу идёт команда.
Но если вы используете только одно соединение, указывать его в
параметрах функций запросов (о них - ниже) не нужно - php
находит первое (и в данном случае единственное) установленное
соединение и использует его.
3. Запрос-выборка и
обработка результатов
Механизм работы функций запросов к БД такой же, как и у
функции соединения: функции передаются параметры запроса и
(если надо) соединения, а результат записывается в переменную:
$result = mysql_db_query(string
база данных, string запрос [, переменная соединения]);
или
$result = mysql_query(string запрос
[, переменная соединения]);
ВНИМАНИЕ! Чтобы использовать
функцию mysql_query, в которой база данных не указывается,
надо предварительно выбрать используемую базу данных:
mysql_select_db(string база
данных);
Теперь у нас есть переменная $result. Это указатель на
результат выполнения запроса. Там есть сколько-то строк
таблицы. Получить эти строки можно через функции
mysql_fetch_row и mysql_fetch_array:
echo "<table>";
while ($row = mysql_fetch_array($result))
echo "<tr><td>", $row["field1"], "</td><td>", $row["field2"], "</td></tr>";
echo "</table>";
Функция mysql_fetch_array выдаёт в указанную переменную (в
данном случае $row) массив, индексы которого - имена полей
(причём, если вы в списке полей запроса пишете table.field, то
индекс массива будет field). mysql_fetch_row выдаёт массив,
индексы которого - числа, начиная с 0.
Какой функцией лучше пользоваться? Если вы запрашиваете
звёздочку, т.е. все поля таблицы, а выводить поля нужно в
определённой последовательноси (когда, например, у таблицы
рисуется шапка), лучше пользоваться mysql_fetch_array. Если вы
запрашиваете одно-два-три поля, чётко зная их
последовательность, можно делать mysql_fetch_row - это
уменьшит объем кода программы.
4. Запросы-действия
Это команды DELETE и UPDATE. Подобные запросы - в "правах"
такие же, как и SELECT, поэтому отправка команды серверу
происходит тем же способом - mysql_query (mysql_db_query). Но
в данном случае функция не возвращает результата:
$result = mysql_query("SELECT * FROM sometable");
но
mysql_query("DELETE FROM sometable WHERE id=...");
Соответственно, если мы выполним запрос-выборку и не
запишем результат в переменную, данные не будут храниться
нигде.
5. Обработка ошибок запросов
Сообщение о последней ошибке можно получить через функцию
mysql_error:
echo "Ошибка базы данных. MySQL
пишет:", mysql_error();
Если результат функции пишется в переменную, можно
проверить её:
$result = mysql_query($request);
if (!$result)
echo "Ошибка базы данных. MySQL пишет:", mysql_error();
else {
echo "<table>";
while ($row = mysql_fetch_array($result))
echo "<tr><td>", $row["field1"], "</td><td>", $row["field2"], "</td></tr>";
echo "</table>";
};
Если в переменную не пишем, то так:
$request = "UPDATE (...)";
mysql_query($request);
if (!mysql_error())
echo "Обновление данных прошло успешно!";
else echo "Ошибка базы данных. MySQL пишет:", mysql_error();
Если запрос генерируется автоматически, можно выводить и
сам запрос (полезно создавать переменную, которая бы его
содержала, и использовать её в качестве параметра
функции).