PHP 7.4.0 alpha 1 Released

Fonctions MySQL (PDO_MYSQL)

Introduction

PDO_MYSQL est un pilote qui implémente l'interface de PHP Data Objects (PDO) pour autoriser l'accès de PHP aux bases de données MySQL.

PDO_MYSQL tirera avantage des requêtes natives préparées présentes dans MySQL 4.1 et supérieur. Si vous utilisez une version plus ancienne des bibliothèques clientes MySQL, PDO les émulera pour vous.

MySQL 8

Si PHP est utilisé dans une version 7.1 antérieure à la version 7.1.16, ou PHP 7.2 antérieure à 7.2.4, le plugin de mot de passe doit être défini à mysql_native_password pour MySQL 8 Server, car sinon des erreurs similaires à The server requested authentication method unknown to the client [caching_sha2_password] peuvent apparaitre, même si caching_sha2_password n'est pas utilisé.

Ceci est dû au fait que MySQL 8 utilise par défaut caching_sha2_password, un plugin qui n'est pas reconnu par les anciennes versions de PHP (mysqlnd). À la place il faut modifier le paramètre default_authentication_plugin=mysql_native_password dans my.cnf. Le plugin caching_sha2_password sera surporté dans une version future de PHP. En attendant, l'extension mysql_xdevapi le supporte.

Avertissement

Prendre garde toutefois : certains types de tables MySQL (moteur d'enregistrement) ne supportent pas les transactions. Lorsque vous écrivez du code de base de données transactionnel en utilisant un type de table qui ne supporte pas les transactions, MySQL prétendra qu'une transaction était initiée correctement. De plus, toute requête DLL publiée enverra implicitement l'ensemble des transactions en attente.

Installation

Les distributions Linux incluent des versions binaires de PHP qui peuvent être installées. Même si ces binaires sont construits avec les extensions MySQL, les bibliothèques clientes doivent souvent être installées au moyen d'un paquet additionnel. Voyez si c'est le cas pour votre distribution.

Par exemple, sur Ubuntu le package php5-mysql installe les extensions PHP ext/mysql, ext/mysqli, et pdo_mysql. Sur CentOS, le package php-mysql installe aussi ces trois extensions PHP.

Alternativement, vous pouvez compiler cette extension vous-même. Construire PHP depuis les sources permet de préciser les extensions MySQL à embarquer, mais aussi les bibliothèques clientes de chaque extension.

Lors de la compilation utilisez --with-pdo-mysql[=DIR] pour installer l'extension PDO MySQL, où [=DIR] est le chemin de la bibliothèque de base de MySQL. À partir de PHP 5.4, mysqlnd et la bibliothèque par défault. Pour plus de détails à propos du choix de la bibliothèque, voir Choisir une bibliothèque MySQL.

Optionnellement, l'option --with-mysql-sock[=DIR] définit le chemin vers le socket Unix MySQL pour toutes les extensions MySQL, y compris PDO_MYSQL. Si non spécifié, les chemins par défaut seront utilisés.

Optionnellement, l'option --with-zlib-dir[=DIR] sera utilisée pour définir le préfixe d'installation zlib.

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

Le support SSL est activé en utilisant les constantes PDO_MySQL appropriées, ce qui revient à appeler la fonction » mysql_ssl_set() de l'API C MySQL. De plus, SSL ne peut être activé avec PDO::setAttribute car la connexion existe déjà. Reportez-vous à la documentation MySQL sur » la connexion sur MySQL en utilisant SSL.

Historique
Version Description
5.4.0 mysqlnd est devenu la bibliothèque par défaut de MySQL lors de la compilation de PDO_MYSQL. Auparavant, libmysqlclient était la bibliothèque par défaut de MySQL.
5.4.0 Les bibliothèques cliente MySQL 4.1 et inférieures ne sont plus supportées.
5.3.9 Ajout du support SSL avec mysqlnd et OpenSSL.
5.3.7 Ajout du support SSL avec libmysqlclient et OpenSSL.

Constantes pré-définies

Les constantes ci-dessous sont définies par ce pilote et seront seulement disponibles lorsque l'extension aura été compilée dans PHP ou chargée dynamiquement du moteur d'exécution. De plus, ces constantes spécifiques au pilote devraient être utilisées seulement si vous utilisez ce pilote. En utilisant les attributs spécifiques à un pilote avec un autre pilote pourrait causer un comportement inattendu. PDO::getAttribute() pourrait être utilisé pour obtenir l'attribut PDO::ATTR_DRIVER_NAME pour vérifier le pilote, si votre code peut fonctionner sur des pilotes multiples.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (entier)
Si cet attribut est défini à TRUE sur un objet de classe PDOStatement, le pilote MySQL utilisera les versions bufferisées de l'API MySQL. Si vous écrivez du code portable, vous devriez utiliser à la place PDOStatement::fetchAll().

Exemple #1 Forcer la bufferisation des requêtes avec 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(
"mon application fonctionne seulement avec mysql; Je devrais utiliser \$stmt->fetchAll() à la place");
}
?>

