ОДИН ИЗ СПОСОБОВ ИСПОЛЬЗОВАНИЯ INTERNET ТЕХНОЛОГИЙ APACHE+PHP+MYSQL ДЛЯ ОРГАНИЗАЦИИ ДОСТУПА К БАЗАМ ДАННЫХ

                                            А.А.МЯСИЩЕВ

В настоящее время многие предприятия, учреждения ведут работы по созданию компьютерного учета работающих сотрудников. Причем организация такого учета может проводиться как на локальном компьютере с локальной базой данных, к которой невозможен доступ со стороны других компьютеров (клиентов), так и на сервере, который обеспечивает коллективный доступ к базе данных с установленными привилегиями для различных групп пользователей. В связи с развитием internet технологий, основанных на протоколах TCP/IP, широкое распространение получила технология клиент – сервер. Согласно ей программа-клиент  формирует и направляет запрос серверу. Программа – сервер принимает запрос, обрабатывает его и направляет результат клиенту.   В качестве программы – сервера обычно рассматривают Web-сервер взаимодействующий с программой – сервером баз данных, которые могут располагаться либо на одном компьютере, либо на разных, соединенных intranet – сетью. В качестве программы – клиента обычно используют internet – броузер, например Netscape Communicator. Для организации взаимодействия Web – сервера и сервера баз данных, например MySQL, Oracle могут использоватьcя интерпретаторы Perl или PHP. Предположим, что в качестве Web – сервера используется Apache, сервера баз данных – MySQL, а взаимодействие между ними и интерактивность с клиентом организуется интерпретатором PHP4. В качестве примера организуем простейшую базу данных по учету сотрудников.
Рассмотрим последовательность установки Web-сервера Apache, интерпретатора PHP4.0,  SQL-сервера MySQL для ОС Unix FreeBSD-2.2.7(Версия, впрочем, старовата, но устойчиво работает на нашем компьютере!).
 Установка Apache и PHP-4.0.2. Копируем с http://httpd.apache.org/ и http://www.php.net/ файлы apache_1.3.6.tar.gz и php-4.0.2.tar.gz в один каталог.
Устанавливаем apache (с модулями proxy i speling):
$ gunzip apache_1.3.6.tar.gz
$ tar xvf apache_1.3.6.tar
$ cd apache_1.3.6
$ ./configure –enable-module=proxy --enable-module=speling
$ make
$ make install
$ cd ..
Устанавливаем php-4.0.2:
$ gunzip php-4.0.2.tar.gz
$ tar xvf php-4.0.2.tar
$ cd php-4.0.2
$ ./configure –with-apache=../apache_1.3.6 –enable-track-vars
$ make
$ make install
$ cd ../apache_1.3.6
$ ./configure --activate-module=src/modules/php4/libphp4.a --enable-module=proxy –enable-module=speling
$ make
Далее построенный модуль httpd скопируем в директорию bin сервера Apache (например /usr/local/apache/bin) и в конфигурационном файле httpd.conf введем строки:
AddType application/x-httpd-php  .php
AddType application/x-httpd-php  .html
Запускаем сервер Apache с установленным в нем PHP4.0.2:
$ /usr/local/apache/bin/apachectl start
Установка сервера MySQL (операционная система Unix FreeBSD-2.2.7). Копируем с http://www.mysql.com/ файл mysql-3_22_32_tar.gz. Далее выполняем команды:
$ gunzip mysql-3_22_32_tar.gz
$ tar xvf mysql-3_22_32_tar
$ cd mysql-3.22.32
$ ./configure –with-mit-threads
$ make
$ make install
$ scripts/mysql_install_db
Запускаем сервер mysql:
$ /usr/local/bin/safe_mysqld &
Меняем пароль например на “123456”
$ /usr/local/bin/mysqladmin –u root password ‘123456’
 Рассмотрим пример создания двух пользователей. Однако работать будем с последним. Первый – alex, который может получить доступ к серверу MySQL, установленному на машине cel.tup, только с клиентской машины ikc1.tup. Он должен иметь привилегии на выборку, внесение изменений в базу данных ism. Второй пользователь – admin, имеющий доступ к серверу MySQL (host - cel.tup) также только с машины ikc1.tup, но все возможные привилегии при работе со всеми базами данных.
 Для предоставления прав доступа СУБД MySQL имеет специальную базу данных mysql с тремя таблицами. Поскольку для создания вышеупомянутых пользователей потребуется только две таблицы, распечатаем их содержимое с помощью команды mysqlshow:
