МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Практическая работа 4 Тема 2/4: Редактирование данных, хранимых в БД, с использованием интерактивных форм Цель — освоить технологию разработки интерактивных форм, пригодных для редактирования данных, хранимых в БД. Задание: 1. Освоить технологию замены одного конкретного поля в одной записи. 2. Освоить технологию создания интерактивной формы для замены множества полей одной записи в таблице. 3. Освоить технологию разработки универсального интерфейса для просмотра и редактирования множества записей в одной таблице. Теоретические сведения Изменение данных, хранящихся в БД, осуществляется оператором SQL-UPDATE, который имеет стандартный формат: UPDATE <имя таблицы> Set <имя поля1>=<значение1>, <имя поля2>=<значение2>,…, <имя поляN>=<значениеN> WHERE <условия отбора> Оператор изменения (обновления) данных позволяет изменить данные в одной либо в нескольких строках. Условия отбора строк, заданные в части WHERE, как раз и определяют те строки, в которых будут произведены указанные в начале оператора изменения. Следует заметить, что оператор изменения очень опасен в том случае, если вы не точно определите искомую строку или строки для изменения. Например, если надо изменить адрес читателя с номером читательского билета 2, то соответствующий запрос будет выглядеть следующим образом: Update reader set adres=”Новый адрес” Where NUM_READER=2 Для того, чтобы коррекция прошла успешно, необходимо передать не только изменяемые данные, но и условия отбора. Удобнее всего передавать первичный ключ, который однозначно идентифицирует строку конкретной таблицы. Запрос оформляется в виде строковой переменной и передается на исполнение функции Mysql_query(). Результатом работы функции является параметр, который равен числу изменяемых строк в случае успешного завершения операции, или 0 (FALSE), в случае ошибки. Фрагмент кода изменения будет выглядеть следующим образом: 1 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE $sql =”update reader set ADRES=’Новый адрес’ Where NUM_REAER=2”; $res=mysql_query($sql); If($res==0) {echo “ Произошла ошибка”; exit();} Echo “Изменено $res записей “; Если параметры SQL-запроса являются не константами, а переменными, то как и в предыдущих запросах их необходимо заключать в $num_reader=2; $adres=”Новый адрес”; $sql =”update reader set ADRES=’$adres’ Where NUM_REAER=$num_reader”; $res=mysql_query($sql); If($res==0) {echo “ Произошла ошибка”; exit();} Echo “Изменено $res записей “; Для того, чтобы более корректно выводилось сообщение об изменении, резонно применить тернарный оператор, который мы изучали в прошлом семестре, его формат: ( <условие> ? <оператор при истинном условии> : <оператор при ложном условии> ) Наше сообщение может быть оформлено в виде: echo ($res > 1 ? "Изменено $res записей" : "Изменена одна запись "); Задание 4.1. Написать скрипт, который изменяет Фамилию, у читателя с номером читательского билета 1 на «Главный А.А.». Сохранить скрипт в файле 4_1_1.php. Проверить результат работы написанного скрипта через phpMyAdmin в таблице Reader. Задание 4.2. Создать файл 4_1_2.php. Скопировать в него содержимое ранее созданного файла 4_1_1.php и изменить его таким образом, чтобы номер читательского билета и адрес передавались как параметры в строке запуска. Переменные в строке запроса задаются после знака ? в формате <имя переменной1>=<значение1>& <имя переменной2>=<значение 2> (Рис. 4.1). 2 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 4.1. Вызов скрипта с двумя передаваемыми параметрами Дополнить скрипт выводом содержимого таблицы Reader до изменения и после. Для вывода использовать ранее разработанную функцию print_tab(), которую пригрузить из соответствующего файла командой INCLUDE. Результат на рис.4.2. работы Вашего скрипта должен иметь вид, представленный Рис. 4.2. Результаты работы скрипта по заданию 1.2. Внимание! Значения переданных переменных предварительно надо расшифровать через глобальный массив $_GET[], а потом при подстановке в SQL запрос все параметры заключаются в одинарные кавычки! 3 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Задание 4.2. Использование диалоговых форм для изменения информации в БД Конечно, наиболее удобно видеть всю запись и прямо в нее внести все изменения. Для этого необходимо эту запись вывести в виде формы, в которую пользователь может внести изменения. В отличие от пустой html-формы в этой форме уже помещены данные той записи из БД, которую нам необходимо редактировать. Для того, чтобы организовать такую форму, мы должны выполнить соответствующий запрос и вывести всю информацию о требуемой записи в виде элементов формы типа input text. Формат одного элемента следующий: < INPUT TYPE="TEXT" name="<имя>" value=”значение”> Порядок формирования формы следующий: выполнить запрос на получение требуемой строки из таблицы; присвоить соответствующим переменным значения полей выбранной строки таблицы; вывести начальный элемент формы тег <Form ...>; организовать цикл для вывода всех полей таблицы в виде текстовых элементов формы Input text; вывести заключительный элемент формы тег </Form>. Рассмотрим пример формирования формы для редактирования таблицы Books. Сформировать запрос на поиск требуемой записи для редактирования: $sql=”select * from books where isbn= 0002”; Выполнить запрос $result= mysql_query($sql); if (mysql_error()){echo mysql_error();} Расшифровать результат запроса: while ($row=mysql_fetch_array($result)) { $isbn= $row["ISBN"]; $title=$row[“TITL”]; $pages=$row[“PAGES”]; $year_izd=$row[“YEARIZD”]; } Echo “<FORM action = 4.php method = POST>”; 4 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Echo “ISBN <INPUT TYPE=’TEXT’ name=’isbn’ value =$isbn> <br>” Echo “Название <INPUT TYPE='TEXT’ name=’titl’ value =$titl> <br>”; Echo “ Год издания <INPUT TYPE='TEXT’ name=’year_izd’ value=$year_izd> <br>”; Echo “ Страниц <INPUT TYPE='TEXT’ name=’pages’ value=$pages> <br>”; Echo “<INPUT TYPE=submit value= 'Изменить’> </form>”; Форма будет иметь внешний вид (рис. 4.3). Рис. 4.3. Внешний вид формы для редактирования записи таблицы books При нажатии на кнопку «Изменить» все вновь введенные значения полей формы будут переданы на сервер. Теперь их необходимо принять, расшифровать и выполнить соответствующий запрос на изменение. Мы помним, что данные из формы передаются по методу POST, поэтому они расшифровываются через глобальный массив $_POST[]. При формировании оператора обновления необходимо однозначно выделить изменяемую строку таблицы. Это мы делаем с использованием задания значения первичного ключа поля ISBN. Если мы считаем, что данное поле не может быть изменено, то необходимо его представить только в виде сообщения, а не изменяемого элемента формы <INPUT TEXT>. Порядок выполнения задания: 1. Создать файл 4_2_F.php, содержащий скрипт вывода требуемой записи таблицы books в виде формы, пригодной для редактирования. Номер выводимой записи передать в виде параметра. 2. Создать файл 4_2_1.php, который будет содержать скрипт обработки переданных в форме 4_2_F.php изменений. Предусмотреть в данном файле вывод содержимого таблицы books до внесения изменений и после внесения изменений. 5 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE 3. Отладить работу этих двух скриптов, задавая разные значения параметра ISBN. 4. Отредактировать файл 4_2_F.php таким образом, чтобы диалоговая форма выводилась в виде выровненной таблицы (рис.4.4.) Рис. 4.4. Форма редактирования книги, с выровненными полями Задание 4.4. При работе с данными удобнее всего не передавать параметр вызова формы для редактирования в командной строке, а передавать его непосредственно из скрипта. Одним из вариантов разработки подобного диалогового интерфейса будет следующий (рис. 4.5): 6 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 4.5. Вывод содержимого таблицы Books в виде таблицы с дополнительной кнопкой перехода в режим редактирования Функциональность такого интерфейса должна быть следующей: 1. При нажатии на кнопку «UP» вызывается форма для редактирования той записи, в которой и была нажата указанная кнопка (рис.4.4). 2. После редактирования управление передается файлу обработки записи, который содержит скрипт, вносящий все введенные изменения в БД. 3. После внесения изменений управление снова передается в форму вывода содержимого таблицы Books (рис. 4.5). Оформление затруднений. вывода содержимого в виде таблицы не должно вызвать 1. Сначала формируется заголовок, потом заголовок таблицы с использованием операторов вывода Echo или Print. 2. Потом проводится подключение к БД, формирование sql-запроса на вывод всех записей из таблицы Books. 3. Далее этот запрос отправляется на исполнение функцией mysql_query(). 4. Потом организуется цикл обработки результата и здесь каждая строка оформляется как строка таблицы, добавляя соответствующие теги в операторы вывода (рис. 4.6). 7 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 4.6. Код вывода содержимого books в виде таблицы 5. Теперь надо оформить кнопку «UP». Кнопка — это форма, значит в последний столбец таблицы надо занести теги формы, причем указать первичный ключ ISBN, который будет передан обработчику формы (рис. 4.4) в качестве параметра. Обработчик — это уже созданный нами ранее файл 4_2_F.php. Параметр передается по протоколу GET, поэтому фрагмент кода оператора, выводящего форму, выглядит следующим образом (рис. 4.7): Рис. 4.7. Фрагмент оператора вывода, формирующего кнопку «UP» в каждой строке таблицы Так как вся строка заключена в двойные кавычки, происходит интерпретация всех значений переменных, следовательно во фрагмент <FORM action = 4_2_F.php?isbn=$isbn method=POST> вместо имени переменной $isbn будет подставлено ее текущее значение. Фактически мы сформируем столько диалоговых форм, имеющих только одну кнопку, сколько у нас записей в таблице. 6. После вывода формы для редактирования необходимо вернуться снова в первоначальный экран, но уже с измененными данными. Для этого модифицируем код файла 4_2_1.php, сохраняем его под именем 4_3_2.php, удаляем операторы вывода содержимого таблицы books с использованием 8 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE функции print_tab, а в конец файла добавляем вызов исходного скрипта оператор header("location:books.php"); с учетом того, что исходный файл мы назвали books.php. Проверить работоспособность созданных скриптов. Задание. 4.5 (для самостоятельной работы) По аналогии с предыдущим заданием создать форму для вывода списка читателей в виде таблицы, добавив в последний столбец кнопку «UP» (рис. 4.8). Рис. 4.8. Внешний вид формы При выводе формы обратить внимание на расположение информации в столбце «Номер читательского билета» и «Изменить». В этих столбцах необходимо применить дополнительные атрибуты выравнивания в столбце. При нажатии кнопки «UP» предусмотреть вывод формы для редактирования выбранной записи таблицы READER. В форме Reader поле номер читательского билета не может быть изменено, так как это автоинкрементное поле (рис.4.9). 9 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 4.9. Внешний вид формы для редактирования данных о читателе После обработки внесенных изменений предусмотреть возврат в форму вывода всех записей. Отладить все подготовленные скрипты, предъявить выполненную работу преподавателю, получить зачет. 10