Работа с БД в Zend

Содержание

Слайд 2

Модель

Модель – основная логическая часть системы, которая относится к работе с данными.

Модель Модель – основная логическая часть системы, которая относится к работе с

Модели широко применимы в управляющей логике приложений, имеющих в своей основе базы данных.

Слайд 3

Взаимодействие Модель – Вид – Контроллер

Взаимодействие Модель – Вид – Контроллер

Слайд 4

Zend Framework Zend_Db_Table

Модель — базовая часть приложения, которая реализует его основные функции,

Zend Framework Zend_Db_Table Модель — базовая часть приложения, которая реализует его основные
следовательно, модель выполняет работу с базой данных.
Класс Zend Framework Zend_Db_Table используется для
поиска
вставки
обновления
удаления записей
и т.д.

Если в классе таблицы не были указаны первичные ключи, то эта таблица не может использоваться через Zend_Db_Table.

Слайд 5

Для использования Zend_Db_Table, понадобится сообщить ему, к какой базе данных, под каким

Для использования Zend_Db_Table, понадобится сообщить ему, к какой базе данных, под каким
именем пользователя и с каким паролем он будет обращаться. Принимая во внимание, что эту информацию предпочтительно не забивать в код, используем конфигурационный файл для ее хранения.
Zend Framework предоставляет для этой цели класс Zend_Config, обеспечивающий гибкий объектно-ориентированный доступ к конфигурационным файлам в форматах INI и XML.

Слайд 6

Пример Zend_Config

Пример файла config.ini:
Загружать конфигурационный файл из файла начальной загрузки
/index.php:
Zend_Loader::loadClass('Zend_Controller_Front'); Zend_Loader::loadClass('Zend_Config_Ini'); Zend_Loader::loadClass('Zend_Registry');
//

Пример Zend_Config Пример файла config.ini: Загружать конфигурационный файл из файла начальной загрузки
load configuration
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);
// setup controller

[general]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = rob
db.config.password = 123456
db.config.dbname = zftest

Слайд 7

Использование Zend_Db_Table

Для того, чтобы использовать класс Zend_Db_Table, нам понадобится передать в него

Использование Zend_Db_Table Для того, чтобы использовать класс Zend_Db_Table, нам понадобится передать в
параметра доступа к базе данных, которые были ранее загружены. Для этого необходимо создать объект Zend_Db и зарегистрировать его функцией Zend_Db_Table::setDefaultAdapter().
Пример (/index.php):
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Config_Ini');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');
// load configuration
$config = new Zend_Config_Ini('./application/config.ini', 'general'); $registry = Zend_Registry::getInstance();
$registry->set('config', $config);
// setup database
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);
// setup controller

Слайд 8

Создание нового класса

Zend_Db_Table — абстрактный класс, поэтому на его основе необходимо

Создание нового класса Zend_Db_Table — абстрактный класс, поэтому на его основе необходимо
создать специализированный класс-наследник. Имя нового класса не имеет принципиального значения, но такие классы стоит называть аналогично соответствующим им таблицам БД (это повысит уровень самодокументируемости кода). Например, для таблицы album имя класса будет Album.
Для того, чтобы передать в Zend_Db_Table имя таблицы, которой он будет управлять, необходимо присвоить это значение защищенному свойству класса $_name. Стоит отметить, что в классе Zend_Db_Table по-умолчанию всегда используется ключевое автоинкрементное поле таблицы с именем id. При необходимости значение имени этого поля так же можно менять.
Пример:
Класс Album будет храниться в директории моделей.
/application/models/Album.php:
class Album extends Zend_Db_Table {
protected $_name = 'album';} ?>

Слайд 9

Создание таблицы
Мы будем использовать базу данных MySQL, поэтому SQL запрос на создание

Создание таблицы Мы будем использовать базу данных MySQL, поэтому SQL запрос на
таблицы будет выглядеть так:
CREATE TABLE album (
id int(11) NOT NULL auto_increment, artist varchar(10 0) NOT NULL, title varchar(100) NOT NULL, PRIMARY KEY (id)
);

