Объекты данных PHP
- Введение
- Установка и настройка
- Предопределенные константы
- Подключения и Управление подключениями
- Транзакции и автоматическая фиксация изменений
- Подготовленные запросы и хранимые процедуры
- Ошибки и их обработка
- Большие объекты (LOB)
- PDO — Класс PDO
- PDO::beginTransaction — Инициализация транзакции
- PDO::commit — Фиксирует транзакцию
- PDO::__construct — Создает экземпляр PDO, предоставляющий соединение с базой данных
- PDO::errorCode — Возвращает код SQLSTATE результата последней операции с базой данных
- PDO::errorInfo — Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
- PDO::exec — Запускает SQL запрос на выполнение и возвращает количество строк, задействованных в ходе его выполнения
- PDO::getAttribute — Получить атрибут соединения с базой данных
- PDO::getAvailableDrivers — Возвращает массив доступных драйверов PDO
- PDO::inTransaction — Проверяет, начата ли транзакция
- PDO::lastInsertId — Возвращает ID последней вставленной строки или последовательное значение
- PDO::prepare — Подготавливает запрос к выполнению и возвращает ассоциированный с этим запросом объект
- PDO::query — Выполняет SQL запрос и возвращает результирующий набор в виде объекта PDOStatement
- PDO::quote — Заключает строку в кавычки для использования в запросе
- PDO::rollBack — Откат транзакции
- PDO::setAttribute — Присвоение атрибута
- PDOStatement — Класс PDOStatement
- PDOStatement::bindColumn — Связывает столбец с PHP переменной
- PDOStatement::bindParam — Привязывает параметр запроса к переменной
- PDOStatement::bindValue — Связывает параметр с заданным значением
- PDOStatement::closeCursor — Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
- PDOStatement::columnCount — Возвращает количество столбцов в результирующем наборе
- PDOStatement::debugDumpParams — Вывод информации о подготовленной SQL команде в целях отладки
- PDOStatement::errorCode — Определяет SQLSTATE код соответствующий последней операции объекта PDOStatement
- PDOStatement::errorInfo — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
- PDOStatement::execute — Запускает подготовленный запрос на выполнение
- PDOStatement::fetch — Извлечение следующей строки из результирующего набора
- PDOStatement::fetchAll — Возвращает массив, содержащий все строки результирующего набора
- PDOStatement::fetchColumn — Возвращает данные одного столбца следующей строки результирующего набора
- PDOStatement::fetchObject — Извлекает следующую строку и возвращает ее в виде объекта
- PDOStatement::getAttribute — Получение значения атрибута запроса PDOStatement
- PDOStatement::getColumnMeta — Возвращает метаданные столбца в результирующей таблице
- PDOStatement::nextRowset — Переход к следующему набору строк в результате запроса
- PDOStatement::rowCount — Возвращает количество строк, модифицированных последним SQL запросом
- PDOStatement::setAttribute — Присваивает атрибут объекту PDOStatement
- PDOStatement::setFetchMode — Задает режим выборки по умолчанию для объекта запроса
- PDOException — Класс PDOException
- PDO Драйверы
- CUBRID (PDO) — CUBRID Functions (PDO_CUBRID)
- MS SQL Server (PDO) — Microsoft SQL Server and Sybase Functions (PDO_DBLIB)
- Firebird (PDO) — Firebird Functions (PDO_FIREBIRD)
- IBM (PDO) — IBM Functions (PDO_IBM)
- Informix (PDO) — Informix Functions (PDO_INFORMIX)
- MySQL (PDO) — MySQL Functions (PDO_MYSQL)
- MS SQL Server (PDO) — Microsoft SQL Server Functions (PDO_SQLSRV)
- Oracle (PDO) — Oracle Functions (PDO_OCI)
- ODBC and DB2 (PDO) — ODBC and DB2 Functions (PDO_ODBC)
- PostgreSQL (PDO) — PostgreSQL Functions (PDO_PGSQL)
- SQLite (PDO) — SQLite Functions (PDO_SQLITE)
- 4D (PDO) — 4D Functions (PDO_4D)
Коментарии
Below is an example of extending PDO & PDOStatement classes:
<?php
class Database extends PDO
{
function __construct()
{
parent::__construct('mysql:dbname=test;host=localhost', 'root', '');
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
}
}
class DBStatement extends PDOStatement
{
public $dbh;
protected function __construct($dbh)
{
$this->dbh = $dbh;
$this->setFetchMode(PDO::FETCH_OBJ);
}
public function foundRows()
{
$rows = $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));
$rows->execute();
$rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;
$rows->closeCursor();
return $rowsCount;
}
}
?>
I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn't knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:
<?php
/**
* PHP Document Object plus
*
* PHP Document Object plus is library with functionality of PDO, entirely written
* in PHP, so that developer can easily extend it's classes with specific functionality,
* such as providing database usage statistics implemented in v1.0b
*
* @author Peter Pokojny
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
class PDOp {
protected $PDO;
public $numExecutes;
public $numStatements;
public function __construct($dsn, $user=NULL, $pass=NULL, $driver_options=NULL) {
$this->PDO = new PDO($dsn, $user, $pass, $driver_options);
$this->numExecutes = 0;
$this->numStatements = 0;
}
public function __call($func, $args) {
return call_user_func_array(array(&$this->PDO, $func), $args);
}
public function prepare() {
$this->numStatements++;
$args = func_get_args();
$PDOS = call_user_func_array(array(&$this->PDO, 'prepare'), $args);
return new PDOpStatement($this, $PDOS);
}
public function query() {
$this->numExecutes++;
$this->numStatements++;
$args = func_get_args();
$PDOS = call_user_func_array(array(&$this->PDO, 'query'), $args);
return new PDOpStatement($this, $PDOS);
}
public function exec() {
$this->numExecutes++;
$args = func_get_args();
return call_user_func_array(array(&$this->PDO, 'exec'), $args);
}
}
class PDOpStatement implements IteratorAggregate {
protected $PDOS;
protected $PDOp;
public function __construct($PDOp, $PDOS) {
$this->PDOp = $PDOp;
$this->PDOS = $PDOS;
}
public function __call($func, $args) {
return call_user_func_array(array(&$this->PDOS, $func), $args);
}
public function bindColumn($column, &$param, $type=NULL) {
if ($type === NULL)
$this->PDOS->bindColumn($column, $param);
else
$this->PDOS->bindColumn($column, $param, $type);
}
public function bindParam($column, &$param, $type=NULL) {
if ($type === NULL)
$this->PDOS->bindParam($column, $param);
else
$this->PDOS->bindParam($column, $param, $type);
}
public function execute() {
$this->PDOp->numExecutes++;
$args = func_get_args();
return call_user_func_array(array(&$this->PDOS, 'execute'), $args);
}
public function __get($property) {
return $this->PDOS->$property;
}
public function getIterator() {
return $this->PDOS;
}
}
?>
Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.
From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.
Please note this:
Won't work:
$sth = $dbh->prepare('SELECT name, colour, calories FROM ? WHERE calories < ?');
THIS WORKS!
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ?');
The parameter cannot be applied on table names!!
This is a little late... but I'm old and slow.......
Regarding Extending PDOStatement and PDO I found that sending the PDOExtended class by reference helps:
In the constructor after parent::__construct() :
$this->setAttribute(\PDO::ATTR_STATEMENT_CLASS,array('PDOStatementExtended', [&$this]));}
And in
class PDOStatementExtended extends \PDOStatement
{
protected function __construct
(
\PDO &$PDO,
)
Now that current versions of MySQL are forcing users to authenticate with caching_sha2_password instead of mysql_native_driver, I wanted to get PDO to send passwords that way. I think the only way to do it is to make the connection over SSL. Setting up your web server and database server for SSL is way beyond the scope of this note, but after you do, remember that you will need to add an options array as the last argument in your PDO connection arguments. At a minimum, you will need to supply the server certificate. In a development environment with a self-signed server certificate, you will also want to bypass verification that your server certificate is 'real'. So your options array would look like this
$opts = [ PDO::MYSQL_ATTR_SSL_CA => $server_cert_file_path, PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false];
Hope it helps!