PDO константы атрибуты
Устанавливаются методами PDOObj->setAttribute() или PDOStatement->setAttribute(); или вообще указываются как параметры при создании нового объекта PDO:
$DB = new PDO('mysql:dbname=my_test;host=localhost', 'root','----', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
- PDO::ATTR_AUTOCOMMIT ( 0 )
- Доступно для драйверов: OCI, Firebird и MySQL Если её значение - FALSE, PDO пытается отключить автоматическую фиксацию так, что бы подключение автоматом начало транзакцию.
- PDO::ATTR_PREFETCH ( 1 )
- Установка максимального размера данных возвращаемых запросом. Позволяет Вам балансировать скорость и использование памяти для Вашего приложения. Не все драйвера и не всех баз данных поддерживают данную установку. При установке большого значения – увеличится скорость работы, но за счет более высокого потребления памяти.
- PDO::ATTR_TIMEOUT ( 2 )
- Устанавливает таймаут в секундах для соединения с базой данных.
- PDO::ATTR_ERRMODE ( 3 )
- Установка способа обработки ошибок:
PDO::ERRMODE_SILENT (0) – Это режим по умолчанию. PDO будет просто устанавливать код ошибки. Для получения более подробной информации вам потребуется обращаться к методам: PDO::errorCode() и PDO::errorInfo(), если ошибку вызвал объект класса PDO, или к PDOStatement::errorCode() или PDOStatement::errorInfo(), если косяк в объекте класса PDOStatement.
PDO::ERRMODE_WARNING (1) - В дополнение к установкам вывода ошибок, PDO будет выводить традиционные сообщение E_WARNING. Этот параметр полезен во время отладки - тестирования, если вы просто хотите видеть возникшие проблемы, не прерывая поток приложения.
PDO::ERRMODE_EXCEPTION (2) - В дополнение к установкам уровня вывода ошибок, PDO выбросит PDOException - исключение и задаст его свойства, так чтобы отразить код ошибки и сведения об ошибке. Этот параметр также полезен при отладке, так как он будет эффективно "останавливать" сценарий в точке ошибки, очень быстро указывая «пальцем» на потенциальные проблемы в вашем коде (Кстати, транзакции автоматически откатываются, если было выброшено исключение).
Режим исключений также полезен ещё и, потому, что вы можете структурировать обработку ошибок более четко, чем при традиционном стиле PHP - предупреждений и с меньшим количеством кода / вложенности, чем при дефолтном режиме, где требуется явно городить проверки возвращаемого значения при каждом обращении к базе. Вообще работа с исключениями это отдельная тема, о ней позже. На закуску: простая конструкция отлова PDO исключений:
try { // Здесь потенциально опасный код... использующий PDO $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } //Какая прелесть: PHP5 позволяет указать некоторые типы входных параметров! //Здесь мы поставили ловушку на отлов экземпляров класса PDOException: catch(PDOException $e) { // Здесь выводим сообщение на экран: echo ‘Соединение с БД, с треском провалилось! Посмотри что ты наделал: ’.$e->getMessage(); }
- PDO::ATTR_SERVER_VERSION ( 4 )
- Только для чтения.
Выводит информацию о версии сервера базы данных, к которому подключен PDO.
Типа того: 5.0.51a - PDO::ATTR_CLIENT_VERSION ( 5 )
- Только для чтения;
Выводит информацию о версии клиентских библиотек, которые использует драйвер PDO.
Тоже, типа того: 5.0.51a - PDO::ATTR_SERVER_INFO ( 6 )
- Только для чтения;
Выводит краткую метаинформацию о сервере базы данных, к которому подключен PDO.
Типа того: Uptime: 26804 Threads: 1 Questions: 1185 Slow queries: 2 Opens: 224 Flush tables: 1 Open tables: 1 Queries per second avg: 0.44 - PDO::ATTR_CONNECTION_STATUS ( 7 )
- Только для чтения;
Статус соединения.
Типа того: localhost via TCP/IP - PDO::ATTR_CASE ( 8 )
-
Приводит имена столбцов выборки к конкретному виду/регистру, определенному константами:
PDO::CASE_LOWER (2): Приводит имена к нижнему регистру.
PDO::CASE_NATURAL (0): Оставляет без изменений.
PDO::CASE_UPPER (1): Приводит имена к верхнему регистру.
- PDO::ATTR_DRIVER_NAME ( 16 )
-
Возвращает имя драйвера.
Строка типа: mysqlПример , как можно использовать PDO::ATTR_DRIVER_NAME
if ($db-> getAttribute (PDO::ATTR_DRIVER_NAME) == 'mysql') { echo "Запущен драйвер mysql; здесь какие нибудь специфичные mysql функции\n"; }
- PDO::ATTR_PERSISTENT ( 12 )
- Запрашивает постоянное подключение, вместо того, чтобы при каждом запросе создавать новое подключение. Если вы включили эту опцию, то не сможете использовать PDO::ATTR_STATEMENT_CLASS и наоборот.
- PDO::ATTR_STATEMENT_CLASS ( 13 )
-
С помощью этой константы (желательно сразу после получения объекта PDO) можно указать свой класс, который должен расширять PDOStatement:
$this->setAttribute( PDO::ATTR_STATEMENT_CLASS, array('DB_statement', array($param1, [$param2, [...]])) );В качестве второго параметра PDOStatement::setAttribute() вы должны будете указать индексный массив, первое значение которого - строковое представление имени вашего класса, расширяющего PDOStatement, второе - опять же массив в котором вы можете указать параметры для конструктора Вашего класса.
Кстати, конструктор вашего класса, расширяющего PDOStatement, обязательно должен быть как минимум защищённым – protected
Ниже пример реализации своего функционала общения с БД, который имеет счётчик запросов:
class DB extends PDO { public static $query_count = 0; //счётчик запросов public function __construct(/*string*/$dsn, /*string*/$user, /*string*/$pass, $driver_option = array()) { parent::__construct($dsn,$user,$pass,$driver_option); $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DB_statement', array($this))); } public function DBexec($statement) { $rows = parent::exec($statement); self::$query_count ++; return $rows; } public function DBquery($sql) { self::$query_count ++; return parent::query($sql); } } class DB_statement extends PDOStatement { protected $db; protected function __construct(DB $db) { $this->db = $db; } public function DBexecute($parameters = array()) { DB::$query_count ++; return parent::execute($parameters); } }
- PDO::ATTR_FETCH_CATALOG_NAMES ( 15 )
- Не поддерживается драйвером mysql! Добавляет имя каталога к каждому имени столбца, возвращенному в наборе результатов. Имя каталога и имя столбца разделены десятичным (.) символом. Поддержка этого атрибута на уровне драйвера; он может не поддерживаться Вашим драйвером.
- PDO::ATTR_FETCH_TABLE_NAMES ( 14 )
- Не поддерживается драйвером mysql! Добавляет имя таблицы к каждому имени столбца, возвращенному в наборе результатов. Имя таблицы и имя столбца разделены десятичным (.) символом. Поддержка этого атрибута на уровне драйвера; он может не поддерживаться Вашим драйвером.
- PDO::ATTR_STRINGIFY_FETCHES ( 17 )
- Не поддерживается драйвером mysql! Требует указания значения типа boolean. При получении результата конвертирует числовые значения в строковые
- PDO::ATTR_MAX_COLUMN_LEN ( 18 )
- Не поддерживается драйвером mysql!
- PDO::ATTR_DEFAULT_FETCH_MODE ( 19 )
- Доступный начиная с PHP 5.2.0
Задаёт тип получаемого результата по-умолчанию:
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
- PDO::ATTR_EMULATE_PREPARES ( 20 )
- Доступный начиная с PHP 5.1.3. Эмуляция подготовленных запросов. Если честно не понял, для чего нужна эта опция, у PDO есть прекрасные механизмы для осуществления безопасных подготовленных запросов.
- PDO::ATTR_ORACLE_NULLS ( 11 )
- (Доступно со всеми драйверами, не только с Oracle)
Конвертация NULL и пустых строк при получении результата запроса:
PDO::NULL_NATURAL (0) - Не конвертируется.
PDO::NULL_EMPTY_STRING (1) - Пустые строки конвертируются в NULL.
PDO::NULL_TO_STRING (2)- NULL конвертируется в пустую строку. - PDO::ATTR_CURSOR_NAME ( 9 )
- (Специфично для Firebird и ODBC)
Получить или определить имя курсора для UPDATE ... WHERE CURRENT OF. Полезно при использовании прокручиваемых курсоров и позиционированных обновлений.
- PDO::ATTR_CURSOR ( 10 )
-
Выбирает тип курсора. PDO в настоящий момент поддерживает:
PDO::CURSOR_FWDONLY ( 0 )Создаёт объект PDOStatement с однонаправленным курсором. Это - вариант курсора по умолчанию, поскольку он - самый быстрый и самый распространенный объект доступа к данным в PHP.
PDO:: CURSOR_SCROLL ( 1 )Создаёт объект PDOStatement с прокручиваемым курсором. Передайте PDO:: FETCH_ORI_* константы, чтобы управлять строками, принесенными от набора результатов.
Используйте PDO:: CURSOR_FWDONLY, если Вы точно не знаете, нужен ли Вам прокручиваемый курсор:
PDO::FETCH_ORI_NEXT (0 )Получает следующую строку в наборе результатов. Работает только с прокручиваемыми курсорами.
PDO::FETCH_ORI_PRIOR ( 1 )Получает предыдущую строку в наборе результатов. Работает только с прокручиваемыми курсорами.
PDO::FETCH_ORI_FIRST ( 2 )Получает первую строку в наборе результатов Работает только с прокручиваемыми курсорами.
PDO::FETCH_ORI_LAST ( 3 )Получает последнюю строку в наборе результатов. Работает только с прокручиваемыми курсорами.
PDO::FETCH_ORI_ABS ( 4 )Получает запрашиваемую строку номером ряда из набора результатов. Работает только с прокручиваемыми курсорами.
PDO::FETCH_ORI_REL ( 5 )Получает запрашиваемую строку с относительным положением от настоящего положения курсора в наборе результатов. Работает только с прокручиваемыми курсорами.
$sql = 'SELECT * FROM `gp_cities` ORDER BY city DESC'; $stmt = $dbh->prepare($sql,array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); $stmt->execute(); while($row1 = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT) ) { print_r($row1); }
- PDO::ERR_NONE ( 00000 )
- Удобно при PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT
Эта константа создана для удобства, с ней можно сравнивать значения методов: PDO::errorCode () или PDOStatement::errorCode (), чтобы определить, встретилась ли ошибка. Соответствует SQLSTATE '00000', что означает, что SQL-оператор был успешно выполнен без ошибок или предупреждений:
$dbh = new PDO( 'mysql:host=localhost;dbname=shop;', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT)); $sql = 'SELECT * FROM `gp_cities` ORDER BY city DESC'; $stmt = $dbh->prepare($sql,array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); if( $dbh->errorCode() != PDO::ERR_NONE) exit("Проблемы PDO !!!"); $stmt->execute(); if( $stmt->errorCode() != PDO::ERR_NONE) exit("Проблемы PDOStatement!!!"); print_r($stmt->fetchAll(PDO::FETCH_OBJ));
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.