PDO::MYSQL_ATTR_LOCAL_INFILE (entier)

Active LOAD LOCAL INFILE.

Notez que cette option n'a d'effet que si utilisée dans le tableau d'options driver_options du constructeur.

PDO::MYSQL_ATTR_INIT_COMMAND (entier)

Commande à exécuter lors de la connexion au serveur MySQL. Sera automatiquement ré-exécuté lors d'une reconnexion.

Notez que cette option n'a d'effet que si utilisée dans le tableau d'options driver_options du constructeur.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (entier)

Lit les options depuis le fichier nommé optionnel, plutôt que depuis my.cnf. Cette option n'est pas disponible lors de l'utilisation de mysqlnd car ce dernier ne lit pas les fichiers de configuration de mysql.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (entier)

Lit les options depuis le groupe nommé du fichier my.cnf ou depuis le fichier spécifié par MYSQL_READ_DEFAULT_FILE. Cette option n'est pas disponible lors de l'utilisation de mysqlnd car ce dernier ne lit pas les fichiers de configuration de mysql.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (entier)

Taille maximale du tampon. Par défaut, vaut 1 MiB. Cette constante n'est pas supportée lorsque mysqlnd est utilisé.

PDO::MYSQL_ATTR_DIRECT_QUERY (entier)

Effectue des requêtes directes, sans utiliser de requêtes préparées.

PDO::MYSQL_ATTR_FOUND_ROWS (entier)

Retourne le nombre d'enregistrements trouvés, pas le nombre d'enregistrements changés.

PDO::MYSQL_ATTR_IGNORE_SPACE (entier)

Autorise les espaces après les noms de fonctions. Fait en sorte que les noms de fonctions soient des mots réservés.

PDO::MYSQL_ATTR_COMPRESS (entier)

Active la compression de la communication réseau. Supporté si mysqlnd est utilisé à partir de PHP 5.3.11.

PDO::MYSQL_ATTR_SSL_CA (entier)

Chemin vers l'authorité certificat SSL.

Existe à partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CAPATH (entier)

Chemin vers le dossier contenant les certificats SSL CA, stockés au format PEM.

Existe à partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CERT (entier)

Chemin vers le certificat SSL.

Existe à partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CIPHER (entier)

Liste d'un ou plusieurs ciphers pour utiliser lors du cryptage SSL, dans un format reconnu par OpenSSL. Par exemple: DHE-RSA-AES256-SHA:AES128-SHA

Existe à partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_KEY (entier)

Chemin vers la clé SSL.

Existe à partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (entier)

Fournit un moyen de désactiver la vérification du certificat SSL du serveur.

Existe à partir de PHP 7.0.18 et PHP 7.1.4.

PDO::MYSQL_ATTR_MULTI_STATEMENTS (entier)

Désactive la requête d'exécution multiple à la fois dans PDO::prepare() et PDO::query() quand définie à FALSE.

Il est à noter que cette constante peut seulement être utilisée dans le tableau driver_options lors de la construction d'un nouveau gestionnaire de base de données.

Existe à partir de PHP 5.5.21 et PHP 5.6.5.

Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration du driver PDO_MYSQL
Nom Défaut Modifiable
pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM
pdo_mysql.debug NULL PHP_INI_SYSTEM
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.

Voici un éclaircissement sur l'utilisation des directives de configuration.

pdo_mysql.default_socket string

Définit un socket de domaine Unix. La valeur peut aussi être définie au moment de la compilation si un socket de domaine Unix est trouvé lors de la configuration. Cette configuration INI n'est disponible que sous Unix.

pdo_mysql.debug boolean

Active le débogage pour le driver PDO_MYSQL. Cette configuration n'est disponible que lorsque le driver PDO_MYSQL est compilé avec mysqlnd et en mode de débogage PDO.

Sommaire

add a note add a note

User Contributed Notes 8 notes

up
12
brian at diamondsea dot com
10 years ago
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.
up
8
Desislav Kamenov
1 year ago
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
up
1
curt at webmasterbond dot com
8 years ago
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'
   
)
);
?>
up
0
vafa ghoreyshi atgmailcom
1 year ago
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!
up
0
miller_kurt_e at yahoo dot com
10 years ago
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.
up
0
davey at php dot net
12 years ago
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()
up
-2
rmottey at gmail dot com
11 years ago
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();
    }
?>
up
-4
Gerald Schneider
5 years ago
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.
To Top