Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР№8.doc
Скачиваний:
9
Добавлен:
01.05.2025
Размер:
240.13 Кб
Скачать

3. Создание приложения для доступа к бд

В каталоге xampp/htdocs создайте папку CMS. В папке CMS создайте файл View.php, определите содержание сценария (листинг 1).

echo '<h2>Форма для добавления книг</h2>';

echo '<form action="http://localhost/CMS/Model.php" method="post">';

echo 'Имя, Фамилия <br /><input type="text" name="author" /><br />';

echo 'Название <br /><input type="text" name="title" /><br />';

echo 'Количество страниц <br /><input type="text" name="pages" /><br />';

echo '<input name="insertBtn" type="submit" value="Отправить" />';

echo '<input type="reset" value="Отменить" />';

echo '</form>';

Листинг 1

Оператор echo обеспечивает вывод на экран констант, значений переменной или выражения и позволяет передавать обозревателю для интерпретации не только содержание, но разметку web-страницы. Приведенный в листинге 1 фрагмент кода PHP обеспечивает отображение формы для заполнения электронного каталога книг. В атрибуте action дескриптора form указан сценарий, который будет обрабатывать данные пользовательского ввода по нажатию на элемент управления типа submit. По нажатию кнопки типа submit все значения, введенные в элементы управления формы, заносятся в суперглобальную переменную-массив $_POST. Доступ к переданным значениям на стороне целевого сценария осуществляется по именам элементов управления формы-отправителя данных.

В папке xampp/htdocs/CMS создайте файл Model.php, предназначенный для обработки данных формы из файла View.php. Определите открывающий и закрывающий теги <?php и ?>. Между описателями вставьте содержание листинга 2.

$name=$_POST['author'];

$pages=$_POST['pages'];

$title=$_POST['title'];

Листинг 2.

В данном фрагменте данные, отправленные из формы, сохраняются в переменных $name, $pages, $title.

Ниже определения переменных добавьте содержание листинга 3.

$query="use store";

$result=mysql_query($query);

