Php и MySQL – рабочее приложение с использованием нескольких таблиц

/ 👁 9806

Недавно получила письмо, где человек просит помочь разобраться в создании приложения на php и MySQL с использованием нескольких таблиц базы, которые между собой взаимосвязаны. Суть такова (насколько мне удалось понять из письма): врач ведет учет пациентов и хочет хранить их данные в таблице базы, однако, записи о приемах он тоже хочет хранить в другой таблице. Нужно, чтобы была возможность добавлять новых пациентов, новые записи об их приемах и, конечно же, иметь возможность эти данные просматривать в удобной форме. Сегодня попробуем реализовать такое приложение.
дополнительные материалы к урокам
Для начала нужно определиться, что мы получим на выходе. А на выходе у нас должно быть приложение со следующим интерфейсом: главная страница, где пользователь может выбрать одно из действий: либо добавить нового пациента, либо выбрать имеющегося и добавить запись об его приеме, либо посмотреть все данные любого пациента включая личные данные и все записи его приемов.

Я решила организовать это в виде трех блоков на главной странице: блок с формой для занесения нового пациента; блок, в котором выводится список всех имеющихся пациентов, под которым есть форма для занесения новой записи (сначала выберем конкретного пациента из списка, потом заполняем форму с информацией о приеме и нажмём кнопку); блок, где мы можем выбрать пациента и посмотреть всю его историю, а также личные данные.

Можно организовать это и на разных страницах, но я, для компактности и дабы не создавать целую кучу файлов, решила сделать на одной. В этом уроке я показываю принцип, а оформление – это уже личные предпочтения каждого.

Итак, с желаемым итоговым результатом все более или менее понятно. Теперь давайте заглянем в базу данных и организуем наши таблицы. Я для этого примера создала новую базу данных, которую назвала «ychet».

1. В новой базе данных мы создадим две таблицы: первая будет хранить личные данные каждого пациента, такие как имя, фамилия, телефон, адрес (не знаю, что там еще обычно нужно для врача, но это лишь пример – а Вы создавайте те поля, которые нужны Вам); во второй таблице будут храниться данные о приемах для всех пациентов (потом мы будем писать код, чтобы из всего многообразия данных приемов извлекать именно нужные).

Итак, создаем первую таблицу. Я назвала ее «my_pacient» и снабдила пятью полями: id, name, last_name, adress, telefon. Для поля «id» нужно выбрать тип «int», а также присвоить «AUTO_INCREMENT» и первичный ключ (primary key). Для остальных полей в качестве типа указала «varchar».

Структуру таблицы Вы можете видеть на скриншоте ниже:

таблица в MySQL для хранения личных данных

Давайте сразу создадим и вторую таблицу, в которой будут храниться все данные о приемах. Я назвала эту таблицу «visits» и создала в ней 5 полей: id, num, date, comments, next_date. То есть здесь мы будем хранить дату приема, комментарии врача и дату следующего приема. Поле «num» (должно иметь тип «int») будет соответствовать идентификатору пациента (значению поля «id» из первой таблицы – этот идентификатор будет уникальным для каждого пациента). Полю «id» нашей второй таблицы я также присвоила «AUTO_INCREMENT» и первичный ключ (primary key) и оно также должно иметь тип данных «int». Полям «date» и «next_date» дадим тип данных «datetime», а полю «comments» дадим тип данных «text».

Структуру этой таблицы со всеми полями и их типами данных Вы можете увидеть на скриншоте ниже:

таблица базы данных с информацией о приемах

2. Теперь давайте займемся интерфейсом нашего приложения. Для начала создадим файл (я назвала его «index.php»).

Как я уже говорила, на нашей главной странице будет 3 блока: для внесения нового пациента в список, для занесения новой записи для какого-либо пациента и для выбора пациента из списка и просмотра всей его истории. Для этого мы организуем три тега «form», для каждого из которых я сразу же пропишу в атрибуте «action» имя соответствующего файла-обработчика, которые мы создадим чуть позже. Также мы пропишем подключение файла таблицы стилей, которую создадим в следующем шаге.

Итак, вот код для нашего файла «index.php»:

