MySQL Functions (PDO_MYSQL)

Введение

PDO_MYSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to MySQL 3.x, 4.x and 5.x databases.

PDO_MYSQL will take advantage of native prepared statement support present in MySQL 4.1 and higher. If you're using an older version of the mysql client libraries, PDO will emulate them for you.

Внимание

Beware: Some MySQL table types (storage engines) do not support transactions. When writing transactional database code using a table type that does not support transactions, MySQL will pretend that a transaction was initiated successfully. In addition, any DDL queries issued will implicitly commit any pending transactions.

Установка

Используйте --with-pdo-mysql[=DIR] для установки расширения PDO MySQL, где необязательный параметр [=DIR] указывает директорию, где установлена MySQL. Если mysqlnd передается в параметре [=DIR], то будет использован родной драйвер MySQL.

Дополнительный параметр --with-mysql-sock[=DIR] указывает расположение unix-сокета MySQL для всех MySQL расширений, включая PDO_MYSQL. Если параметр не указан, поиск производится в директориях по умолчанию.

Дополнительный параметр --with-zlib-dir[=DIR] используется как префикс пути к libz.

$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

Поддержка SSL включается, используя соответствующую константу PDO_MySQL, которая эквивалентна вызову » MySQL C API функции mysql_ssl_set(). К тому же SSL не может быть включен с помощью PDO::setAttribute, потому что соединение уже существует. Смотрите документацию MySQL о » подключении к MySQL с SSL.

Список изменений
Версия Описание
5.4.0 Клиентские библиотеки MySQL версии 4.1 и ниже больше не поддерживаются.
5.3.9 Добавлена поддержка SSL в mysqlnd с OpenSSL.
5.3.7 Добавлена поддержка SSL в libmysql с OpenSSL.

Предопределенные константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого расширения или данное расширение было подгружено динамечески во время выполнения. Вдобавок, эти драйверо-зависимые константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведенние. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO_ATTR_DRIVER_NAME для проверки драйвера.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (integer)
Если этот аттрибут установлен в TRUE в PDOStatement, MySQL драйвер будет использовать буферизованные версии MySQL API. Если вы пишете переносимый на другие библиотеки код, вы должны использовать PDOStatement::fetchAll().

Пример #1 Буферизация запросов в MySQL

<?php
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
    
