PDO константы атрибуты

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));

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 97 гостей онлайн