<!doctype html>
<html>
<head>
<meta charset="windows-1251">
<title>Главный Интерфейс</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Выберите действие</h1>
<!--Первый блок - для занесения нового пациента в список-->
<form id="newPacient" action="add_pacient.php" method="post">
<label for="name"><b>Имя:</b></label><br>
<input type="text" size="30" name="name"><br>
<label for="last_name"><b>Фамилия:</b></label><br>
<input type="text" size="30" name="last_name"><br>
<label for="adress"><b>Адрес:</b></label><br>
<input type="text" size="40" name="adress"><br>
<label for="telefon"><b>Телефон:</b></label><br>
<input type="text" size="30" name="telefon"><br>
<input type="submit" value="Внести нового пациента" name="addNew">
</form>
<!--Второй блок - для внесения записи о приеме для конкретного пациента-->
<form id="addHistory" action="addHistory.php" method="post">
<label for="date"><b>Дата приема:</b></label><br>
<input type="date" name="date" value="2014-03-03 12:00:00" size="20"><br>
<label for="comments"><b>Коментарии Врача:</b></label><br>
<textarea cols="25" rows="5" name="comments"></textarea><br>
<label for="next_date"><b>Дата следующего приема:</b></label><br> 
<input type="date" name="next_date" value="2014-03-10 12:00:00" size="20"><br>
<input type="submit" value="Добавить Новую запись для пациента" name="add_history">
</form>
<!--Третий блок - для выбора пациента и просмотра его истории-->
<form action="check_history.php" method="post">
<input type="submit" value="Посмотреть Историю Пациента" name="check_history">
</form>
</body>
</html>

 

3. Сейчас создадим файл таблицы стилей, подключение к которому мы уже прописали в файле «index.php». Я создам файл с именем «style.css», сохраню его в том же каталоге, что и файл «index.php» и пропишу самые основные стили, чтобы наша страница выглядела более или менее симпатично.

