Класс PDO

(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)

Введение

Представляет соединение между PHP и сервером базы данных.

Обзор классов

PDO {
__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
bool beginTransaction ( void )
bool commit ( void )
mixed errorCode ( void )
array errorInfo ( void )
int exec ( string $statement )
mixed getAttribute ( int $attribute )
static array getAvailableDrivers ( void )
bool inTransaction ( void )
string lastInsertId ([ string $name = NULL ] )
PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
PDOStatement query ( string $statement )
string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
bool rollBack ( void )
bool setAttribute ( int $attribute , mixed $value )
}

Содержание

  • 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 — Присвоение атрибута

Коментарии

Keep in mind, you MUST NOT use 'root' user in your applications, unless your application designed to do a database maintenance.

And storing username/password inside class is not a very good idea for production code. You would need to edit the actual working code to change settings, which is bad.
2008-08-22 04:16:27
http://php5.kiev.ua/manual/ru/class.pdo.html
Автор:
"And storing username/password inside class is not a very good idea for production code."

Good idea is to store database connection settings in *.ini files but you have to restrict access to them. For example this way:

my_setting.ini:
[database]
driver = mysql
host = localhost
;port = 3306
schema = db_schema
username = user
password = secret

Database connection:
<?php
class MyPDO extends PDO
{
    public function 
__construct($file 'my_setting.ini')
    {
        if (!
$settings parse_ini_file($fileTRUE)) throw new exception('Unable to open ' $file '.');
       
       
$dns $settings['database']['driver'] .
       
':host=' $settings['database']['host'] .
        ((!empty(
$settings['database']['port'])) ? (';port=' $settings['database']['port']) : '') .
       
';dbname=' $settings['database']['schema'];
       
       
parent::__construct($dns$settings['database']['username'], $settings['database']['password']);
    }
}
?>

Database connection parameters are accessible via human readable ini file for those who screams even if they see one PHP/HTML/any_other command.
2009-02-18 09:03:48
http://php5.kiev.ua/manual/ru/class.pdo.html
PDO and Dependency Injection

Dependency injection is good for testing.  But for anyone wanting various data mapper objects to have a database connection, dependency injection can make other model code very messy because database objects have to be instantiated all over the place and given to the data mapper objects.

The code below is a good way to maintain dependency injection while keeping clean and minimal model code.

<?php

class DataMapper
{
    public static 
$db;
   
    public static function 
init($db)
    {
       
self::$db $db;
    }
}

class 
VendorMapper extends DataMapper
{
    public static function 
add($vendor)
    {
       
$st self::$db->prepare(
           
"insert into vendors set
            first_name = :first_name,
            last_name = :last_name"
       
);
       
$st->execute(array(
           
':first_name' => $vendor->first_name,
           
':last_name' => $vendor->last_name
       
));
    }
}

// In your bootstrap
$db = new PDO(...);
DataMapper::init($db);

// In your model logic
$vendor = new Vendor('John''Doe');
VendorMapper::add($vendor);

?>
2011-10-12 16:10:27
http://php5.kiev.ua/manual/ru/class.pdo.html
Starting with PHP 5.4 you are unable to use persistent connections when you have your own database class derived from the native PDO class. If your code uses this combination, you will encounter segmentation faults during the cleanup of the PHP process.
You can still use _either_ a derived PDO class _or_ persistent connections.

For more information, please see this bug report: https://bugs.php.net/bug.php?id=63176
2013-06-14 16:25:45
http://php5.kiev.ua/manual/ru/class.pdo.html
Автор:
I personnaly create a new instance of PDO like this : 

$dbDatas = parse_ini_file( DB_FILE );
 $dbOptions = [
 \PDO::ATTR_DEFAULT_FECTH_MODE => \PDO::FETCH_OBJ,
 \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
 ];

 $dsn = sprintf( 'mysql:dbname=%s;host=%s', $dbDatas['dbname'],
$dbDatas['host'] );
 
 $this->cn = new \PDO( $dsn, $dbDatas['user'], $dbDatas['password'],
$dbOptions );
 $this->cn->exec( 'SET CHARACTER SET UTF8' );
2017-08-30 23:05:02
http://php5.kiev.ua/manual/ru/class.pdo.html
For some Database Environment, such as Aliyun DRDS (Distributed Relational Database Service), cannot process preparing for SQL. 
For such cases, the option `\PDO::ATTR_EMULATE_PREPARES` should be set to true. If you always got reports about "Failed to prepare SQL" while this option were set to false, you might try to turn on this option to emulate prepares for SQL.
2017-12-07 17:38:52
http://php5.kiev.ua/manual/ru/class.pdo.html

    Поддержать сайт на родительском проекте КГБ