$ mysqlshow -u root -p mysql user
Enter password:
Database: mysql  Table: user  Rows: 6
+-----------------+---------------+------+-----+---------+-------+
| Field           | Type          | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| Host            | char(60)      |      | PRI |         |       |
| User            | char(16)      |      | PRI |         |       |
| Password        | char(16)      |      |     |         |       |
| Select_priv     | enum('N','Y') |      |     | N       |       |
| Insert_priv     | enum('N','Y') |      |     | N       |       |
| Update_priv     | enum('N','Y') |      |     | N       |       |
| Delete_priv     | enum('N','Y') |      |     | N       |       |
| Create_priv     | enum('N','Y') |      |     | N       |       |
| Drop_priv       | enum('N','Y') |      |     | N       |       |
| Reload_priv     | enum('N','Y') |      |     | N       |       |
| Shutdown_priv   | enum('N','Y') |      |     | N       |       |
| Process_priv    | enum('N','Y') |      |     | N       |       |
| File_priv       | enum('N','Y') |      |     | N       |       |
| Grant_priv      | enum('N','Y') |      |     | N       |       |
| References_priv | enum('N','Y') |      |     | N       |       |
| Index_priv      | enum('N','Y') |      |     | N       |       |
| Alter_priv      | enum('N','Y') |      |     | N       |       |
+-----------------+---------------+------+-----+---------+-------+
$ mysqlshow -u root -p mysql db
Enter password:
Database: mysql  Table: db  Rows: 2
+-----------------+---------------+------+-----+---------+-------+
| Field           | Type          | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| Host            | char(60)      |      | PRI |         |       |
| Db              | char(32)      |      | PRI |         |       |
| User            | char(16)      |      | PRI |         |       |
| Select_priv     | enum('N','Y') |      |     | N       |       |
| Insert_priv     | enum('N','Y') |      |     | N       |       |
| Update_priv     | enum('N','Y') |      |     | N       |       |
| Delete_priv     | enum('N','Y') |      |     | N       |       |
| Create_priv     | enum('N','Y') |      |     | N       |       |
| Drop_priv       | enum('N','Y') |      |     | N       |       |
| Grant_priv      | enum('N','Y') |      |     | N       |       |
| References_priv | enum('N','Y') |      |     | N       |       |
| Index_priv      | enum('N','Y') |      |     | N       |       |
| Alter_priv      | enum('N','Y') |      |     | N       |       |
+-----------------+---------------+------+-----+---------+-------+
Для добавления пользователей введем команды:
> mysql -u root -p
Enter password:
mysql> use mysql;
mysql> insert into user values ('ikc1.tup','alex',password('alex317'),
    -> 'n','n','n','n','n','n','n','n','n','n','n','n','n','n');
mysql> insert into user values ('ikc1.tup','admin',password('admin317'),
    -> 'y','y','y','y','y','y','y','y','y','y','y','y','y','y');
mysql> insert into db values ('ikc1.tup','ism','alex',
    -> 'y','y','n','n','n','n','n','n','n','n');
mysql> quit
После внесенных изменений в базу данных прав пользователей необходимо перегрузить сервер MySQL:
$  mysqladmin -u root -p reload
Enter password:
$
 В качестве примера рассмотрим создание простой базы данных в которой содержатся записи  с информацией о сотрудниках университета. Ввод в базу данных, ее корректировка должны проводиться с компьютера клиента через формы броузера, например Netscape Communicator.
Создаем базу данных ism и таблицу в ней teacher:
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.22.32

Type 'help' for help.
mysql> create database ism;
Query OK, 1 row affected (0.04 sec)
mysql> use ism1;
Database changed
mysql> create table teacher (user_name VARCHAR(25), phone VARCHAR(10),
    -> job BLOB, img VARCHAR(20));
Query OK, 0 rows affected (0.02 sec)
mysql> quit
Bye
$
 Ниже приведен файл index.html который формирует меню режимов работы с базой данных:
