'

Работа с БД в Zend

Понравилась презентация – покажи это...





Слайд 0

Работа с БД в Zend Лекция №4 Модель Классы Zend_Db_Table и Zend_Config Запросы Свойства и методы таблицы


Слайд 1

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


Слайд 2

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


Слайд 3

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


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

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


Слайд 8

Создание таблицы Мы будем использовать базу данных 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');


Слайд 9

Запросы Объектно-ориентированные методы для "покусочного" построения SQL-запросов; Заключение в кавычки идентификаторов и значений для снижения угрозы атак с использованием SQL-инъекций. Для очень простых запросов SELECT обычно проще указать SQL-запрос целиком в виде строки и выполнить его, используя такие методы адаптера, как query() или fetchAll() При помощи класса Zend_Db_Select При помощи прямых SQL -запросов


Слайд 10

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


Слайд 11

Свойства таблицы Указывайте таблицу, для которой определен этот класс, используя защищенную переменную $_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'; }


Слайд 12

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


Слайд 13

Вставка строк Для того, чтобы вставить новую строку в свою таблицу, просто вызывайте insert() с ассоциативным массивом из пар "имя столбца": "значение". В данные будут автоматически добавлены кавычки; метод возвращает последний добавленный ID. (Обратите внимание на то, что этим он отличается от Zend_Db_Adapter::insert(), который возвращает количество затронутых строк.) <?php // 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); ?> Методы


Слайд 14

Обновление строк Для того, чтобы обновить любое количество строк в своей таблице, вызывайте update() с ассоциативным массивом из пар "имя столбца": "значение для установки", наряду с этим передается условие WHERE для определения, какие строки дожны быть обновлены. Метод обновит таблицу и вернет количество затронутых строк. В данные для установки будут будут автоматически добавлены кавычки, но это не относится к условию WHERE, поэтому вам нужно самим добавить кавычки с помощью принадлежащего таблице объекта Zend_Db_Adapter. <?php // // 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); ?>


Слайд 15

Удаление строк Для того, чтобы удалить любое количество строк в своей таблице, вызывайте delete() с условием WHERE для определения, какие строки должны быть удалены. Метод будет возвращать количество удаленных строк. В условие WHERE не добавляются кавычки за вас, поэтому вам нужно самим добавить кавычки с помощью объекта Zend_Db_Adapter таблицы. <?php // // 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); ?>


Слайд 16

Извлечение одной строки Несмотря на то, что вы можете использовать метод find() для поиска строк по их первичным ключам, часто вам нужно добавлять различные условия, когда извлекате строки. Zend_Db_Table предоставляет fetchRow() только для этой цели. Вызывайте fetchRow() с условием WHERE (и необязательно условием ORDER), и Zend_Db_Table вернет Zend_Db_Table_Row, который будет с первой строкой, удовлетворяющей вашим условиям. Заметьте, что в условие WHERE не добавляются кавычки за вас, поэтому вам нужно самим добавить кавычки с помощью объекта Zend_Db_Adapter таблицы. <?php // // 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); ?>


Слайд 17

Извлечение множества строк Если вам нужно получить больше одной строки за раз, используйте метод fetchAll(). Как и fetchRow(), он принимает условия WHERE и ORDER, но, кроме этого, принимает еще количество строк и смещение для ограничения количества возвращаемых строк. Метод будет возвращать объект Zend_Db_Table_Rowset с выбранными строками. <?php 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); ?>


Слайд 18

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


Слайд 19

Первый из них - метод quote(). Он должным образом добавит кавычки в скалярное значение в соответствии с вашим адаптерои БД. Если вы пытаетесь добавить кавычки в массив, то метод вернет строку из значений массива, разделенных запятыми и с добавленными кавычками (это полезно для функций, которые принимают список параметров). <?php // создается объект $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"' // (разделенная запятыми строка) ?>


Слайд 20

Вторым является метод quoteInto(). Вы передаете в него строку-основу с указанием меток заполнения в виде вопросительных знаков и после одно скалярное значение, либо массив для подстановки с добавлением кавычек в строку-основу. Это полезно для построения запросов и условий в порядке следования. Скалярные значения и массивы обрабатываются точно так же, как в методе quote(). <?php // создается объект $db, предполагается, что адаптером является Mysql // подстановка скалярного значения в условие WHERE $where = $db->quoteInto('id = ?', 1); // значением $where сейчас является 'id = "1"' // (обратите внимание на окружающие кавычки) // подстановка массива в условие WHERE $where = $db->quoteInto('id IN(?)', array(1, 2, 3)); // значением $where сейчас является 'id IN("1", "2", "3")' // (разделенная запятыми строка) ?>


×

HTML:





Ссылка: