До сих пор мы рассматривали код РНР, который составляет стандартную часть практически всех проектов, основанных на JPSpan. Теперь нам предстоит написать класс бизнес-логики, обрабатывающий данные в соответствии с потребностями конкретного приложения. В данном примере класс является представлением заказчика. Он обладает единственным методом getAdressFromEmail(), который принимает адрес электронной почты и возвращает массив, содержащий адрес заказчика.
Основная цель класса - по электронному адресу, введенному заказчиком при выполнении покупки в интернет-магазине, получить доставки товара из базы данных и автоматически заполнить поля фермы. Поскольку обращение к базе данных может занимать время, это идеальный случай для выбора асинхронного режима наполнения запросов. Пока клиент заполняет другие поля формы за, информация о нем будет извлекаться обращением к серверу.
Синтаксис описания классов в РНР очень похож на синтаксис такта языков программирования, как С++, Java и С#. Во всех этих ЯЗЫКЕ описание класса начинается с ключевого слова class:
class Customer {
public function getAddressFromEmail($email) {
// Здесь находится реализация метода
>
}
Метод getAddressFromEmail() будет устанавливать соединение с база! данных и извлекать данные с помощью простого запроса SQL.
В реальных приложениях программный код, выполняющий доступ к базе явных, следует размещать в отдельных классах, а параметры доступа г 5ЕЖ данных - в конфигурационном файле. Однако наш класс созданных в целях и содержит весь необходимый код в себе самом.
В главе 2 вы видели, как используются библиотечные методы для к базе данных MySQL. В этом примере для соединения с данных мы обратимся к библиотеке ADO.
В примере фигурирует СУБД MS SQL Server, а сценарии, создающие таблицы, доступны для скачивания с сайта книги вместе со всеми файлами примера. Существует также альтернативная версия для базы данных Micrsoft Access, которая не требует наличия серверного программного обеспечения СУБД; для ее запуска достаточно скопировать Sales. mdb в каталог, где находится веб-страница.
База данных Sales содержит всего одну таблицу. Структура таблицы показана .
Таблица имеет целочисленное поле, по которому построен ключ, два строковых поля для хранения имен и фамилии заказа и строковое поле для хранения электронного адреса. Остальные строковых полей содержат адрес заказчика.
В самом начале метода getAddressFromEmail() объявляется массив $add-ress, в котором будут храниться данные, извлеченные из базы данных;
public function getAddressFromEmail($eniail) {
Saddress = arrayC'success" => FALSE);
В массиве инициализируется элемент с именем success, который будет служить признаком успешного завершения поиска заданного электронного адреса в базе данных. Далее используется класс СОМ для создания экземпляра соединения Adodb. Connection:
public function getAddressFromEmail($email) {
$address = arrayC'success" => FALSE); $conn = new C0M("Adodb.Connection");
Поскольку доступ к базе данных реализован на основе объекта СОМ, он будет работать только на серверах, функционирующих под управлением Windows. Для других платформ наиболее подходящей альтернативой может служить MySQL
Чтобы открыть соединение, необходимо заранее знать тип базы и ее местоположение. Эта информация передается методу в строки подключения. Формат строки изменяется в зависимости о: i па базы данных. Строка подключения к MS SQL Server должна содержать сетевое имя сервера, на котором находится СУБД. В данном это строка localhost, поскольку СУБД SQL Server установлен на той же машине, что и веб-сервер. Кроме того, в строке подключены должна быть информация об имени базы данных или названии, а также имени пользователя и пароле. В нашем случае достаточно иметь доступ только для чтения.
SdoConnString = "Provider=SQLOLEDB; Data Source='localhost'; "
. "Initial Catalog='sales'; User Id='Test'; Password='test' $conn->connectionString = SdoConnString:
Чтобы не указывать имя пользователя и пароль, как вариант можно былс э использовать учетную запись веб-сервера (для IIS это обычно IUSR_) и дать ей право доступа к базе данных. Тогда строка подк'гч ния могла бы выглядеть так:
"Provider=SOLOLEDB; Data Source='localhost'; Initial Catalog='sales'; Integrated Security=SSPI;"
Следующий шаг - открытие соединения и исполнение простого загса SQL. Для начала с помощью функции str_replace() выполняет с: мена каждой одиночной кавычки в строке с электронным две одиночные кавычки, в противном случае может получиться SQL-запрос. Полученная строка с преобразованным адресом сохраняется в переменной safeEmail. После этого safeEmail вставляется в текст SQL-запроса, и запрос запускается! исполнение с помощью метода execute():
$conn->connectionString = SdbConnString; $conn->open();
SsafeEmail = str_replace( Л". 'VY', Semail);
$rs = $conn->execute("SELECT * FROM tblCustomer WHERE Email = 'SsafeEma.-
Опятъ же с целью упрощения примера строка запроса SQL создается исполнения. В реальном приложении желательно было бы получать информацию с помощью хранимой процедуры и передавать ей адрес в качестве входного аргумента.
Метод execute() возвращает Adodb. recordset, ссылка на который в переменной $rs:
$rs = $conn->execute("SELECT * FROM tblCustomer WHERE Email = 'SsafeEma: if (!$rs->E0F) {
$address['success'] = TRUE; $address['forenames'] - $rs->fields(1)->value;
$aridress['surname'] = $rs->fields(2)->value; $address['addressl'] = $rs->fields(4)->value; $address['address2'] = $rs->fields(5)->value; $address['address3'] = $rs->fields(6)->value; $address['addressTown'] = $rs->fields(7)->value; $address['addressStateCcunty'] = $rs->fields(8)->value; $address['addressZipPC] = $rs->fields(9)->value; $address[ addressCountry'] = $rs->fields(10)->value;
)
Adodb. Recordset - это класс, хранящий результаты выполнения SQL-запроса на выборку данных. Он обладает методами, позволяющими выполнить обход полученных строк, а также свойствами, посредством которых можно получить доступ к названиям полей, их типам и значениям.
Объект Recordset обладает свойством EOF, название которого происходит от End of File (конец файла). Если в этом свойстве содержится значение false, значит, из базы данных была получена по крайней мере одна строка. Поэтому в поле success массива address записывается значение TRUE.
Затем из полученного набора данных в массив добавляются значения различных полей.
Массивы в РНР допускают возможность добавления именованных элементов, при этом не надо указывать какую-либо дополнительную информацию. Массивы также допускают возможность индексации целыми числами, при этом можно самому задать желаемый индекс или оставить его пустым. В последнем случае новый элемент будет добавлен в конец массива.
Далее закрываются оба объекта - Recordset и Connection, и в вызывающую программу возвращается массив $address:
$rs->close(); $conn->close(); return Saddress;
}
Как только сценарий будет готов, сохраните его под именем Customer-Server-JPSpan. php в подкаталоге JPSpanCustomer корневого каталога вебсервера.