if(!$result) {

die("Файл ".__FILE__." строка ".__LINE__."Невозможно исполнить 1-ый запрос:

".mysql_error());

}

Листинг 3

В переменной $query сохраняется строка запроса. Команда use store предписывает MySQL использовать базу данных с именем store в последующих запросах по умолчанию. Указанная база данных остается в этом состоянии до конца данного сеанса или пока не будет выдана еще одна команда use. Функция mysql_query() посылает один запрос активной БД сервера. Второй необязательный аргумент для mysql_query() представляет собой соединение запроса. Если он опущен, как в приведенном выше примере, то используется последнее открытое соединение. Последним активным соединением в данном случае является соединение, описание которого сохранено в переменной $connection файла db_login.php.

Для запросов select, show, explain, describe mysql_query() возвращает указатель на результат или false в случае успешного или неудачного выполнения запроса соответственно. В остальных случаях, mysql_query() возвращает true в случае успешного запроса и false в случае ошибки.

Для обеспечения возможности добавления данных в таблицы используйте код листинга 4

$query="insert into books(title,pages) values('$title','$pages')";

$result=mysql_query($query);

$id=mysql_insert_id();

$query="insert into authors values(NULL,'$id','$name')";

$result=mysql_query($query);

Листинг 4

Для вставки данных в таблицу books применяется первый запрос insert.

Для добавления записи в таблицу authors, связанную с таблицей books по полю title_id, в переменной $id сохраняется последнее значение первичного ключа. Это значение автоматически генерируется для поля auto_increment путем вызова встроенной функции mysql_insert_id(). Функция mysql_insert_id() возвращает идентификатор, сгенерированный при последнем insert-запросе. Именно значение переменной $id и используется для добавления записи во вторую таблицу. Сохранять значение первичного ключа в переменной нужно незамедлительно, так как очередной запрос может изменить его значение и сделать неактуальным для связывания таблиц.

Во втором запросе insert в качестве первого значения указывается NULL, хотя данное поле в таблице является ненулевым и предназначено для хранения уникального идентификатора автора. При указании значения NULL в поля типа auto_increment(счетчик) и timestamp(время и дата) система управления БД MySQL вставляет в ячейку таблицы следующее по порядку целое число и текущую дату соответственно.

Для отображения результатов заполнения БД в начало файла Model.php добавьте определение функции output() листинг 5

function output(){

$query="select * from books natural join authors";

$result=mysql_query($query);

while($row = mysql_fetch_array($result, MYSQL_BOTH))

{

echo '<form action="Model.php" method="post">';

echo '<br />Номер записи в БД: '.$row[0].'<br />';

echo '<br />Имя, фамилия: '. $row[4].'<br />';

echo 'Название: '. $row[1]. '<br />';

echo 'Количество страниц: '.$row[2]. '<br />';

echo '<input type="submit" name="deleteBtn" value="Удалить" />';

echo '<input name="title_id" type="hidden" value='.$row[0].' />';

echo '</form>';

echo '<form action="View.php" method="post"> ';

echo '<input type="submit" name="editBtn" value="Редактировать" />';

echo '<input name="title_id" type="hidden" value='.$row['title_id'].' />';

echo '<input name="author" type="hidden" value="'.$row['author'].'" />';

echo '<input name="title" type="hidden" value="'.$row['title'].'" />';

echo '<input name="pages" type="hidden" value='.$row['pages'].' />';

echo '</form>';

}

}

Листинг 5

В переменной $query сохраняется строка запроса на выборку всех записей из двух связанных по одноименному полю таблиц. Ссылка на записи набора данных сохраняются после выполнения запроса в переменной $result.

Выводу на печать данных предшествует извлечение информации из результирующего набора данных. Извлечь данные можно построчно с использованием функций mysql_fetch_row() или mysql_fetch_array(). Функция mysql_fetch_row() обрабатывает один ряд результата запроса и возвращает неассоциативный массив, то есть массив данных одного ряда с числовыми индексами.  Последующие вызовы функции mysql_fetch_row() вернут следующие ряды или false, если рядов не осталось.

Функция mysql_fetch_array() обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба варианта. В функции mysql_fetch_array() в качестве первого аргумента указывается результирующий набор данных, в качестве второго необязательного – способ связывания данных. При указании в качестве значения второго аргумента MYSQL_ASSOC доступ к элементам массива осуществляется по названиям столбцов, при MYSQL_NUM – по числовым индексам, при MYSQL_BOTH – по названиям столбцов или по числовым индексам.

Цикл while обеспечивает вывод для каждой записи в БД по две формы. Первая форма предназначена для управления стиранием данных о книге, вторая - для редактирования. Различие в поведении форм определяется их адресацией на различные сценарии. Тип submit элемента управления input позволяет при нажатии на него передать введенные в форме данные для обработки сценарию, путь к которому указан с помощью атрибута action дескриптора form. При удалении необходимо передать в текущий сценарий Model.php идентификатор удаляемой записи с помощью элемента input. Его атрибуту value присваивается значение $row[0], соответствующее уникальному номеру записи информации о книге. Обратите внимание на то, что значение ключа $row[0] будет меняться с каждой итерацией while, но значение атрибута value при этом фиксируется. Путем указания значения hidden атрибута type элемент input name="title_id" скрывается от пользователя.

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

Для удаления записей добавьте в файл Model.php следующий ниже код

echo "Удаление записи ".$_POST['title_id'];

echo "<br />";

$query="delete from books where title_id=".$_POST['title_id']."";

$result=mysql_query($query);

if(!$result) {

die("Невозможно исполнить 1-ый запрос на стирание: ".mysql_error());

}

$query="delete from authors where title_id=".$_POST['title_id']."";

$result=mysql_query($query);

if(!$result) {

die("Невозможно исполнить 2-ой запрос на стирание: ".mysql_error());

}

С помощью переменной $_POST['title_id'] указывается уникальное значение удаляемого номера записи.

Добавьте ниже код, обеспечивающий редактирование записей:

echo "Обновление записи ".$_POST['title_id'];

$query="update books set title='".$_POST['title']."' where title_id=".$_POST['title_id'];

$result=mysql_query($query);

if(!$result) {

die("Невозможно обновить название: ".mysql_error());

}

$query="update books set pages=".$_POST['pages']." where title_id=".$_POST['title_id'];

$result=mysql_query($query);

if(!$result) {

die("Невозможно обновить количество страниц: ".mysql_error());

}

$query="update authors set author='".$_POST['author']."' where title_id=".$_POST['title_id'];

$result=mysql_query($query);

if(!$result) {

die("Невозможно обновить автора: ".mysql_error());

В файле View.php создайте отдельную форму для редактирования путем добавления к существующему коду следующего ниже фрагмента

echo 'Редактирование записи '.$_POST['title_id'];

echo '<h2>Форма для редактирования</h2>';

echo '<form action="http://localhost/CMS/Model.php" method="post">';

echo 'Имя, Фамилия <br /><input type="text" name="author" value="'.$_POST['author'].'" />

<br />';

echo 'Название <br /><input type="text" name="title" value="'.$_POST['title'].'" /><br />';

echo 'Кол-во страниц <br /><input type="text" name="pages" value='.$_POST['pages'].' />

<br />';

echo '<input name="editBtn" type="submit" value="Обновить" />';

echo '<input type="reset" value="Отменить" />';

echo '<input name="title_id" type="hidden" id="title_id" value='.$_POST['title_id'].' />';

echo '</form>';

Отличие формы для редактирования от формы для ввода заключается в инициализации значений атрибутов value элементов управления переданными методом post данными. После коррекции этих данных по нажатию на кнопку «Обновить» измененные данные, включая и идентификатор записи, вернутся в сценарий Model.php.

Для управлением процессом отображения нужной формы в начало файла View.php добавьте строку

$editBtn=$_POST['editBtn'];

В случае нажатия кнопки «Редактировать» в форме, отображаемой конструкциями echo файла Model.php значение true переменной $_POST['editBtn'], где editBtn – программное имя кнопки с надписью «Редактировать», будет передано сценарию View.php. Переданное значение сохраняется в переменной $editBtn. Обеспечьте отображение формы для редактирования при истинности условия ($editBtn) и формы для ввода в случае истинности выражения (!$editBtn).

Для реализации возможности не только ввода, но и редактирования, а также удаления данных необходимо управление отправлением соответствующих запросов к БД в файле Model.php. Добавьте перед инструкциями insert сценария Model.php фрагмент, указанный в листинге 6

$insertBtn=$_POST['insertBtn'];

$deleteBtn=$_POST['deleteBtn'];

$editBtn=$_POST['editBtn'];

Листинг 6

Определите условия для выполнения действий по добавлению, удалению и редактированию записей путем проверки условия нажатия соответствующего элемента управления. Кроме того, в конец каждого блока манипуляции с БД определите вызов функции, отображающей состояние БД после последних изменений. При этом код листинга 4 изменится следующим образом

if($insertBtn) {

$query="insert into books(title,pages) values('$title','$pages')";

$result=mysql_query($query);

$id=mysql_insert_id();

$query="insert into authors values(NULL,'$id','$name')";

$result=mysql_query($query);

output();

}

Отредактируйте блоки кода, выполняемые при удалении и редактировании записей по аналогии.

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

echo '<form action="View.php" method="post"> ';

echo '<input type="submit" value="Добавить книгу" />';

echo '</form>';

Подключите файл db_login.php в сценарии Model.php, добавив сразу же после определения функции output() строку

include('db_login.php');

Функция include() подключает указанный в кавычках (апострофах) файл. После присоединения файла программа получает доступ к переменным, функциям и классам, описанным в подключаемом ресурсе. В случае повторного подключения файла возникнет ошибка выполнения сценария. Для исключения необходимости проверки уникальности имен подключаемых файлов может быть использована функция include_once(). Этот вариант функции перед подключением выполняет проверку, не был ли подключен указанный файл ранее. Подключение выполняется только при отрицательном результате проверки.

Для подключения файлов могут применяться также функции require() и require_once(). Конструкции include() и require() отличаются реакцией на невозможность получения запрошенного ресурса. В случае недоступности файлов функции include() и include_once() выводят предупреждение и пытаются продолжить исполнение программы. Функции require() и require_once() в тех же обстоятельствах прерывают обработку данной страницы, то есть гарантируют подключение или прекращение выполнение сценария.