$stmt $db->prepare('select * from foo',
        array(
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
} else {
    die(
"my application only works with mysql; I should use \$stmt->fetchAll() instead");
}
?>

PDO::MYSQL_ATTR_LOCAL_INFILE (integer)

Включить LOAD LOCAL INFILE.

Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании дескриптора новой базы данных.

PDO::MYSQL_ATTR_INIT_COMMAND (integer)

Команда, которую необходимо выполнить при подключении к MySQL серверу. Также будет автоматически выполнена при переподключении.

Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании дескриптора новой базы данных.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (integer)

Чтение именованных параметров из файла my.cnf. Эта опция не доступна, если используется mysqlnd, потому что mysqlnd не читает файлы конфигурации MySQL.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (integer)

Чтение именованной группы параметров из файла my.cnf или из файла, определенного в константе MYSQL_READ_DEFAULT_FILE. Эта опция не доступна, если используется mysqlnd, потому что mysqlnd не читает файлы конфигурации MySQL.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (integer)

Максимальный размер буфера. По умолчанию равен 1 Мб. Эта константа не поддерживается при компиляции вместе с mysqlnd.

PDO::MYSQL_ATTR_DIRECT_QUERY (integer)

Выполнять прямые запросы, не использовать подготовленные конструкции.

PDO::MYSQL_ATTR_FOUND_ROWS (integer)

Возвращает количество найденных (совпавших) строк (не количество измененных строк).

PDO::MYSQL_ATTR_IGNORE_SPACE (integer)

Разрешает пробелы после имен функций. Делает все имена функций зарезервированными словами.

PDO::MYSQL_ATTR_COMPRESS (integer)

Включить сжатие сетевого соединения. Эта константа не поддерживается при компиляции вместе с mysqlnd.

PDO::MYSQL_ATTR_SSL_CA (integer)

Путь к файлу сертификата SSL.

Существует, начиная с PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CAPATH (integer)

Путь к директории, которая содержит SSL сертификаты доверенных центров (CA), хранящиеся в формате PEM.

Существует, начиная с PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CERT (integer)

Путь к файлу с SSL сертификатом.

Существует, начиная с PHP 5.3.7.

PDO::MYSQL_ATTR_CIPHER (integer)

Список из одного или более допустимых шифров для использования в SSL шифровании в формате, который понимает OpenSSL. Например: DHE-RSA-AES256-SHA:AES128-SHA

Существует, начиная с PHP 5.3.7.

PDO::MYSQL_ATTR_KEY (integer)

Путь к файлу с ключем SSL.

Существует, начиная с PHP 5.3.7.

Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

PDO_MYSQL Configuration Options
Имя По умолчанию Меняемо
pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM
pdo_mysql.debug NULL PHP_INI_SYSTEM
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

pdo_mysql.default_socket string

Sets a Unix domain socket. This value can either be set at compile time if a domain socket is found at configure. This ini setting is Unix only.

pdo_mysql.debug boolean

Enables debugging for PDO_MYSQL. This setting is only available when PDO_MYSQL is compiled against mysqlnd and in PDO debug mode.

Содержание

Коментарии

To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

It will not work when passed into PDO::prepare()
2007-06-06 16:46:51
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
I have been getting the error below when performing multiple queries within a single page.

Setting the attribute below did not seem to work for me.

So building on previous example i am initilizing my stmt  variable on every query and a fetch all into an array. Seems to be working for me.

Error:
PDO Error 1.1: Array ( [0] => xxx[1] => yyy[2] => Lost connection to MySQL server during query )

Fix:

(PDO::setAttribute("PDO::MYSQL_ATTR_USE_BUFFERED_QUERY", true);)

<?

try {
       
$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx''xxx''xxx', array( PDO::ATTR_PERSISTENT => false));
 
$stmt $dbh->prepare("CALL getname()");

       
// call the stored procedure
       
$stmt->execute();
     
// fetch all rows into an array.
       
$rows $stmt->fetchAll();
       foreach (
$rows as $rs
    {
         
$id $rs['id'];
         }
//initilise the statement
unset($stmt);
$stmt $dbh->prepare("call secondprocedure(?);");
$stmt->bindValue(1$id);
if ( ! 
$stmt->execute() )
{
    echo 
"PDO Error 1.1:\n";
   
print_r($stmt->errorInfo());
    exit;
}
unset(
$stmt);
} catch (
PDOException $e) {
        print 
"Error!: " $e->getMessage() . "<br/>";
        die();
    }
?>
2008-01-09 05:51:29
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

This one can be a royal pain to deal with.  Never stack statements to be executed in one go.  Nobody ever mentions this possibility in all the posts I've seen dealing with this error.

This example is a Zend Framework example but the theory is the same.

As in:

<?php
$sql 
= <<<____SQL
     CREATE TABLE IF NOT EXISTS `ticket_hist` (
       `tid` int(11) NOT NULL,
       `trqform` varchar(40) NOT NULL,
       `trsform` varchar(40) NOT NULL,
       `tgen` datetime NOT NULL,
       `tterm` datetime,
       `tstatus` tinyint(1) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='ticket archive';
     CREATE TABLE IF NOT EXISTS `request_hist` (
       `rqid` int(11) NOT NULL,
       `rqtid` int(11) NOT NULL,
       `rqsid` int(11) NOT NULL,
       `rqdate` datetime NOT NULL,
       `rqcode` tinyint(1) NOT NULL,
       `rssid` int(11) NOT NULL,
       `rsdate` datetime,
       `rscode` tinyint(1)
     ) ENGINE=ARCHIVE COMMENT='request archive';
     CREATE TABLE IF NOT EXISTS `relay_hist` (
       `rqid` int(5) NOT NULL,
       `sdesc` varchar(40) NOT NULL,
       `rqemail` varchar(40) NOT NULL,
       `sid` int(11) NOT NULL,
       `rlsid` int(11) NOT NULL,
       `dcode` varchar(5) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='relay archive';
____SQL;
$result $this->db->getConnection()->exec($sql);
?>

This will run fine but PDO will balk with the 'unbuffered' error if you follow this with another query.

Instead do:

<?php
$sql 
= <<<____SQL
     CREATE TABLE IF NOT EXISTS `ticket_hist` (
       `tid` int(11) NOT NULL,
       `trqform` varchar(40) NOT NULL,
       `trsform` varchar(40) NOT NULL,
       `tgen` datetime NOT NULL,
       `tterm` datetime,
       `tstatus` tinyint(1) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='ticket archive';
____SQL;
$result $this->db->getConnection()->exec($sql);

$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `request_hist` (
       `rqid` int(11) NOT NULL,
       `rqtid` int(11) NOT NULL,
       `rqsid` int(11) NOT NULL,
       `rqdate` datetime NOT NULL,
       `rqcode` tinyint(1) NOT NULL,
       `rssid` int(11) NOT NULL,
       `rsdate` datetime,
       `rscode` tinyint(1)
     ) ENGINE=ARCHIVE COMMENT='request archive';
____SQL;
$result $this->db->getConnection()->exec($sql);

$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `relay_hist` (
       `rqid` int(5) NOT NULL,
       `sdesc` varchar(40) NOT NULL,
       `rqemail` varchar(40) NOT NULL,
       `sid` int(11) NOT NULL,
       `rlsid` int(11) NOT NULL,
       `dcode` varchar(5) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='relay archive';
____SQL;
$result $this->db->getConnection()->exec($sql);
?>

Chopping it into individual queries fixes the problem.
2008-07-20 17:03:04
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL _client_ library running on our web server, and a latest-version MySQL _server_ running on the database server's box.

Upgraded the MySQL client on the web server to the current revision and the problem went away.
2008-07-25 14:26:51
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
Today's PHP snapshot now has SSL support for PDO. Follow the directions here ( http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html ) to set up MySQL and then use the following connection options:

<?php
$pdo 
= new PDO(
   
'mysql:host=hostname;dbname=ssldb',
   
'username',
   
'password',
    array(
       
PDO::MYSQL_ATTR_SSL_KEY    =>'/path/to/client-key.pem',
       
PDO::MYSQL_ATTR_SSL_CERT=>'/path/to/client-cert.pem',
       
PDO::MYSQL_ATTR_SSL_CA    =>'/path/to/ca-cert.pem'
   
)
);
?>
2011-04-15 20:54:24
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
Автор:
This page suggests that the constant PDO::MYSQL_ATTR_FOUND_ROWS  was always available (no note "exists as of X.X"), but I found the constant missing on an installation with PHP 5.2. After switching the PHP version to 5.3.27 on the webspace the constant was available.
2013-11-09 10:25:54
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
If you have the error 'could not find driver' and won't able to install driver for newer linux(Fedora, Redhat, CentOS) with latest PHP7/MariaDB10/Apache2.4 get this package installed and get every things smooth.
First download latest version of epel and remi for your distribution. This links is for Fedora 26:

wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget https://rpms.remirepo.net/fedora/remi-release-26.rpm

Than install them

rpm -Uvh remi-release-26.rpm
rpm -Uvh epel-release-6-8.noarch.rpm

Know you can use remi repository to gest php-pdo and php-mysql.

yum --enablerepo=remi install php-pdo
yum --enablerepo=remi install php-mysql

Restart the Apache

systemctl stop httpd
systemctl start httpd

Good to go!
2017-09-06 07:57:21
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html
Автор:
There is an important undocumented attribute which disables certificate CN verification available after
5.6.22 (not sure), 7.0.18 (verified) and 7.1.15 (not sure)

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

possible values: true, false
default value: true 

Related PHP bugs:
https://bugs.php.net/bug.php?id=71845
https://bugs.php.net/bug.php?id=71003

and github PR: https://github.com/php/php-src/pull/1913
2018-01-29 10:14:38
http://php5.kiev.ua/manual/ru/ref.pdo-mysql.html

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