Содержание
Zend_Db_Adapter
является абстрактным слоем доступа к
интерфейсу БД для Zend Framework. Вы можете использовать основанный
на PDO Zend_Db_Adapter
для подключения и работы с любой
СУБД, поддерживающей SQL, используя один и тот же интерфейс. В число
таких СУБД входят Microsoft SQL Server, MySQL, PostgreSQL, SQLite и
другие.
Для того, чтобы создать экземпляр Zend_Db_Adapter
для
вашей конкретной СУБД, вам нужно вызвать метод
Zend_Db::factory()
с именем адаптера и массивом
параметров, описывающих соединение. Например, подключение к
базе данных MySQL "camelot" на локальном хосте под именем
пользователя "malory":
<?php require_once 'Zend/Db.php'; $params = array ('host' => '127.0.0.1', 'username' => 'malory', 'password' => '******', 'dbname' => 'camelot'); $db = Zend_Db::factory('PDO_MYSQL', $params); ?>
Подключение к базе данных SQLite "camelot" производится аналогичным образом:
<?php require_once 'Zend/Db.php'; $params = array ('dbname' => 'camelot'); $db = Zend_Db::factory('PDO_SQLITE', $params); ?>
И в том, и в другом случае вы можете использовать один и тот же API для того, чтобы производить запросы к базе данных.
Вы должны всегда заключать в кавычки значения, которые подставляются
в оператор SQL — это поможет предотвратить атаки посредством
SQL-инъекций. Zend_Db_Adapter
предоставляет два метода
(посредством включенного объекта PDO) для облегчения
самостоятельного заключения значений в кавычки.
Первый из них — метод 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"' // (разделенная запятыми строка) ?>
Вторым является метод 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")' // (разделенная запятыми строка) ?>
Имея экземпляр Zend_Db_Adapter
, вы можете выполнять
запросы непосредственно в SQL. Zend_Db_Adapter
переадресует эти запросы базовому объекту PDO, который
подготавливает и выполняет их,
затем возвращает объект PDOStatement
для ваших
манипуляций с результатами (если они есть).
<?php // создается объект $db и затем производится запрос к БД // с оператором SQL, в который подставлено значение с заключением в кавычки $sql = $db->quoteInto( 'SELECT * FROM example WHERE date > ?', '2006-01-01' ); $result = $db->query($sql); // используется PDOStatement $result, // чтобы извлечь все строки результата в массив $rows = $result->fetchAll(); ?>
Вы можете автоматически связывать все данные в вашем запросе. Это означает, что вы можете устанавливать в запросе именованные метки заполнения и затем передавать массив данных, замещающих эти метки. В замещающие данные автоматически заключаются в кавычки, обеспечивая защиту от атак с применением SQL-инъекций.
<?php // создается объект $db и затем делается запрос к БД // на этот раз используется связывание меток заполнения $result = $db->query( 'SELECT * FROM example WHERE date > :placeholder', array('placeholder' => '2006-01-01') ); // используется PDOStatement $result, // чтобы извлечь все строки результата в массив $rows = $result->fetchAll(); ?>
Возможно, вы захотите подготавливать и связывать данные в операторах
SQL вручную. Для этого используйте метод prepare()
для
получения подготовленного PDOStatement
, с которым вы
можете работать непосредственно.
<?php // создается объект $db и затем делается запрос к БД // на этот раз подготавливается PDOStatement для связки значений вручную $stmt = $db->prepare('SELECT * FROM example WHERE date > :placeholder'); $stmt->bindValue('placeholder', '2006-01-01'); $stmt->execute(); // используется PDOStatement $result, // чтобы извлечь все строки результата в массив $rows = $stmt->fetchAll(); ?>
По умолчанию PDO (и, соответственно, Zend_Db_Adapter
)
находится в режиме автоматического завершения транзакций
(auto-commit). Это означает, что все изменения
сохраняются, как только они выполнены. Если вы хотите выполнять
операторы внутри транзакций, просто вызывайте метод
beginTransaction()
, затем commit()
для сохранения изменений или rollBack()
для
отмены изменений. Zend_Db_Adapter
вернется в режим
автоматического завершения транзакций до тех пор, пока вы снова не
вызовете beginTransaction()
.
<?php // создается объект $db и затем устанавливается начало транзакции $db->beginTransaction(); // попытка сделать запрос // если запрос успешен, то фиксация изменений // если неудача, то откат try { $db->query(...); $db->commit(); } catch (Exception $e) { $db->rollBack(); echo $e->getMessage(); } ?>
Вы можете использовать метод insert()
для создания
оператора INSERT и связки данных для вставки. Данные для связывания
автоматически заключаются в кавычки для предотвращения атак с
использованием SQL-инъекций.
Возвращаемое значение не является последним
сгенерированным идентификатором, поскольку таблица может не иметь
столбцы с автоинкрементом. Вместо этого возвращается количество
затронутых строк (обычно 1). Если вы хотите получать идентификатор
последней добавленной записи, вызывайте после вставки метод
lastInsertId()
.
<?php // // INSERT INTO round_table // (noble_title, first_name, favorite_color) // VALUES ("King", "Arthur", "blue"); // // создается объект $db // массив данных для подстановки в формате 'имя столбца' => 'значение' $row = array ( 'noble_title' => 'King', 'first_name' => 'Arthur', 'favorite_color' => 'blue', ); // таблица, в которую должна быть вставлена строка $table = 'round_table'; // вставка строки и получение ID строки $rows_affected = $db->insert($table, $row); $last_insert_id = $db->lastInsertId(); ?>
Вы можете использовать метод update()
для создания
оператора UPDATE и присвоения данных для обновления. Данные
для связывания автоматически заключаются в кавычки для
предотвращения атак с использованием SQL-инъекций.
Вы можете передавать необязательное предложение WHERE для определения того, какие строки следует обновить.
<?php // // UPDATE round_table // SET favorite_color = "yellow" // WHERE first_name = "Robin"; // // создается объект $db // новые значения для установки в update, в формате 'имя столбца' => 'значение'. $set = array ( 'favorite_color' => 'yellow', ); // таблица для обновления $table = 'round_table'; // условие WHERE $where = $db->quoteInto('first_name = ?', 'Robin'); // обновление таблицы и получение количества затронутых строк $rows_affected = $db->update($table, $set, $where); ?>
Если у вас есть несколько предложений WHERE, которые нужно применить
к запросу UPDATE, то вы можете передавать массив таких предложений
методу update()
. Эти предложения объединяются через
оператор AND. Объединение предложений через оператор OR должно
производиться вручную:
<?php $set = array('favorite_color' => 'yellow'); // несколько условий, объединяемых через AND $where = array( $db->quoteInto('first_name = ?', $firstName), $db->quoteInto('noble_title = ?', $nobleTitle) ); $count = $db->update('round_table', $set, $where); // несколько условий, объединяемых через OR $firstNameOne = $db->quote($firstNameOne); $firstNameTwo = $db->quote($firstNameTwo); $where = "first_name = $firstNameOne OR first_name = $firstNameTwo"; $count = $db->update('round_table', $set, $where); ?>
Замечание | |
---|---|
Значения и идентификаторы предложений WHERE не заключаются в
кавычки автоматически. Если у вас есть значения или
идентификаторы, требующие заключения в кавычки, то вы должны
произвести его самостоятельно. Используйте методы
|
Вы можете использовать метод delete()
для создания
оператора DELETE. Методу можно передавать необязательное предложение
WHERE для указания того, какие строки следует удалить.
<?php // // DELETE FROM round_table // WHERE first_name = "Patsy"; // // создается объект $db // таблица для удаления $table = 'round_table'; // условие WHERE $where = $db->quoteInto('first_name = ?', 'Patsy'); // удаление из таблицы и получение количества затронутых строк $rows_affected = $db->delete($table, $where); ?>
Как и в случае метода
update()
,
вы можете использовать массив предложений WHERE для аргумента
$where
метода delete()
.
Замечание | |
---|---|
Значения и идентификаторы предложений WHERE не заключаются в
кавычки автоматически. Если у вас есть значения или
идентификаторы, требующие заключения в кавычки, то вы должны
произвести его самостоятельно. Используйте методы
|
Несмотря на то, что вы можете делать запросы непосредственно к БД с
помощью метода query()
, зачастую все, что вам нужно
сделать, — выполнение оператора SELECT и получение результатов.
Набор методов fetch*()
предназначен для этого.
Для каждого из этих методов вы передаете SQL-оператор SELECT. Если
вы используете именованные метки замещения, то можете передавать
также массив значений связывания для замещения в данном операторе с
заключением в кавычки. Методами fetch*()
являются:
fetchAll()
fetchAssoc()
fetchCol()
fetchOne()
fetchPairs()
fetchRow()
<?php // создается объект $db // извлечение всех столбцов и всех строк в виде индексного массива $result = $db->fetchAll( "SELECT * FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // извлечение всех столбцов и всех строк в виде ассоциативного массива // первый столбец используется как ключ массива $result = $db->fetchAssoc( "SELECT * FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // извлечение одного столбца для всех строк $result = $db->fetchCol( "SELECT first_name FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // извлечение одного значения $result = $db->fetchOne( "SELECT COUNT(*) FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // извлечение последовательности пар ключ-значение; // первый столбец является ключом массива, // второй - значением массива $result = $db->fetchPairs( "SELECT first_name, favorite_color FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // извлечение только одной строки $result = $db->fetchRow( "SELECT * FROM round_table WHERE first_name = :name", array('name' => 'Lancelot') ); ?>