<html><head><title>Menu</title></head><body>
<b><a href="../~alex/form1.html">1.Добавить запись в базу данных </a><br>
<a href="../~alex/form2.html">2.Найти запись по Ф.И.О. </a><br>
<a href="../~alex/form3.html">3.Удалить запись </a><br>
<a href="../~alex/form4.html">4.Отредактировать запись </a></b>
</body></html>
 Для каждого из представленных здесь пунктов меню должны быть созданы формы на языке html, обеспечивающих передачу данных web-серверу посредством скриптов, написанных на PHP.
 Первая форма и скрипт предназначены для добавления записей в базу данных сервера MySQL.
Файл form1.html:
<html><head><title>form1</title><body>
<form method=post action="form1.php"><br><b>Введите Ваше имя:</b>
<br><input name="user_name" value="" size=30>
<br><br><b>Введите номер Вашего телефона:</b> <br><input name="phone" value="" size=10>
<br><br><b>Введите краткую характеристику:
<br><TEXTAREA NAME="job" ROWS=10 COLS=40></TEXTAREA>
<br><br><b>Введите имя фото лат.буквами:</b>
<br><input name="img" value="nofoto.jpg" size=20>
<br><br><input type="submit" value="Зарегистрировать">
</form></body></html>
Файл form1.php:
<?
/* Определяем значения переменным */
$hostname="cel.tup"; $username="alex"; $password="alex317";
/* Имя базы данных */
$dbName="ism";
/* Таблица MySQL */
$usertable="teacher";
/* Создать соединение */
MYSQL_CONNECT($hostname,$username,$password) OR DIE("Не могу подсоединиться");
/* Выбор БД */
MYSQL_SELECT_DB($dbName) or die("Не могу выбрать БД");
/* Введение информации в БД */
$query="INSERT INTO $usertable VALUES ('$user_name','$phone','$job','$img')";
$result=MYSQL_QUERY($query);
/* Закрыть соединение */
MYSQL_CLOSE();
print "Запись введена в БД! <br>";  print "<a href='../~alex'>Назад в меню</a>";
?>
Необходимо заметить, что в базе данных ism хранятся только имена фотографий сотрудников, сами фотографии находятся в подкаталоге pics.
Вторая форма и скрипт предназначены для выборки записей из базы данных сервера MySQL.
Файл form2.html:
<html><head><title>Выборка данных</title>
<body><form action="form2.php" method="post"><b>Введите Ф.И.О.<b>
<input type="text" name="user_name" size=30><input type="submit" value="Ввести!">
</form></body></html>
Файл form2.php:
<?php
$hostname="cel.tup"; $username="admin"; $password="admin317"; $dbName="ism";
$usertable="teacher";
mysql_connect($hostname,$username,$password) or die("No connect");
mysql_select_db("$dbName") or die("No select DB");
/* Выбрать сотрудников, имена которых начинаются на $user_name */
$query="select * from teacher where user_name like '$user_name%'";
$result=mysql_query($query);
/* Сколько нашлось таких сотрудников? */
$number=mysql_numrows($result);
/* Распечатка выбранных сотрудников */
$i=0;
if ($number == 0)
{ print "Нет данных о $user_name в БД <br>"; }
elseif ($number > 0)
{
while ($i < $number)
{
/* Присвоение переменным значений полей user_name, phone, job, img для i-й строки */
$user_name=mysql_result($result,$i,"user_name");
$phone=mysql_result($result,$i,"phone");
$job=mysql_result($result,$i,"job");
$img=mysql_result($result,$i,"img");
/* Вывод фотографии i-го сотрудника  высотой 130 пикселей */
print "<br><img src='pics/$img' height=130><br>";
/* Вывод Ф.И.О. i-го сотрудника */
print "<u> Ф.И.О.:</u> <br>";
print "$user_name <br><br>";
/* Вывод телефона i-го сотрудника */
print "<u> Телефон: </u><br>";
print "$phone <br><br>";
/* Вывод краткой характеристики i-го сотрудника */
print "<u> Характеристика: </u><br>";
print "$job <br>";
$i++;
print "<hr>";
}
}
print "<a href='../~alex'>Назад в меню</a>";
 ?>
