PHP 8.3.4 Released!

MySQL-Funktionen (PDO_MYSQL)

Einführung

PDO_MYSQL ist ein Treiber, der die PHP Data Objects (PDO)-Schnittstelle implementiert, um von PHP aus auf MySQL Datenbanken zugreifen zu können.

PDO_MYSQL verwendet standardmäßig emulierte vorbereitete Anweisungen.

MySQL 8

Bei PHP-Versionen vor PHP 7.1.16 oder der 7.2-Serie vor 7.2.4 muss das Standard-Passwort-Plugin des MySQL 8-Servers auf mysql_native_password gesetzt werden, da sonst Fehler angezeigt werden wie The server requested authentication method unknown to the client [caching_sha2_password], auch wenn caching_sha2_password nicht verwendet wird.

Das liegt daran, dass MySQL 8 standardmäßig caching_sha2_password verwendet und dieses Plugin von den älteren PHP- (mysqlnd) Versionen nicht erkannt wird. Stattdessen muss die Voreinstellung durch den Eintrag default_authentication_plugin=mysql_native_password in der Datei my.cnf geändert werden. Das Plugin caching_sha2_password wird seit PHP 7.4.4 vollständig unterstützt. In älteren Versionen wird es von der Erweiterung mysql_xdevapi unterstützt.

Warnung

Vorsicht ist geboten: Einige MySQL-Tabellentypen (Speicher-Engines) unterstützen keine Transaktionen. Wenn transaktionaler Datenbankcode für einen Tabellentyp geschrieben wird, der keine Transaktionen unterstützt, verhält sich MySQL so, als sei eine Transaktion erfolgreich initiiert worden. Darüber hinaus werden alle ausgelösten DDL-Abfragen implizit alle anstehenden Transaktionen festschreiben.

Hinweis:

Der MySQL-Treiber unterstützt die Konstante PDO::PARAM_INPUT_OUTPUT über die Methode PDOStatement::bindParam() nicht korrekt; solche Parameter können zwar verwendet werden, werden aber nicht aktualisiert (d. h. die eigentliche Ausgabe wird ignoriert).

Installation

In allen gängigen Unix-Distributionen sind Binärversionen von PHP enthalten, die installiert werden können. Obwohl diese Binärversionen in der Regel mit Unterstützung für die MySQL-Erweiterungen gebaut werden, müssen die Erweiterungsbibliotheken selbst möglicherweise über ein zusätzliches Paket installiert werden. Ob dies der Fall ist, erfahren Sie in der Paketverwaltung Paketverwaltung der von Ihnen gewählten Distribution.

Unter Ubuntu zum Beispiel installiert das Paket php5-mysql die PHP-Erweiterungen ext/mysql, ext/mysqli und PDO_MYSQL. Auch unter CentOS installiert das Paket php-mysql diese drei PHP-Erweiterungen.

Alternativ können Sie diese Erweiterung auch selbst kompilieren. Wenn Sie PHP aus dem Quellcode kompilieren, können Sie die MySQL-Erweiterungen angeben, die Sie verwenden möchten, und auch die Client-Bibliothek für jede Erweiterung auswählen.

Um die Erweiterung PDO MySQL zu installieren, verwenden Sie beim Kompilieren --with-pdo-mysql[=DIR], wobei das optionale [=DIR] die MySQL-Basisbibliothek angibt. Die Standardbibliothek ist Mysqlnd. Für Details über die Auswahl einer Bibliothek, siehe Auswahl einer MySQL-Bibliothek.

Mit dem optionalen --with-mysql-sock[=DIR] kann der Speicherort des Unix-Sockets von MySQL für alle MySQL Erweiterungen, einschließlich PDO_MYSQL, festgelegt werden. Wenn nichts angegeben ist, werden die standardmäßigen Speicherorte durchsucht.

Optional kann --with-zlib-dir[=DIR] verwendet werden, um den Pfad zum libz-Installationspräfix festzulegen.

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

Die SSL-Unterstützung wird mit den entsprechenden PDO_MySQL-Konstanten aktiviert, was dem Aufruf der » MySQL C API-Funktion mysql_ssl_set() entspricht. Darüber hinaus kann SSL nicht mittels PDO::setAttribute aktiviert werden, da die Verbindung bereits existiert. Siehe auch die MySQL-Dokumentation über den » Aufbau einer Verbindung zu MySQL mit SSL.

Vordefinierte Konstanten

Die folgenden Konstanten werden von diesem Treiber definiert und sind nur verfügbar, wenn die Erweiterung entweder in PHP einkompiliert oder dynamisch zur Laufzeit geladen wurde. Darüber hinaus sind diese Konstanten treiberspezifisch und sollten nur mit diesem Treiber benutzt werden. Treiberspezifische Attribute mit einem anderen Treiber zu nutzen, kann zu unerwarteten Ergebnissen führen. Wenn der Code mit verschiedenen Treibern funktioniert, kann PDO::getAttribute() verwendet werden, um mit PDO::ATTR_DRIVER_NAME den aktuellen Treiber zu ermitteln.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (bool)
In der Voreinstellung werden alle Anweisungen im gepufferten Modus ausgeführt. Wenn dieses Attribut bei einem PDO-Objekt auf false gesetzt ist, verwendet der MySQL-Treiber den ungepufferten Modus.

Beispiel #1 Den ungepufferten Modus von MySQL aktivieren

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_password');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach (
$unbufferedResult as $row) {
echo
$row['Name'] . PHP_EOL;
}
?>

PDO::MYSQL_ATTR_LOCAL_INFILE (int)

