web - tec / PHP 5 для начинающи
.pdfИспользование SQLite 783
<html>
<head>
<title>Персональная библиотека: добавление книги</title> </head>
<body>
<h1 align="center">Добро пожаловать в библиотеку</h1> <?php
Затем используется та же управляющая структура и метод сообщения об ошибках, который использовался при создании таблицы; фактически, эта часть кода просто скопирована:
if ($_POST['action'] == "Записать") { $libraryDB = "/var/sqlite/library";
if ($db = @sqlite_open($libraryDB, 0666, $error)) {
// Библиотека открыта. Вставляем данные с помощью SQL-оператора INSERT $sql = "INSERT INTO books(book_title, book_author,
book_pub_year, book_publisher, book_read, book_score, book_loan)
values('$_POST[form_title]', '$_POST[form_author]', '$_POST[form_pub_year]', '$_POST[form_publisher]', '$_POST[form_read]',
'$_POST[form_score]', '$_POST[form_loan]')";
if ( @sqlite_query($db, $sql) ) {
print ( '<p>Книга '. $_POST[form_title] . ' успешно добавлена в таблицу books.</p>' );
print('<p>При желании можно добавить другие книги.</p>');
} else {
print ( '<p>Книга не была добавлена '. $_POST['form_title'] . ' из-за ошибки:
<br />' . sqlite_error_string(sqlite_last_error ($db)) . '</p>' );
}
} else {
print ( '<p>SQLite-база данных library не была открыта из-за ошибки: <br />' . $error . '</p>' );
}
} else {
print ( '<p>Пожалуйста, введите информацию о книге. Поля название и автор обязательны</p>');
}
?>
Затем выводится простая HTML+форма независимо от того, выполнялась ли вставка данных. Это дает пользователю возможность легко ввести последовательно несколько книг. Кроме того, добавляется ссылка на главную страницу, даже если она еще не создана, поэтому заново вводить адрес сценария не придется:
<p><form action="books_insert.php" method="post"><br />
Введите название книги:<br />
<input type="text" name="form_title"><br />
Введите автора книги (имя и фамилию):<br />
<input type="text" name="form_author"><br />
Введите год издания<br />
<input type="text" name="form_pub_year"><br />
Введите название издательства:<br />
<input type="text" name="form_publisher"><br>
Вы уже прочли эту книгу?<br /> <select name="form_read"><br />
<option value="Да" SELECTED>Да</option><br /> <option value="Нет">Нет</option><br />
</select><br />
Присвойте книге рейтинг (от 1 до 5)<br />
Использование SQLite 785
Главная страница и листинг книг
Главная страница фактически решает две задачи. Во+первых, она предоставляет интерфейс к остальным функциям приложения, которые можно назвать панелью управления. Во+вторых, здесь перечислены книги, записанные в базу, а также предос+ тавляется возможность редактировать или удалять сведения о них. Это очень важный этап, поскольку несмотря на отсутствие ошибок в предыдущем сценарии, убедиться в работоспособности приложения вы сможете, только получив информацию, которая возвращается базой данных. Назовем этот сценарий index.php:
<html>
<head>
<title>Персональная библиотека: панель управления</title> </head>
<body>
<h1 align="center">Добро пожаловать в библиотеку</h1> <p><a href="books_insert.php">Добавить книгу</a></p>
Итак, пользователю предоставляется возможность добавить книгу в базу данных. Первые несколько строк PHP+кода как обычно создают подключение к базе дан+
ных и обрабатывают ошибки подключения:
<?php
$libraryDB = "/var/sqlite/library";
if ($db = @sqlite_open($libraryDB, 0666, $error)) {
Затем выполняется проверка того, как был вызван сценарий: с идентификацион+ ным номером книги (в этом случае сценарий удаляет книгу) или без. Если страница вызывается непосредственно, т.е. без GET+параметров, то этот блок кода не выполня+ ется. Если в строке запроса был передан номер книги, то соответствующая запись удаляется из базы данных, а пользователю возвращается страница с номером удален+ ной книги.
if ($_GET['id']) {
$sql = "DELETE FROM books where book_id = '$_GET['id']'";
if ( @sqlite_query($db, $sql)) {
print('<p>Запись ' . $_GET['id'] . ' успешно удалена</p>');
} else {
print ( '<p>Не удалось удалить запись ' . $_GET['id'] . ' из-за ошибки: <br />' . sqlite_error_string(sqlite_last_error($db)) . '</p>' );
}
}
Предположим, что этот блок кода выполняется без ошибок, тогда следующим эта+ пом будет вывод списка книг. SQL+оператор для SQLite такой же, как и для MySQL. Каждая последующая запись с помощью цикла while помещается в массив, а затем распечатывается список:
// Библиотека открыта с помощью INSERT-запроса $sql = "SELECT * FROM books";
if ( $result = sqlite_query($db, $sql) ) {
print('<p>В библиотеке ' . sqlite_num_rows($result) . ' книг.</p>'); while ($book = sqlite_fetch_array($result)) {
print ( '<p><strong>Книга:</strong> ' . $book[book_title] .
'<strong>Автор</strong>: ' . $book[book_author] . '<br />' .
'<strong>Издательство:</strong> ' . $book[book_publisher] . '; ' . $book[book_pub_year] . ' <strong>Прочитана:</strong> ' .
786 Приложение В
$book[book_read] .
' <strong>Рейтинг:</strong> ' . $book[book_score] . '<br />' . '<strong>Принадлежит:</strong> ' . $book[book_loan] . '<br />' .
Теперь необходимо добавить ссылки для редактирования и удаления записей:
'<a href="books_edit.php?id=' . $book[book_id] . '">Редактировать</a> |' . '<a href="index.php?id=' . $book[book_id] . '">Удалить</a></p>' );
}
} else {
print ( '<p>Не удалось прочитать таблицу books из-за ошибки:
<br />' . sqlite_error_string(sqlite_last_error($db)) . '</p>' );
}
} else {
print ( '<p>Не удалось открыть SQLite-базу данных library из-за ошибки: <br />' . $error . '</p>' );
}
?>
Код страницы завершается ссылкой для добавления новой книги и закрывающими HTML+тегами:
<p><a href="books_insert.php">Добавить книгу</a></p> </body>
</html>
Результат выполнения сценария показан на рис. В.3.
В следующем разделе описан код для редактирования записей.
Редактирование записи
Последний сценарий в приложении самый сложный, но несмотря на это в нем нет ни+ чего нового. Ниже приведен код сценария для редактирования записей books_edit.php:
<html>
<head>
<title>Персональная библиотека: редактирование записи</title> </head>
<body>
<h1 align="center">Добро пожаловать в библиотеку</h1> <?php
$libraryDB = "/var/sqlite/library";
if ($db = @sqlite_open($libraryDB, 0666, $error)) { // Библиотека открыта, выбираем операцию
if ($_GET['id']) {
Сначала выводится страница.
Страница books_edit.php всегда вызывается с идентификатором книги, кото+ рый можно включить в SQL+запрос. После того, как запрос вернет необходимую ин+ формацию, можно распечатать форму:
$sql = "SELECT * FROM books where book_id = '$_GET[id]'"; if ( $result = sqlite_query($db, $sql) ) {
$book = sqlite_fetch_array($result);
print("<p><form action=\"books_edit.php\" method=\"post\"><br />");
print("<input type=\"text\" name=\"form_id\" value=\"$_GET[id]\"><br />"); print("Введите название книги:<br />");
print("<input type=\"text\" name=\"form_title\" value=\"$book[book_title]\"><br />");
Использование SQLite 787
Рис. В.3.
print("Введите автора (имя и фамилию):<br />"); print("<input type=\"text\" name=\"form_author\"
value=\"$book[book_author]\"><br />"); print("Введите год издания<br />");
print("<input type=\"text\" name=\"form_pub_year\"
value=\"$book[book_pub_year]\"><br />"); print("Введите название издательства:<br />");
print("<input type=\"text\" name=\"form_publisher\"
value=\"$book[book_publisher]\"><br />"); print("Вы уже прочли эту книгу?<br />");
print("<select name=\"form_read\"><br />"); print("<option value=\"Да\"");
788 Приложение В
if ($book[book_read] == 'Да') { print("selected"); } print(">Да</option><br />");
print("<option value=\"Нет\"");
if ($book[book_read] == 'Нет') { print("selected"); } print(">Нет</option><br />");
print("</select><br />");
print("Назначьте книге рейтинг (от 1 до 5)<br />"); print("<input type=\"text\" name=\"form_score\"
value=\"$book[book_score]\"><br />"); print("Книга выдана:<br />");
print("<input type=\"text\" name=\"form_loan\" value=\"$book[book_loan]\"><br />");
print("<input type=\"submit\" name=\"action\" value=\"Обновить\"><br />");
print("</form></p>");
} else {
print ( '<p>Не удалось получить запись из-за ошибки:
<br />' . sqlite_error_string(sqlite_last_error($db)) . '</p>' );
}
В этом примере вся форма распечатывается с помощью PHP, но можно было бы ис+ пользовать HTML с включениями PHP+вызовов, как это делалось в других примерах.
После того как пользователь внесет необходимые изменения, сценарий получает значения из глобального массива $_POST и использует их в UPDATE+операторе, кото+ рый модифицирует соответствующие значения в базе данных:
} else if ($_POST[form_id]) {
$sql = "update books set book_title = '$_POST[form_title]', book_author = '$_POST[form_author]',
book_pub_year = '$_POST[form_pub_year]', book_publisher = '$_POST[form_publisher]', book_read = '$_POST[form_read]', book_score = '$_POST[form_score]', book_loan = '$_POST[form_loan]'
where book_id = '$_POST[form_id]'"; print $sql;
if (sqlite_query($db, $sql)) {
print ( '<p>Изменения были успешно внесены.</p>' );
} else {
print ( '<p>Не удалось обновить запись из-за ошибки: <br />' . sqlite_error_string(sqlite_last_error($db)) . '</p>' );
}
}
} else {
print ( '<p>Не удалось открыть SQLite-базу данных library из-за ошибки: <br />' . $error . '</p>' );
}
?>
<p><a href="index.php">На главную страницу библиотеки.</a></p> </body>
</html>
Приложение ‘‘Персональная библиотека’’ можно считать функционально завер+ шенным, хотя в нем отсутствуют некоторые функции, которые могли бы сделать его более удобным. Ниже перечислены возможные усовершенствования приложения в порядке от самого простого к самому сложному.
Исправить SQL+код в сценарии index.php так, чтобы записи сортировались и чтобы пользователь получил возможность выбирать порядок сортировки.
Использование SQLite 789
Используя функцию sqlite_escape_string(), сделайте операторы вставки и обновления более лояльными к специальным символам.
Используя функцию sqlite_num_rows() и SQL+предложение LIMIT, напиши+ те простую подпрограмму разбиения списка книг в index.php на страницы. Первая страница приложения может сбивать пользователей с толку, если на ней будет выводиться большое количество записей.
SQLite ++++++ отличный компактный инструмент. Несмотря на сравнительно молодой возраст, SQLite является довольно стабильной, мощной и функциональной техноло+ гией. Конечно, не все разработчики захотят переносить на нее свои приложения, но сам факт того, что поддержка SQLite включена в PHP, является надежным подтвер+ ждением качеств этой технологии. Теперь читатель имеет хорошие знания основ SQLite и может самостоятельно продолжать изучение этой технологии.
Ã
ODBC
ODBC, или Open DataBase Connectivity (открытый интерфейс доступа к базам дан+ ных), представляет собой разновидность API (application programming interface ++++++
программный интерфейс приложений), позволяющую использовать SQL (Structured Query Language ++++++ язык структурированных запросов) для работы с базами данных разных производителей. ODBC создает средний уровень (драйвер базы данных) между приложением и базой данных, позволяющий приложению отправлять базе данных SQL+команды (запросы), которые она может распознать и корректно обработать. На+ пример, чтобы использовать в PHP+приложении базу данных Access или SQL Server в качестве хранилища информации, можно задействовать ODBC+драйвер для форма+ тирования SQL+команд так, чтобы любая база данных распознавала эти команды и корректно отвечала на них. По существу, драйвер базы данных ODBC преобразовы+ вает SQL+команды в формат, понятный той или иной базе данных.
В этом приложении представлен перечень PHP+функций, которые можно исполь+ зовать в ODBC+совместимых базах данных (таких как Access и Microsoft SQL Server). Кроме того, здесь рассматривается пример создания имени источника данных (data source name, DSN) в Windows, а также пример PHP+приложения (odbc.php) для Windows, которое подключается к базе данных SQL Server. Эти примеры можно ис+ пользовать также для подключения к базам данных Access.
Общие ODBC-функции
Независимо от того, как осуществляется доступ к базе данных, некоторые дейст+ вия, такие как открытие соединения, запуск SQL+запроса и закрытие соединения, яв+ ляются обязательными. В главах 9++++11 рассматривались функции для подключения к базе данных (например, к базе данных MySQL или SQLite). В PHP (если расширение SQLite установлено статически или загружается динамически) имеются функции для открытия соединения с базой данных (sqlite_open()), запуска SQL+запроса (sqlite_array_query()) и закрытия соединения (sqlite_close()).