body{width:960px; margin:0 auto; background-color:#D0EDC2}
h1{text-align:center}
form{ width:300px; text-align:left; border:1px solid #999; 
float:left; padding:5px; margin-left:5px;background-color:#EBEBEB}
input{border:1px solid green; margin-top:10px}

 

Теперь можно посмотреть нашу страницу в браузере. Если Вы тестируете Ваши php-коды с локального компьютера, то используйте для этого локальный сервер «Денвер» (установить его можно по этой ссылке ). Итак, наберите в адресной строке браузера «localhost/имя папки, в которой хранятся Ваши файлы/index.php». Вы должны увидеть вот такой результат:

начальный интерфейс приложения по учету пациентов

4. Давайте займемся первым блоком, тем, который позволяет добавить нового пациента в базу данных. Ему мы прописали файл-обработчик с именем «add_pacient.php».

Давайте создадим этот файл и сохраним его в том же каталоге, что и файл «index.php» (если Вы захотите создать отдельную папку и хранить там файлы-обработчики, то не забудьте исправить пути к файлам в атрибуте «action» наших форм).

Сейчас мы уже можем приступить к написанию кода для этого обработчика. Первое, что нам нужно сделать – это соединиться с базой данных. Код соединения с базой мы будем использовать во всех файлах-обработчиках, и поэтому, чтобы не писать один и тот же код в каждом файле, я предлагаю создать отдельный файл соединения с базой, который мы потом просто будем подключать одной строчкой везде, где нужно.

Так что давайте на время оставим файл «add_pacient.php» и создадим файл с именем «connect.php» (я сохраняю его в том же каталоге, что и остальные файлы).

Я установила на мою базу данных «ychet» привилегии (имя пользователя и пароль), которые и буду использовать при подключении (если Вы не знаете, как установить привилегии, то можете почитать об этом в этой статье).

Итак, код соединения с базой данных следующий (Вы, конечно же, подставляйте свое имя пользователя и пароль, а также свое имя базы данных, если оно отличается от моего):

<?php
mysql_connect("localhost","anna","12345")
or die ("<p>Ошибка подключения к базе данных " .mysql_error()."</p>");
mysql_select_db("ychet")
or die ("<p>Ошибка выбора базы данных " .mysql_error(). "</p>");
?>

 

Теперь можете закрыть этот файл и вернуться к файлу «add_pacient.php».

5. Здесь задача файла-обработчика: соединиться с базой данных, получить значения, введенные в форму из файла «index.php», создать запрос на их вставку в таблицу базы «my_pacient» и собственно эту вставку выполнить.

Также попутно мы проверим прошла ли вставка успешно, и если что-то пошло не так, то выведем сообщение об ошибке. Также вставим в конце кода ссылку для переходя обратно к основному интерфейсу.

<?php
require 'connect.php';
$name = $_REQUEST['name'];
$last_name = $_REQUEST['last_name'];
$adress = $_REQUEST['adress'];
$telefon = $_REQUEST['telefon'];

$mysql_insert = "INSERT INTO my_pacient(name,last_name,adress,telefon)".
"VALUES('{$name}','{$last_name}','{$adress}','{$telefon}');";
mysql_query($mysql_insert) or die ("<p>Ошибка вставки ".mysql_error());
echo 'Пациент добавлен в список!';
?>
<a href="index.php">Вернуться в меню</a>

 

В первой строке мы подключаем файл «connect.php», который реализует соединение с базой.

В следующий 4-х строчках мы получаем значения, введенные в поля нашей первой формы и заносим их в переменные.

Далее мы формируем запрос и исполняем его посредствам функции «mysql_query».

В конце выводим ссылку, при помощи которой можно будет перейти обратно к главному интерфейсу.

Теперь мы можем попробовать добавить новых пациентов и убедиться, что вставка проходит удачно. Я предлагаю на этом этапе добавить нескольких пациентов при помощи формы.

добавляем нового пациента в базу данных

успешное добавление в базу данных

Я добавила троих пациентов, и если сейчас я зайду в базу данных в таблицу «my_pacient», то увижу следующее:

добавленная информация в базе данных

6. Теперь давайте займемся второй формой – эта форма для добавления записи какому-то конкретному пациенту. Как вы, наверное, заметили, сама форма для добавления записи у нас есть, но нам еще нужно знать – для какого конкретно пациента мы эту запись добавляем. Для этого мы можем вывести всех имеющихся пациентов перед формой в виде выбора из радиокнопок. Сначала мы будем отмечать какому пациенту мы хотим добавить запись о приеме, потом заполнять форму и отправлять ее файлу-обработчику.

Я предлагаю создать отдельный файл, который будет отвечать за вывод всех имеющихся пациентов на экран (точнее их имени и фамилии) в виде радиокнопок. А потом мы просто подключим этом файл к «index.php» в нужном месте.

Давайте создадим файл с именем «all_pacient.php» и пропишем в нем код для вывода всех имеющихся пациентов на экран. Вот код этого файла:

<?php
require 'connect.php';
$mysql_select = "SELECT * FROM my_pacient";
$result = mysql_query($mysql_select);
$row = mysql_fetch_array($result);
do{
$id = $row['id'];
$name = $row['name'];
$last_name = $row['last_name'];
printf("<p><label><input type='radio' name='radio' id='radio' value='%s'>%s %s</label></p>",$id,$name,$last_name);	
}
while($row = mysql_fetch_array($result));
?>

 

Здесь мы также в начале соединяемся с базой данных посредствам подключения файла «connect.php», далее формируем запрос на выбор всей информации из таблицы «my_pacient», выполняем запрос, разбиваем полученный массив на строки. А далее в цикле получаем нужные переменные и печатаем на экран информацию о каждом пациенте в виде радиокнопок.

Теперь осталось только подключить этот файл в нужном месте файла «index.php». А нужное место у нас находится между открывающим тегом «form» и первым тегом «label». Вот здесь:

<!--Второй блок - для внесения записи о приеме для конкретного пациента-->
<form id="addHistory" action="addHistory.php" method="post">
<?php require 'all_pacient.php';?> <!—эта строка отвечает за вывод всех пациентов-->
<label for="date"><b>Дата приема:</b></label><br>

 

Теперь, если мы перезагрузим нашу страницу с главным интерфейсом, то увидем, что над второй формой вывелся список из имеющихся пациентов.

вывод информации из базы на экран

7. Сейчас можно перейти к файлу-обработчику для этой формы. Давайте создадим файл «addHistory.php», который будет отвечать за вставку записей о приемах в таблицу базы данных «visits».

Здесь нам нужно также: соединиться с базой данных; получить данные из формы второго блока, находящейся в файле «index.php»; создать запрос на добавление этих данных в соответствующие поля таблицы «visits» и организовать ссылку для перехода обратно к главному интерфейсу.

<?php
require 'connect.php';
$num = $_REQUEST['radio'];
$date = $_REQUEST['date'];
$comments = $_REQUEST['comments'];
$next_date = $_REQUEST['next_date'];
$mysql_insert = "INSERT INTO visits(num,date,comments,next_date)". 
"VALUES('{$num}','{$date}','{$comments}','{$next_date}');";
mysql_query($mysql_insert) or die ("<p>Ошибка вставки ".mysql_error());
echo '<p>Запись успешно добавлена!</p>';
?>
<a href="index.php">Вернуться в меню</a>

 

Теперь можете попробовать добавить записи для одного или нескольких пациентов.

добавление записи в базу

отчет об успешном добавлении

Я добавила по несколько записей для каждого пациента и теперь, если я загляну в базу данный в таблицу «visits», то увижу следующую картину.

записи, добавленные в базу данных

Как Вы можете заметить поле «num» соответствует идентификатору конкретного пациента, который он имеет в таблице «my_pacient». Именно по этому идентификатору мы и будем определять какие записи соответствуют каждому конкретному пациенту, когда будем реализовывать просмотр истории пациента.

8. Остался последний блок. Этот блок отвечает за просмотр истории пациента. Причем извлекать данные нам нужно будет из обеих таблиц, так как мы хотим видеть и личные данные пациента и историю его болезни.

Пока что у нас в этом блоке имеется только одна кнопка «Посмотреть историю пациента», но нам нужно знать, историю какого конкретного пациента мы хотим вывести на экран. Нужно опять вывести список имеющихся пациентов. Здесь нам поможет уже созданный файл «all_pacient.php». Нам нужно его просто опять подключить, как мы это делали и раньше.

Найдите третий блок с формой в файле «index.php» и подключите блок между открывающим тегом «form» и тегом «input». Вот так:

<!--Третий блок - для выбора пациента и просмотра его истории-->
<form action="check_history.php" method="post">
<?php require 'all_pacient.php'; ?> <!—здесь выводим список пациентов-->
<input type="submit" value="Посмотреть Историю Пациента" name="check_history">

 

Теперь если обновим страницу, то можем увидеть список пациентов над кнопкой в третьем блоке нашего интерфейса.

вывод списка пациентов в третьем блоке интерфейса

Осталось только реализовать работу файла-обработчика, который будет выдавать нам нужную информацию.

9. Создадим последний в этом проекте php-файл с именем «check_history.php». Здесь нам нужно будет получать информацию сразу из обеих таблиц базы данных. Нам нужно, чтобы выводимая на экран информация соответствовала пациенту, которого мы выбрали в файле «index.php» посредствам радиокнопки.

Вот код нашего файла, который я поясню чуть ниже:

<?php
require 'connect.php';
$num = $_REQUEST['radio'];
$mysql_select = "SELECT * FROM my_pacient WHERE id=$num";
$result = mysql_query($mysql_select);
$row = mysql_fetch_array($result);
$mysql_select1 = "SELECT date,comments,next_date FROM visits WHERE num=$num";
$result1 = mysql_query($mysql_select1);
$row1 = mysql_fetch_array($result1);
printf("<h1>%s %s</h1><p><i>Адрес: %s<br>Телефон: %s</i></p>",$row['name'],$row['last_name'],$row['adress'],$row['telefon']);
do{
printf("<table border='1'><tr><td><b>Дата визита:</b></td><td>%s</td></tr>
<tr><td><b>Комментарий врача:</b></td><td>%s</td></tr>
<tr><td><b>Дата следующего визита:</b></td><td>%s</td></tr>
</table><br>", $row1['date'],$row1['comments'],$row1['next_date']);	
}
while($row1 = mysql_fetch_array($result1))
?>
<a href="index.php">Вернуться в меню</a>

 

В первой строке мы соединяемся с базой данный с помощью файла, отвечающего за соединение «connect.php».

Далее мы получаем идентификатор выбранного нами пациента и заносим его в переменную «num».

В строках 3-5 мы создаем запрос по извлечению всей информации из таблицы «my_pacient», где поле «id» равно переменной «$num» (то есть идентификатор выбранного пациента); исполняем запрос и разбиваем полученный массив на строки.

В следующих трех строках мы создаем запрос по извлечению полей с датой, комментарием врача и датой следующего посещения из таблицы «visits», где поле «num» равно переменной «$num» (Вы помните, что это поле хранит идентификатор конкретного пациента, значит все поля «num» с одинаковым значением относятся к одному и тому же пациенту. Таким образом мы можем извлечь историю только одного нужного нам пациента); исполняем запрос и разбиваем массив на строки.

В следующей строке мы печатаем на экран личные данные пациента (информация из таблицы «my_pacient»).

А далее в цикле выводим информацию о его визитах. Она будет выводится до тех пор, пока не выведутся все записи, относящиеся к конкретному пациенту.

Последняя строка кода – это ссылка для возврата в главное меню.

Если сейчас я выберу конкретного пациента и нажму на кнопку, то увижу на экране всю информацию о нем, включая личные данные и историю посещений.

выбираем пациента из списка

вывод нужной информации из двух таблиц базы данных MySQL

Вот наше приложение и готово! Конечно же его еще можно подшлифовать, но я это оставляю Вам, так как урок в этот раз получился очень большой!

Надеюсь, что основную идею Вы поняли. И на основе этой идею Вы можете создавать приложения для совершенно разных задач.

Я на этом буду с Вами прощаться. Все файлы Вы сможете найти в исходниках к уроку.

Жду Ваших комментариев! Делитесь уроком с друзьями при помощи кнопок социальных сетей. И подписывайтесь на обновление блога, если еще не подписаны.

Успехов, Вам! С Вами была Анна Котельникова.

До новых встреч!

Tags: ,

4 комментария

  1. Дмитрий 24.06.2021
    • Anna Kotelnikova 05.07.2021
  2. Алексей 09.11.2022
  3. Ник 01.12.2023

Leave a Reply