Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web - tec / PHP 5 для начинающи

.pdf
Скачиваний:
71
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

782 Приложение В

же, использование ключевых слов PRIMARY KEY для поля типа INTEGER имеет побоч+ ный эффект ++++++ это поле определяется как поле с автоинкрементными значениями.

Когда SQLite принимает SQL+оператор INSERT для таблицы и значение поля book_id равно NULL или не определено, в это поле вставляется следующее целое зна+ чение. Если автоинкрементные типы не подходят, то это препятствие можно легко обойти, вставляя собственные значения. SQLite свободно пропускает эти значения и переходит к следующей значимой инструкции.

Запустите сценарий в браузере. На рис. В.1 показаны сообщения, которые должны появиться на странице.

Рис. В.1.

Форма ввода данных

SQLite пока еще ничего ‘‘не знает’’ о персональной библиотеке. Поэтому первый повторно используемый блок кода получает от пользователей данные о книгах и встав+ ляет эти данные в таблицу books.

Здесь нет ничего нового, если вы изучили главы о работе с базами данных. Главное отличие заключается в замене слова mysql_ в именах функций на sqlite_. Сами SQL+операторы идентичны тем, которые использовались для MySQL. Это часть хо+ рошо продуманного стандарта. Последствия такой гибкости просто удивительные. Конечно, существуют некоторые отличия в реализациях SQL этих СУРБД, но изучив одну гибкую систему, вы сможете без труда разобраться с другими.

Ниже приведен код сценария books_insert.php:

Использование 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 />

784 Приложение В

<input type="text" name="form_score"><br />

Книга выдана:<br />

<input type="text" name="form_loan"><br />

<input type="submit" name="action" value="Записать"><br />

</form></p>

<p><a href="index.php">На главную страницу библиотеки.</a></p> </body>

</html>

На рис. В.2 показан вид начальной страницы до того, как пользователь ввел данные. Теперь можно ввести некоторые данные по книгам, чтобы протестировать после+

дующие сценарии.

Рис. В.2.

Использование 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()).

ODBC 791

Эти функции наряду с аналогичными функциями для MySQL+ и PostgreSQL+баз данных встроены в PHP и не являются ODBC+функциями. Однако они выполняют ту же работу, что и ODBC+функции (например, odbc_connect(), odbc_exec() и odbc_close()), хотя и несколько быстрее, чем ODBC+функции. Поэтому если в PHP имеются встроен+ ные функции для запуска SQL в определенной базе данных, то применять следует имен+ но их; они, скорее всего, будут быстрее и эффективнее, кроме того, они позволяют ис+ пользовать специфические для базы данных возможности, доступа, которые ODBC не предоставляет. Если такие функции в PHP отсутствуют, то высока вероятность того, что существует ODBC+драйвер, который можно использовать в PHP+приложении.

ODBC-функции в PHP

В приведенной ниже таблице представлено описание распространенных ODBC+ функций PHP.

ODBC-функции

Описание

odbc_connect() и Если предположить, что база данных уже создана, первое, что следует odbc_pconnect() сделать, это создать подключение к этой базе данных, через которое

можно отправлять ей команды и получать результаты. Эта функция создает подключение, используя переданное ей имя источника данных (DSN), а также имя пользователя, пароль и необязательный тип курсора. Если база данных не требует имени пользователя и пароля, то соответствующие параметры можно не указывать. Функция odbc_pconnect() работает аналогично odbc_connect(),

за исключением того, что соединение остается постоянно открытым и впоследствии при необходимости его можно использовать снова; это обычно сокращает время доступа к базе данных

odbc_close(), odbc_close_all() и odbc_free_result()

odbc_exec(), odbc_execute и odbc_prepare

odbc_num_rows()

Функции odbc_close() и odbc_close_all() закрывают соединение. Эти функции в качестве параметра принимают идентификатор соединения (полученный от odbc_connect()). Функция odbc_free_result() высвобождает все ресурсы, связанные с возвращенным результатом, и часто используется перед закрытием соединения, чтобы гарантировать, что для остальных частей сценария имеется достаточно доступной памяти

Функция odbc_exec() принимает идентификатор соединения и SQLзапрос, отформатированный в виде строки, после чего подготавливает и выполняет этот запрос. Некоторые запросы, такие как INSERT, UPDATE и DELETE, не возвращают результирующих множеств, и поэтому могут запускать эту функцию самостоятельно. Запрос SELECT должен возвращать результаты, поэтому результирующее множество можно записать в переменную, чтобы использовать результаты для последующей обработки в PHP-приложении. Работу функции odbc_exec() можно разделить на две части, используя функцию odbc_prepare() перед функцией odbc_execute(). Примечание:

функция odbc_do() аналогична функции odbc_exec()

Часто после получения результирующего множества необходимо узнать количество строк в нем. Например, если используется SELECTзапрос для выборки всех записей о заказах для определенного клиента, можно получить количество этих записей, просто передав результирующее множество в качестве аргумента функции odbc_num_rows()

Соседние файлы в папке web - tec