Доступ к базам данных
Подготовка базы.
Перед организацией системы доступа к базам данных, необходимо иметь эти базы. Далее рассматривается создание учебной базы данных, используемой в примерах.
Запустив монитор mysql и зарегистрировавшись в системе, создадим базу данных books:
mysql> create database books;
После входа в систему сначала потребуется определить базу данных, с которой необходимо работать. Это можно сделать, набрав:
mysql> use dbname;
где dbname — имя соответствующей базы данных.
Можно и не набирать команду use, но тогда следует указать базу данных при входе систему:
mysql dbname -h hostname -u username -p
В этом примере воспользуемся базой данных books:
mysql> use books;
Для соединения РНР-сценариев с MySQL потребуется настроить пользователя. В этом случае нужно применить принцип наименьших привилегий: зачем права сценариям?
В большинстве случаев сценариям понадобится проводить над строками таблиц только такие операции: SELECT, INSERT, DELETE и UPDATE. Можно поступить следующим образом:
mysql> grant select, insert, delete, update
-> on books.*
-> to bookorama identified by 'bookoramal23' ;
He забывайте о безопасности! Такой пароль, конечно, никуда не годится.
Следующий этап настройки базы данных — создание таблиц. Это делается при помощи SQL-команды CREATE TABLE.
SQL-код создания таблиц запускается следующим образом:
> mysql -h host -u bookorama books -p < books.sql
В данном случае очень удобно использовать переназначение файлов, поскольку предполагается, что до выполнения SQL-код редактируется в любом текстовом редакторе.
Листинг 6.5.books.sql - SQL-код создания таблицы для базы данных books
create table books ( isbn char(13) not null primary key, author char(30), title char(60), price float(4,2) );
Прежде чем приняться работать с базой данных, в ней необходимо сохранить какие-нибудь данные. Наиболее приемлемый способ предполагает использование оператора SQL INSERT.
Листинг 6.6.book_insert.sql — SQL-код для заполнения данными таблицу Books
use books; insert into books values ("0-672-31697-8", "Michael Morgan", "Java 2 for Professional Developers", 34.99) , ("0-672-31745-1", "Thomas Down", "Installing Debian GNU/Linux", 24.99), ("0-672-31509-2", "Pruitt, et al.", "Sams Teach Yourself GIMP in 24 Hours", 24.99), ("0-672-31769-9", "Thomas Schenk", "OpenLinux System Administration", 49.99);
Как работает архитектура Web-баз данных.
Распишем ее по шагам:
- Web-браузер пользователя выдает HTTP-запрос определенной Web-страницы. На¬пример, пользователь ищет в Book все книги, написанные Майклом Морганом, используя HTML-форму. Страница с результатами поиска будет называться results.php.
- Web-сервер принимает запрос на results.php, извлекает этот файл и передает на обработку механизму РНР.
- Механизм РНР приступает к разбору сценария. Сценарий содержит команду соединения с базой данных и выполнения запроса (поиска книг). РНР открывает соединение с MySQL-сервером и отправляет соответствующий запрос.
- Сервер MySQL принимает запрос к базе данных, обрабатывает его и отправляет результат (список книг) обратно механизму РНР.
- Механизм РНР завершает выполнение сценария, что обычно включает в себя форматирование результатов запроса в HTML. После этого результат в виде HTML возвращается Web-серверу.
- Web-сервер пересылает HTML в браузер, и пользователь имеет возможность просмотреть запрошенный список книг.
У нас имеется база данных MySQL, поэтому можем подготовить код РНР, чтобы выполнялись предыдущие шаги. Начнем с поисковой формы. Это простая HTML-форма. Код для этой формы показан в листинге 6.7.
Листинг 6.7.search.html — поисковая страница для базы данных Book
<html><head><title>Book Catalog Search</title> </head><body> <hl>Book Catalog Search</hl> <form action="results.php" method="post"> Choose Search Type:<br> <select name="searchtype"> <option value="author">Author <option value="title">Title <option value="isbn">ISBN </select> <br> Enter Search Term:<br> <input name="searchterm" type=text> <br> <input type=submit value="Search"> </form> </body> </html>
После того как пользователь нажмет на кнопке Search, вызывается сценарий results.php. Все это представлено в листинге 6.8. Далее мы рассмотрим, что делает упомянутый сценарий и как он работает.
Листинг 6.8.results.php - извлечение результатов запроса и форматирование их
<html><head><title>Book Search Results</title></head> <body> <hl>Book Search Results</hl> <? trim($searchterm); if (!$searchtype || !$searchterm) { echo "You have not entered search details. Please go back and try again."; exit; } $searchtype = addslashes($searchtype); $searchterm = addslashes($searchterm); @$db = mysql_pconnect("localhost", "bookorama", "bookorama"); if (!$db) { echo "Error: Could not connect to database. Please try again later."; exit; } mysql_select_db("books"); $query = "select * from books where ".$searchtype." Like '%".$searchterm."%'"; $result = mysql_query($query); $num_results = mysql_num_rows($result); echo "<p>Number of books found: ".$num_results."</p>"; for ($i = 0; $i <$num_results; $i ++) { $row = mysql_fetch_array($result); echo "<p><strong>".($i+l).". Title:"; echo htmlspecialchars( stripslashes($row["titie"])); echo "</strong><br>Author: "; echo htmlspecialchars (stripslashes($row["author"])); echo "<br>ISBN: echo htmlspecialchars (stripslashes($row["isbn"])); echo "<br>Price: " ; echo htmlspecialchars (stripslashes($row["price"] )); echo "</p>"; } ?> </body> </html>
Основные шаги выполнения запросов к базе данных через Web. В любом сценарии, который обеспечивает доступ к базе данных из Web, имеется несколько базовых шагов:
- Проверка и фильтрация данных, исходящих от пользователя.
- Установка соединения с требуемой базой данных.
- Передача запроса в базу данных.
- Получение результатов.
- Представление результатов пользователю.
То же самое делает и сценарий results.php, и сейчас мы исследуем каждый из этих этапов.