Добавление тестовой записи
Добавим несколько тестовых записей в таблицу для проверки функциональности главной страницы, на которой они в последствии должны отображаться.
INSERT INTO album (artist, title) VALUES
('James Morrison', 'Undiscovered'), ('Snow Patrol', 'Eyes Open');

Слайд 10

Запросы
Объектно-ориентированные методы для "покусочного" построения SQL-запросов;
Заключение в кавычки идентификаторов и значений

Запросы Объектно-ориентированные методы для "покусочного" построения SQL-запросов; Заключение в кавычки идентификаторов и
для снижения угрозы атак с использованием SQL-инъекций.

Для очень простых запросов SELECT обычно проще указать SQL-запрос целиком в виде строки и выполнить его, используя такие методы адаптера, как query() или fetchAll()

При помощи класса Zend_Db_Select

При помощи прямых SQL -запросов

Слайд 11

При построении запроса вы можете добавлять по одному его предложения. Предложение -

При построении запроса вы можете добавлять по одному его предложения. Предложение -
это часть SQL-оператора, не представляющая собой законченный оператор; например, предложение WHERE. Для каждого предложения есть свой метод Zend_Db_Select.
// Создание объекта Zend_Db_Select
$select = $db->select();
// Добавление предложения FROM
$select->from( ...определение таблицы и столбцов... )
// Добавление предложения WHERE
$select->where( ...определение критериев поиска... )
// Добавление предложения ORDER BY
$select->order( ...определение критериев сортировки... );

Слайд 12

Свойства таблицы

Указывайте таблицу, для которой определен этот класс, используя защищенную переменную $_name.

Свойства таблицы Указывайте таблицу, для которой определен этот класс, используя защищенную переменную
Переменная должна содержать имя таблицы в том виде, в котором она представлена в БД.
class bugs extends Zend_Db_Table_Abstract
{
// имя таблицы соответствует имени класса
}
Вы можете также объявить схему таблицы в защищенной переменной $_schema или через добавленное перед именем таблицы имя схемы в свойстве $_name. Схема, указанная с помощью свойства $_name, имеет более высокий приоритет, чем схема, объявленная с помощью свойства $_schema.
class Bugs extends Zend_Db_Table_Abstract
{
protected $_schema = 'bug_db';
protected $_name = 'bugs';
}

Слайд 13

Каждая таблица должна иметь первичный ключ. Вы можете объявить столбец для первичного

Каждая таблица должна иметь первичный ключ. Вы можете объявить столбец для первичного
ключа, используя защищенную переменную $_primary. Это может быть строка с именем одного столбца или массив имен столбцов, если первичный ключ является составным.
class Bugs extends Zend_Db_Table_Abstract
{
protected $_name = 'bugs';
protected $_primary = 'bug_id';
}
Если вы не задали первичный ключ, то Zend_Db_Table_Abstract пытается определить его, основываясь на данных, полученных через метод describeTable().

Слайд 14

Вставка строк

Для того, чтобы вставить новую строку в свою таблицу, просто вызывайте

Вставка строк Для того, чтобы вставить новую строку в свою таблицу, просто
insert() с ассоциативным массивом из пар "имя столбца": "значение". В данные будут автоматически добавлены кавычки; метод возвращает последний добавленный ID. (Обратите внимание на то, что этим он отличается от Zend_Db_Adapter::insert(), который возвращает количество затронутых строк.)
// INSERT INTO round_table
// (noble_title, first_name, favorite_color)
// VALUES ("King", "Arthur", "blue")
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$data = array(
'noble_title' => 'King',
'first_name' => 'Arthur',
'favorite_color' => 'blue',
)
$id = $table->insert($data);
?>

Методы

Слайд 15

Обновление строк

Для того, чтобы обновить любое количество строк в своей таблице, вызывайте

Обновление строк Для того, чтобы обновить любое количество строк в своей таблице,
update() с ассоциативным массивом из пар "имя столбца": "значение для установки", наряду с этим передается условие WHERE для определения, какие строки дожны быть обновлены. Метод обновит таблицу и вернет количество затронутых строк.
В данные для установки будут будут автоматически добавлены кавычки, но это не относится к условию WHERE, поэтому вам нужно самим добавить кавычки с помощью принадлежащего таблице объекта Zend_Db_Adapter.

