Работа с MySQL (вывод данных из базы данных)
Для понимания этой главы от вас требуются крепкие знания языка SQL и принципов работы баз данных. Для начала создаем базу данных и таблицу. Входим в командную строку MySQL, и выполняем команды:
mysql > CREATE DATABASE mydb;
mysql> CREATE table employees
( id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT,
first varchar(20), last varchar(20), address varchar(255),
position varchar(50), PRIMARY KEY (id), UNIQUE id (id));
INSERT INTO employees VALUES
(1,'Bob','Smith','128 Here St, Cityname','Marketing Manager');
INSERT INTO employees VALUES
(2,'John','Roberts','45 There St ,Townville','Telephonist');
INSERT INTO employees VALUES
(3,'Brad','Johnson','1/34 Nowhere Blvd, Snowston','Doorman');
В результате у нас будет создана база данных mydb. В ней будет создана таблица employees (работники). И в эту таблицу будут вставлены три записи с данными о работниках. Для экспериментов с PHP и MySQL этого вполне достаточно.
Давайте выведем эти данные из базы данных в HTML-страницу. Для общения с MySQL из PHP понадобятся следующие функции.
int mysql_connect(string hostname, string username, string password);
Создать соединение с MySQL.
Параметры:
Hostname - имя хоста, на котором находится база данных.
Username - имя пользователя.
Password - пароль пользователя.
Функция возвращает параметр типа int, который больше 0, если соединение прошло успешно, и равен 0
в противном случае.
int mysql_select_db(string database_name, int link_identifier);
Выбрать базу данных для работы.
Параметры:
Database_name - имя базы данных.
link_identifier - ID соединения, которое получено в функции mysql_connect. (параметр необязательный,
если он не указывается, то используется ID от последнего вызова mysql_connect)
Функция возвращает значение true или false
int mysql_query(string query, int link_identifier);
Функция выполняет запрос к базе данных.
Параметры:
query - строка, содержащая запрос
link_identifier - см. предыдущую функцию.
Функция возвращает ID результата или 0, если произошла ошибка.
int mysql_result(int result, int i, column);
Функция возвращает значение поля в столбце column и в строке i.
int mysql_close(int link_identifier);
Функция закрывает соединение с MySQL.
Параметры:
link_identifier - см. выше.
Функция возвращает значение true или false
Создайте файл с расширением .htm3 и наберите в нем следующий текст:
<html>
<body>
<?php
$db = mysql_connect("mysql12.leaderhost.ru", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
printf("First Name: %s<br>\n", mysql_result($result,0,"first"));
printf("Last Name: %s<br>\n", mysql_result($result,0,"last"));
printf("Address: %s<br>\n", mysql_result($result,0,"address"));
printf("Position: %s<br>\n", mysql_result($result,0,"position"));
mysql_close($db);
?>
</body>
</html>
Теперь рассмотрим построчно, что происходит в этой программе. Функция mysql_connect() открывает связь с сервером баз данных MySQL. В качестве параметров мы указываем ей имя узла (mysql12.leaderhost.ru), на котором находится база данных, имя пользователя (root), под которым мы будем с ней работать, и пароль (в данном случае он пустой и потому не указывается).
Имя узла localhost означает, что сервер MySQL находится на той же машине, что и сам Web-сервер с PHP-движком. В принципе ничто не мешает вам (имея права) обратиться к серверу MySQL, который находится на соседней машине или вообще на другом конце земного шара. Такие эксперименты авторы данной книги уже проводили и весьма успешно. О способах построения приложений с использованием нескольких машин мы поговорим немного позже.
В результате выполнения этой функции получаем некое значение, которое присваиваем переменной $db. Эта переменная называется идентификатором соединения (см. выше описание синтаксиса). Соединившись с сервером выбираем базу данных, с которой будем работать (ведь на одном и том же сервере могут "крутиться" несколько баз данных). Это делается с помощью функции mysql_select_db(). В качестве параметров мы передаем название нужной нам базы данных и идентификатор соединения, полученный нами при выполнении предыдущей команды.
В результате выполнения функции mysql_select_db() мы получаем значение true или false. Если соединение с базой данных произошло успешно - true, если нет - false. Для того, чтобы наша программа-страница работала более интеллектуально, мы можем при желании проанализировать возвращаемое значение и если оно будет false, вывести хорошее информативное сообщение об ошибке. Как это делается, мы рассмотрим в других, более сложных примерах.
И наконец мы обращаемся к базе данных с запросом, написанным на языке SQL. Для этого служит функция mysql_query(). В качестве первого параметра мы передаем текст запроса, а в качестве второго - "скармливаем" идентификатор, полученный от выполнения функции mysql_connect().
Результаты выполнения функции mysql_query() - записи, удовлетворяющие нашему запросу - помещаем в переменную $result.
И наконец, с помощью функции mysql_result() извлекаем из результатов выполнения нашего запроса (т.е. переменной $result), первый ряд-запись (который имеет порядковый номер 0), и значение определенного поля (по его имени). Перебирая друг за другом записи от 0 до 2, мы выберем все записи, что хранятся в нашей маленькой базе данных.
Привести иллюстрацию исполнения данного кода
В данном коде в полной мере используется функция printf(), с которой мы знакомились в предыдущей главе. Для тех, кто когда-либо работал с языком Perl или C, строки с функцией printf покажутся весьма знакомыми.
Если говорить коротко, то в каждой приведенной выше строке комбинация символов "%s" обозначает, что вместо нее должна быть поставлена переменная, идущая во второй части выражения printf. Причем эта переменная должна быть переведена в тип "строковая переменная". Более подробное описание синтаксиса функции printf() читайте в руководстве по языку.
Вот так легко можно работать с базой данных в PHP.
В следующей главе мы познакомимся с более интеллектуальными, чем mysql_result(), функциями выборки данных из БД mysql_fetch_row() и mysql_fetch_array(), В дальнейшем мы рекомендуем пользоваться именно ими, как более быстрыми и удобными, чем mysql_result().
Александр Качанов (kachanov@ogs.gomel.by)
Вадим Ткаченко (vvtk@stealthcomp.com) (http://web.stealthcomp.com)
Андрей Головин (mine@convex.ru) (http://exper.ural.ru)