Aktiviert Load LOCAL INFILE.

Es ist zu beachten, dass diese Konstante nur im Array driver_options verwendet werden kann, wenn ein neues Datenbank-Handle erstellt wird.

PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY (string)

Ermöglicht es, das Laden von LOCAL DATA auf Dateien zu beschränken, die sich im angegebenen Verzeichnis befinden. Verfügbar ab PHP 8.1.0.

Es ist zu beachten, dass diese Konstante nur im Array driver_options verwendet werden kann, wenn ein neues Datenbank-Handle erstellt wird.

PDO::MYSQL_ATTR_INIT_COMMAND (string)

Der Befehl, der ausgeführt werden soll, wenn eine Verbindung zum MySQL-Server aufgebaut wird. Wird beim erneuten Verbindungsaufbau automatisch wieder ausgeführt.

Es ist zu beachten, dass diese Konstante nur im Array driver_options verwendet werden kann, wenn ein neues Datenbank-Handle erstellt wird.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (int)

Die Optionen aus der genannten Optionsdatei lesen, statt aus my.cnf. Diese Option ist nicht verfügbar, wenn mysqlnd verwendet wird, weil mysqlnd die mysql-Konfigurationsdateien nicht liest.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (int)

Die Optionen der genannten Gruppe aus my.cnf oder der mit MYSQL_READ_DEFAULT_FILE angegebenen Datei lesen. Diese Option ist nicht verfügbar, wenn mysqlnd verwendet wird, weil mysqlnd die mysql-Konfigurationsdateien nicht liest.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (int)

Die maximale Puffergröße. Der Standardwert ist 1 MiB. Diese Konstante wird nicht unterstützt, wenn gegen mysqlnd kompiliert wird.

PDO::MYSQL_ATTR_DIRECT_QUERY (int)

Abfragen direkt ausführen, keine vorbereiteten Anweisungen verwenden.

PDO::MYSQL_ATTR_FOUND_ROWS (int)

Die Anzahl der gefundenen (übereinstimmenden) Zeilen zurückgeben, nicht die Anzahl der geänderten Zeilen.

PDO::MYSQL_ATTR_IGNORE_SPACE (int)

Leerzeichen nach Funktionsnamen zulassen; macht alle Funktionsnamen zu reservierten Wörtern.

PDO::MYSQL_ATTR_COMPRESS (int)

Aktiviert die Komprimierung der Netzwerkkommunikation.

PDO::MYSQL_ATTR_SSL_CA (int)

Der Pfad zur Datei der SSL-Zertifizierungsstelle.

PDO::MYSQL_ATTR_SSL_CAPATH (int)

Der Pfad zum Verzeichnis, das die im PEM-Format gespeicherten vertrauenswürdigen SSL-Zertifikate der Zertifizierungsstelle (CA) enthält.

PDO::MYSQL_ATTR_SSL_CERT (int)

Der Pfad zum SSL-Zertifikat.

PDO::MYSQL_ATTR_SSL_CIPHER (int)

Eine Liste von einer oder mehreren zulässigen Chiffren, die für die SSL-Verschlüsselung zu verwenden sind, in einem Format, das von OpenSSL verstanden wird, z. B. DHE-RSA-AES256-SHA:AES128-SHA

PDO::MYSQL_ATTR_SSL_KEY (int)

Der Pfad zur Datei mit dem SSL-Schlüssel.

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (int)

Mit dieser Option kann die Überprüfung des SSL-Zertifikats des Servers deaktiviert werden; sie ist nur in Verbindung mit mysqlnd verfügbar.

Dies existiert seit PHP 7.0.18 und PHP 7.1.4.

PDO::MYSQL_ATTR_MULTI_STATEMENTS (int)

Wenn auf false gesetzt, wird die Ausführung von Mehrfachabfragen sowohl bei PDO::prepare() als auch bei PDO::query() deaktiviert.

Es ist zu beachten, dass diese Konstante nur im Array driver_options verwendet werden kann, wenn ein neues Datenbank-Handle erstellt wird.

Laufzeit-Konfiguration

Das Verhalten dieser Funktionen wird durch Einstellungen in der php.ini beeinflusst.

PDO_MYSQL-Konfigurationsoptionen
Name Standard Veränderbar
pdo_mysql.default_socket "/tmp/mysql.sock" INI_SYSTEM
pdo_mysql.debug NULL INI_SYSTEM
Weitere Details und die Definitionen der INI_*-Konstanten sind unter Wo Konfigurationseinstellungen gesetzt werden können zu finden.

Hier eine kurze Erklärung der Konfigurationsoptionen:

pdo_mysql.default_socket string

Setzt einen Unix-Domain-Socket. Wenn während der Ausführung von configure ein Domain-Socket gefunden wird, wird dieser Wert bereits beim Kompilieren gesetzt. Diese INI-Einstellung gilt nur unter Unix.

pdo_mysql.debug bool

Aktiviert das Debugging für PDO_MYSQL. Diese Einstellung ist nur verfügbar, wenn PDO_MYSQL mit mysqlnd und im PDO-Debugmodus kompiliert wurde.

Inhaltsverzeichnis

add a note

User Contributed Notes 8 notes

up
13
Desislav Kamenov
6 years 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
7
brian at diamondsea dot com
15 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
6
davey at php dot net
16 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
4
curt at webmasterbond dot com
12 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
-3
rmottey at gmail dot com
16 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
-6
miller_kurt_e at yahoo dot com
15 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
-10
vafa ghoreyshi atgmailcom
6 years 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
-44
Gerald Schneider
10 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