А.А.МЯСИЩЕВ
В настоящее время многие предприятия, учреждения ведут работы по созданию
компьютерного учета работающих сотрудников. Причем организация такого учета
может проводиться как на локальном компьютере с локальной базой данных,
к которой невозможен доступ со стороны других компьютеров (клиентов), так
и на сервере, который обеспечивает коллективный доступ к базе данных с
установленными привилегиями для различных групп пользователей. В связи
с развитием 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/