//
// UPDATE round_table
// SET favorite_color = "yellow"
// WHERE first_name = "Robin"
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$set = array(
'favorite_color' => 'yellow',
)
$where = $db->quoteInto('first_name = ?', 'Robin');
$rows_affected = $table->update($set, $where);
?>

Слайд 16

Удаление строк

Для того, чтобы удалить любое количество строк в своей таблице, вызывайте

Удаление строк Для того, чтобы удалить любое количество строк в своей таблице,
delete() с условием WHERE для определения, какие строки должны быть удалены. Метод будет возвращать количество удаленных строк.
В условие WHERE не добавляются кавычки за вас, поэтому вам нужно самим добавить кавычки с помощью объекта Zend_Db_Adapter таблицы.

//
// DELETE FROM round_table
// WHERE first_name = "Patsy"
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto('first_name = ?', 'Patsy');
$rows_affected = $table->delete($where);
?>

Слайд 17

Извлечение одной строки

Несмотря на то, что вы можете использовать метод find() для

Извлечение одной строки Несмотря на то, что вы можете использовать метод find()
поиска строк по их первичным ключам, часто вам нужно добавлять различные условия, когда извлекате строки. Zend_Db_Table предоставляет fetchRow() только для этой цели. Вызывайте fetchRow() с условием WHERE (и необязательно условием ORDER), и Zend_Db_Table вернет Zend_Db_Table_Row, который будет с первой строкой, удовлетворяющей вашим условиям.
Заметьте, что в условие WHERE не добавляются кавычки за вас, поэтому вам нужно самим добавить кавычки с помощью объекта Zend_Db_Adapter таблицы.

//
// SELECT * FROM round_table
// WHERE noble_title = "Sir"
// AND first_name = "Robin"
// ORDER BY favorite_color
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto('noble_title = ?', 'Sir')
. $db->quoteInto('AND first_name = ?', 'Robin');
$order = 'favorite_color';
$row = $table->fetchRow($where, $order);
?>

Слайд 18

Извлечение множества строк

Если вам нужно получить больше одной строки за раз, используйте

Извлечение множества строк Если вам нужно получить больше одной строки за раз,
метод fetchAll(). Как и fetchRow(), он принимает условия WHERE и ORDER, но, кроме этого, принимает еще количество строк и смещение для ограничения количества возвращаемых строк. Метод будет возвращать объект Zend_Db_Table_Rowset с выбранными строками.

class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
// SELECT * FROM round_table
// WHERE noble_title = "Sir"
// ORDER BY first_name
// LIMIT 10 OFFSET 20
$where = $db->quoteInto('noble_title = ?', 'Sir');
$order = 'first_name';
$count = 10;
$offset = 20;
$rowset = $table->fetchAll($where, $order, $count, $offset);
?>

Слайд 19

Добавление кавычек против SQL-инъекций

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

Добавление кавычек против SQL-инъекций Вы должны всегда окружать кавычками значения, которые подставляются
оператор SQL - это поможет предотвратить атаки посредством SQL-инъекций. Zend_Db_Adapter предоставляет два метода (посредством включенного объекта PDO) для того, чтобы помочь вручную добавить кавычки.

Слайд 20

Первый из них - метод quote(). Он должным образом добавит кавычки в

Первый из них - метод quote(). Он должным образом добавит кавычки в
скалярное значение в соответствии с вашим адаптерои БД. Если вы пытаетесь добавить кавычки в массив, то метод вернет строку из значений массива, разделенных запятыми и с добавленными кавычками (это полезно для функций, которые принимают список параметров).

// создается объект $db, предполагается, что адаптером является Mysql
// добавление кавычек в строку
$value = $db->quote('St John"s Wort');
// значением $value сейчас является строка '"St John\"s Wort"'
// (обратите внимание на окружающие кавычки)
// добавление кавычек в массив
$value = $db->quote(array('a', 'b', 'c');
// значением $value сейчас является '"a", "b", "c"'
// (разделенная запятыми строка)
?>

Имя файла: Работа-с-БД-в-Zend.pptx
Количество просмотров: 101
Количество скачиваний: 0