Третья форма и скрипт предназначены для  удаления записей из базы данных сервера MySQL.
Файл form3.html:
<html><head><title>Выборка данных</title><body>
<form action="form3.php" method="post"><b>Введите Ф.И.О. для удаления:<b>
<input type="text" name="user_name" size=30><input type="submit" value="Ввести!">
</form></body></html>
Файл form3.php:
<?php
$hostname="cel.tup"; $username="admin"; $password="admin317"; $dbName="ism";
$usertable="teacher";
mysql_connect($hostname,$username,$password) or die("No connect");
mysql_select_db("$dbName") or die("No select DB");
/* Удаление записи для поля user_name */
$query="delete from $usertable where user_name='$user_name'";
$result=mysql_query($query);
print "Запись удалена <br>";
print "<a href='../~alex'>Назад в меню</a>";
 ?>
Четвертая форма и скрипт предназначены для  редактирования записей в базе данных сервера MySQL.
Файл form4.html:
<html><head><title>Корректировка данных</title><body>
<form action="form4.php" method="post">
<b>Введите Ф.И.О., данные для которой необходимо изменить:<b>
<br><input type="text" name="user_name" size=30><input type="submit" value="Ввести!">
</form></body></html>
Файл form4.php:
<?php
$hostname="cel.tup"; $username="admin"; $password="admin317"; $dbName="ism"; $usertable="teacher";
mysql_connect($hostname,$username,$password) or die("No connect");
mysql_select_db("$dbName") or die("No select DB");
/* Выбор записей по полю user_name */
$query="select * from $usertable where user_name='$user_name'";
$result=mysql_query($query);
/* Определение существованя выбранных записей */
$number=mysql_numrows($result);
if ($number==0)
{
print "Нет такой записи!<br>";
print "<a href='../~alex'>Назад в меню</a>";
}
/* Если запись выбрана из базы данных, вывести все ее поля в форму для редактирования */
/* И удалить выбранную запись */
else
{
/* Присвоение переменным значений полей для выбранной записи */
$phone=mysql_result($result,0,"phone");
$job=mysql_result($result,0,"job");
$img=mysql_result($result,0,"img");
print "<img src='pics/$img' height=130><br>";
/* Удаление записи */
$query="delete from $usertable where user_name='$user_name'";
$result=mysql_query($query);
/* Создание формы для редактирования */
print "<form method=post action='form5.php'>";
print "<br><b>Введите Ваше имя:</b>";
print "<br><input name='user_name' value='$user_name' size=30>";
print "<br><br><b>Введите номер Вашего телефона:</b>";
print "<br><input name='phone' value='$phone' size=10>";
print "<br><br><b>Введите краткую характеристику:";
print "<br><TEXTAREA NAME='job' ROWS=10 COLS=40>$job</TEXTAREA>";
print "<br><br><b>Введите имя фото лат.буквами:</b>";
print "<br><input name='img' value='$img' size=20>";
print "<br><br><input type='submit' value='Зарегистрировать'>";
print "</form>";
}
?>
Файл form5.php. Предназначен для ввода в базу данных в форме отредактированной записи.
<?
/* Определяем значения переменным */
$hostname="cel.tup"; $username="admin"; $password="admin317";
/* Имя базы данных */
$dbName="ism";
/* Таблица MySQL */
$usertable="teacher";
/* Создать соединение */
MYSQL_CONNECT($hostname,$username,$password) OR DIE("Не могу подсоединиться");
/* Выбор БД */
MYSQL_SELECT_DB($dbName) or die("Не могу выбрать БД");
/* Введение информации в БД */
$query="INSERT INTO $usertable VALUES ('$user_name','$phone','$job','$img')";
$result=MYSQL_QUERY($query);
/* Закрыть соединение */
MYSQL_CLOSE();
print "Запись введена в БД! <br>"; print "<a href='../~alex'>Назад в меню</a>";
?>
 Рассмотренный здесь подход для создания и работы с простейшей базой данных применим и для построения достаточно сложных баз данных, содержащих большое количество полей и условий выборки по ним. Например, задачи о учете, перемещении кадров на крупных предприятиях, имеющих филиалы. Для таких задач размеры приведенных здесь программ увеличаться из-за необходимости обработки большого количества полей, введения логических условий при выборке данных, организации форматированного вывода.

    Литература

1. Ткаченко В. Вступление в PHP и MySQL. http://phpclub.unet.ru/tutor/about_php_rus.htm
2. Паутов А. Версия пакета MySQL:3.20.29. http://phpclub.unet.ru/tutor/mysql/mysqlrusb1.html
3. Руководство по РНР 3.0.  http://rusphp.chat.ru/