Практическая работа 3. Тема 2/3: Ввод данных в БД с использованием

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Практическая работа 3.
Тема 2/3: Ввод данных в БД с использованием
интерактивных форм
Цель — освоить технологию ввода данных в БД, созданную на сервере MySQL
с использованием
интерактивных
html-форм
и обрабатывающих
скриптов
на языке Php.
Задание:
1. Освоить технологию передачи данных на сервер с использованием htmlформы и ввода переданных данных в одну таблицу БД и организацию
проверки корректности вводимых данных.
2. Освоить технологию организации интерактивного режима для ввода данных
в несколько таблиц базы данных.
3. Освоить технологию организации гибкого диалога для ввода данных
в БД с использованием информации, хранимой в БД.
Теоретические сведения
Ввод данных в базу данных осуществляется оператором SQL-INSERT, который
имеет стандартный формат:
Insert into <имя таблицы> (<список имен полей таблицы>) Values <список
значений>
Оператор sql формируется в виде символьной строки, заключенной в двойные
кавычки, например
$sql = ”insert
данных’,2005)”;
into
books
(isbn,title,Year_izd)
values
(‘0004’,‘Базы
Здесь мы вводим строку, которая включает два поля с именами title и Year_izd
с двумя значениями: для первого поля-строка символов ‘Базы данных’, а для
второго поля-целое число 2005, которое не требует заключения в кавычки
по стандарту SQL. В таблице Books у нас присутствует 4 поля, однако поле Pages
(количество страниц) не обязательно для заполнения, поэтому оно будет
заполнено неопреденным значением.
Если мы будем вводить полную строку в таблицу books, то можем использовать
сокращенный вариант оператора INSERT
$sql = ”insert into books values (‘0005’,‘MS SQL Server 2005’,2007,400)”;
Если в таблице существуют автоинкрементные поля, то они не вводятся,
система сама присваивает им значения при вводе каждой новой строки.
Исполнение
оператора
mysql_query($sql).
осуществляется
1
стандартной
функцией
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Если вводимые данные должны быть заданы не константами, а переменными,
то в операторе SQL имена этих переменных заключаются в одинарные кавычки,
а сам оператор SQL всегда заключается в двойные кавычки, например:
$isbn=’0005’;
$titl=’ MS SQL Server 2005’’;
$yearizd=2005;
$pages=300;
$sql = ”insert into books values (‘$isbn’,‘$titl’,’$yearizd’,’$pages’)”;
При этом необходимо помнить, что этот оператор является исполняемым,
т. е. символьная строка, включающая имена переменных, сначала должна
подставить их текущие значения, а только потом поступить на исполнение
функции mysql_query(). Поэтому если будут меняться значения переменных,
то необходимо повторно выполнять оператор присваивания значения переменной
$sql.
Разумеется, перед вводом данных необходимо выполнить ряд стандартных
действий подключения к серверу и выбор базы данных, так как исполнять любой
оператор SQL мы можем только в текущей, выбранной базе данных.
Задание 3.1.
Создать файл 3_1.php, в котором написать скрипт, который вводит данные
об одной новой книге в вашу базу данных. Проверить ввод этой строки
с использованием
административной
консоли
сервера
MySQLAdmin.
Первоначально необходимо создать html-форму, которая внешне может выглядеть
очень просто (рис. 3.1.), сохранить ее в файле 3_1.html.
В поля формы ввести переменные, которые должны быть переданы на сервер
и использованы для выполнения sql-запроса на ввод данных.
После этого сформированный sql-запрос надо выполнить и при удачном
завершении этого процесса в таблице базы данных будет добавлена одна запись.
2
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 3.1. Форма для ввода новой книги
Проверить
работоспособность
скрипта
с использованием
phpMyAdmin
в интерактивном режиме, выводя содержимое таблицы Books до запуска формы
ввода и после выполнения скрипта.
Задание 3.2.
При вводе данных в БД обязательно необходимо анализировать корректность
ввода. Ошибки ввода могут возникать при нарушении условий целостности
данных, т. е. при вводе строки с дублирующим значением первичного ключа.
Поэтому при исполнении sql-скрипта на ввод данных обязательным является
анализ кода ошибки, возвращаемой сервером. Нежелательно выводить код
ошибки и системное сообщение непосредственно пользователю, это будет
выглядеть непрофессионально и в большинстве случаев малоинформативно для
пользователя. Погашение передачи сообщений сервера — знак @ перед вызовом
функции выполнения запроса:
$result=@mysql_quiry($sql);
Но нам надо сообщить пользователю смысл ошибки на понятном для него
языке.
Код ошибки, соответствующий вводу дубликата значения первичного ключа
1062. Значит, необходимо проанализировать код ошибки и вывести осмысленное
сообщение типа «Книга с введенным значением ISBN уже существует, проверь
правильность вводимых данных» (рис. 3.2).
if (mysql_errno()==1062){echo “Книга с введенным значением ISBN=$isbn уже
существует, проверьте правильность вводимых данных”;}
3
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 3.2. Сообщение об ошибке
Остальные данные при вводе могут быть корректными с точки зрения сервера
Mysql, но некорректными семантически, например год или количество страниц
могут быть заданы отрицательными числами. В серьезных серверах баз данных
существует возможность при описании схемы таблицы в операторе Create table
задать правила семантической проверки значений, которые задаются с помощью
специального ограничения типа CHECK. Сервер MySQL, как мы знаем, такую
проверку не допускает. Поэтому эту проверку необходимо делать либо
с использованием JavaScript в форме на клиенте, либо в обрабатывающем скрипте
на сервере перед вводом данных в БД.
Порядок выполнения задания:
Сдублировать форму 3_1_1.html в файл 3_1_2.html и изменить в ней имя
обработчика на 3_1_2.php.
Создать скрипт 3_1_2.php, в котором с использованием функции вывода
содержимого таблицы tab_print() (практическая работа 2, задание 6.) выводить
содержимое таблицы books до ввода новой строки и после ввода.
Дополнить скрипт 3_1_2.php проверками корректности передаваемых данных
и корректностью выполнения самой операции ввода строки в таблицу Books.
Проверить работоспособность созданных скриптов при вводе правильных
данных и при вводе некорректных данных.
Задание 3.3.
Разработайте форму и скрипт для ввода нового читателя. Форму сохраните
в файле 3_1_3.html, а обработчик в файле 3_1_3.php. При разработке скрипта
проверьте корректность ввода данных в БД. Помните, что номер читательского
билета — это инкрементное поле.
Задание 3.4.
Пользовательская точка зрения на ввод данных часто не совпадает
с простейшим вводом данных в одну таблицу. Даже в нашем простейшем случае
по крайней мере надо указать, сколько экземпляров данной книги мы приобрели
для нашей библиотеки. А это уже ввод данных в 2 таблицы — сначала в таблицу
boоks, а затем в таблицу Exemplare.
Инвентарный номер является инкрементным полем, поэтому он вообще
не задается в операторе ввода данных, а генерируется системой при вводе
каждой новой строки. При вводе данных об экземпляре мы должны ввести
значение внешнего ключа ISBN для данного экземпляра и указать, что книга
находится в библиотеке (Поле Yes_no=’1’). Все остальные поля в таблице
являются необязательными. SQL-запрос будет выглядеть следующим образом:
4
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
$sql=”insert (isbn,Yes_no) into exemplar values(‘$isbn’,’1’)”;
Для ввода данных обо всех экземлярах нам надо организовать цикл.
Количество экземпляров нам известно (например оно содержится в переменной
$ex), поэтому можем применить цикл for:
For($i=1;$i<$ex;$i++)
{ $result=@mysql_query($sql);
if (mysql_error()){echo ‘Ошибка при вводе данных о экземпляре книги’;}
}
Форма для ввода данных аналогична предыдущей за одним исключением — она
дополнена полем, в котором указано количество экземпляров данной книги
(рис.3.3).
Рис. 3.3. Форма ввода данных с указанием количества экземпляров
Проверьте наличие вновь введенных данных с использованием программы
вывода содержимого таблицы.
Порядок выполнения задания:
Создайте файл 3_2_1.html с новой формой ввода, для экономии времени
скопируйте файл 3_1_2.html и дополните форму еще одном текстовым полем для
ввода количества экземпляров.
Создайте файл 3_2_1.php для обработки созданной формы, для экономии
времени скопируйте в него скрипт 3_1_2.php и дополните его операторами ввода
данных в таблицу экземпляры и операторами вывода данных из таблиц книги
и экземпляры с использованием функции вывода таблицы tab_print().
Задание 3.5.
Часто возникает ситуация, когда вводимые данные связаны с уже
существующими данными, хранимыми в БД. Поэтому при вводе необходимо,
чтобы пользователь выбирал из множества допустимых значений, а не набирал
5
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
заново. Например, подобная ситуация возникает, когда при вводе новой книги,
нам одновременно необходимо указать, к каким областям знаний относится
данная книга.
Для вывода содержимого из базы данных можно воспользоваться различными
управляющими элементами. Для нашего случая с множественным выбором
подойдут либо chekbox, либо выпадающий список с множественным выбором.
Рассмотрим пример формирования элементов формы типа checkbox из базы
данных. В это случае, интерактивная форма уже будет не файлом html, а файлом
Php. Элемент checkbox имеет следующий синтаксис:
<INPUT type="checkbox" name="a[]" value="значение"> выводимый текст<BR>
Следует заметить, что выводить нам надо названия областей знаний,
а в качестве значений использовать код области знаний, который и должен
вводиться в связующую таблицу books_cat.
Для вывода допустимых областей знаний пишем запрос:
$sql_a=”select kod_now,titl_now from catalog”
Теперь мы должны обработать запрос и включить в нужные места формы
нужные переменные:
$rk= mysql_query($sql_a);
while ($rw=mysql_fetch_array($rk))
{
$k[]=$rw['kod_now'];
$t=$rw['titl_now'];
// так как в операторе вывода нельзя обращаться к элементу массива,
// введем дополнительные преобразования
$km=$rw['kod_now'];
Echo ‘<INPUT type="checkbox" name="k[]" value=."$km".”>$t <br>”;
}
Не забудьте обязательные операторы начала и конца формы.
Внешне наша форма будет выглядеть следующим образом (рис. 3.4):
6
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 3.4. Вывод информации из БД с использованием элементов checkbox
Обрабатывать подобные элементы вы уже умеете (мы это делали в прошлом
семестре), теперь только надо полученные коды ввести в связующую таблицу.
Когда мы принимаем данные на стороне сервера, мы должны помнить, что при
вводе данных в связующую таблицу books_cat мы вводим 2 поля: ISBN
и KOD_NOW. При выборе мы могли выбрать несколько областей знаний для
данной книги, поэтому мы должны организовать цикл, в котором будем вводить
данные в таблицу связи. ISBN у нас не будет изменяться, а вот KOD_NOW
мы каждый раз должны ввести новый. Мы будем вводить целую строку, поэтому
можем применить сокращенный оператор ввода данных, без задания имен
столбцов.
Фрагмент кода, соответствующий расшифровке переданного списка областей
знаний может выглядеть следующим образом (рис. 3.5):
7
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 3.5. Фрагмент кода для обработки выбранных областей знаний и занесения полученной
информации в БД
Порядок выполнения задания:
Создайте расширенную форму ввода данных в файле 3_3_1_F.php. Скопируйте
ранее разработанную форму из файла 3_2_1.html и дополните ее кодом вывода
списка областей знаний.
Создайте файл обработки 3_3_1.php, используйте ранее разработанный файл
обработки 3_2_1.php, дополнив его операторами ввода данных в связующую
таблицу.
Задание 3.6.
Дополните форму ввода книг указанием авторов, которые эту книгу написали.
Фамилии авторов вводить из тех, кто уже есть в БД, с использованием
выпадающего списка (комбо-бокс) с множественным выбором. Первой строкой
списка задать опцию «Без авторов», в остальные занести фамилии авторов
из БД. Файл с формой сохранить под именем 3_3_2_F.php. Создать файл
3_3_2.php для обработки данной формы. При обработке учесть, если была
выбрана опция «Без авторов», то данные в таблицу rel_2 вводить не надо.
При выполнении задания помнить, что выпадающий список формируется
с использованием следующих тегов-контейнеров:
<select name="autors">
<option value="No"> Нет авторов </option>
<option value="1"> Кодд</option>
…
</select>
Для того, чтобы можно было бы выбирать несколько строк из выпадающего
списка, требуется в открывающем теге указать свойство multiple. Кроме того, при
достаточно длинном списке можно задать максимальное число видимых
выпадающих элементов size=«5».
8
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Должна получиться форма вида (рис.3.6).
Рис. 3.6. Внешний вид комплексной формы для ввода данных о книгах
Предъявите выполненную работу преподавателю и получите по ней зачет.
9
Download