Работа с базами данных. Начало.
Для чего и как использовать базу данных. Основные функции.
Всё, что я могу сказать в качестве рекомендации к использованию
БД - это то, что жизнь без них - просто смерть! База данных - луч
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();
Если запрос генерируется автоматически, можно выводить и сам
запрос (полезно создавать переменную, которая бы его содержала, и
использовать её в качестве параметра функции).
|