MySQL (PDO_MYSQL) İşlevleri

Giriş

PDO_MYSQL, PHP Veri Nesneleri Arayüzünün (PDO) MySQL veritabanlarına erişimini mümkün kılmak için gerçeklenmiş bir sürücüdür.

PDO_MYSQL eklentisi, öntanımlı olarak öykünülmüş hazır deyimleri kullanır.

MySQL 8

7.1.16'dan önceki bir PHP sürümünü veya 7.2.4'ten önceki PHP 7.2'yi çalıştırırken, MySQL 8 Sunucusunun öntanımlı parola eklentisini mysql_native_password olarak ayarlayın, aksi takdirde, caching_sha2_password kullanılmadığında bile "sunucu tarafından istenen [caching_sha2_password] kimlik doğrulama yöntemini istemci bilmiyor" anlamında The server requested authentication method unknown to the client [caching_sha2_password] gibi hatalar görürsünüz.

Bunun nedeni MySQL 8'in öntanımlı olarak eski PHP (mysqlnd) sürümleri tarafından tanınmayan bir eklenti olan caching_sha2_password'e ayarlanmasıdır. my.cnf'de default_authentication_plugin=mysql_native_password ayarını yaparak bunu değiştirin. caching_sha2_password eklentisi gelecekteki PHP sürümlerinin birinde muhtemelen desteklenecektir. O zamana dek, bunu destekleyen mysql_xdevapi eklentisi kullanılabilir.

Uyarı

Dikkat: Bazı MySQL tablo türleri (saklama motorları) toplu hareketleri desteklemez. Bir veritabanını kodlarken toplu hareketleri desteklemeyen bir tablo türünü kullanıyorsanız MySQL toplu hareketi başarıyla ilklendirmiş gibi yapar. Ayrıca, DDL sorguları, bekleyen toplu hareketlerin örtük olarak yerine getirilmesine de sebep olur.

Bilginize:

MySQL sürücüsü PDO::PARAM_INPUT_OUTPUT sabitini PDOStatement::bindParam() üzerinden düzgünce desteklemez; böyle bağımsız değişkenler kullanılabilirse de, bunlar güncellenmez (yani, mevcut çıktı yoksayılır).

Kurulum

The common Unix distributions include binary versions of PHP that can be installed. Although these binary versions are typically built with support for the MySQL extensions, the extension libraries themselves may need to be installed using an additional package. Check the package manager that comes with your chosen distribution for availability.

For example, on Ubuntu the php5-mysql package installs the ext/mysql, ext/mysqli, and PDO_MYSQL PHP extensions. On CentOS, the php-mysql package also installs these three PHP extensions.

Alternatively, you can compile this extension yourself. Building PHP from source allows you to specify the MySQL extensions you want to use, as well as your choice of client library for each extension.

When compiling, use --with-pdo-mysql[=DIR] to install the PDO MySQL extension, where the optional [=DIR] is the MySQL base library. Mysqlnd is the default library. For details about choosing a library, see Choosing a MySQL library.

Optionally, the --with-mysql-sock[=DIR] sets to location to the MySQL unix socket pointer for all MySQL extensions, including PDO_MYSQL. If unspecified, the default locations are searched.

Optionally, the --with-zlib-dir[=DIR] is used to set the path to the libz install prefix.

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

SSL support is enabled using the appropriate PDO_MySQL constants, which is equivalent to calling the » MySQL C API function mysql_ssl_set(). Also, SSL cannot be enabled with PDO::setAttribute because the connection already exists. See also the MySQL documentation about » connecting to MySQL with SSL.

Öntanımlı Sabitler

Bu sabitler bu sürücü tarafından tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında dinamik olarak yüklenmesi halinde kullanılabilir. Ek olarak, bu sürücüye özgü sabitler sadece bu sürücü kullanılıyorsa kullanılmalıdır. Sürücüye özgü özniteliklerin postgres sürücüsü ile kullanılması beklenmedik davranışlara yol açabilir. Eğer kodunuz çok sayıda sürücüye karşı çalışıyorsa sürücüyü sınayacak PDO::ATTR_DRIVER_NAME özniteliğini sağlamak için PDO::getAttribute() kullanılabilir.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (bool)
Öntanımlı olarak tüm deyimler tamponlu kipte yürütülür. Bir PDO nesnesi üzerinde bu özniteliğe false atanırsa MySQL sürücüsü tamponlu kipi kullanır.

Örnek 1 - MySQL sürücüsünde tamponlu kipi zorlamak

<?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)

LOAD LOCAL INFILE etkin olur.

Bu sabitin, yeni bir veritabanı tanıtıcısı oluştururken yalnızca driver_options dizisinde kullanılabileceğini unutmayın.

PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY (string)

LOCAL DATA yüklemesinin bu belirlenmiş dizinde bulunan dosyalarla sınırlanmasına izin verir. PHP 8.1.0 ve sonrasında kullanılabilir.

Bu sabitin, yeni bir veritabanı tanıtıcısı oluştururken yalnızca driver_options dizisinde kullanılabileceğini unutmayın.

PDO::MYSQL_ATTR_INIT_COMMAND (string)

MySQL sunucusuna bağlanırken çalıştırılacak komut. Yeniden bağlantı sırasında otomatik olarak bu komut çalıştırılır.

Bu sabitin, yeni bir veritabanı tanıtıcısı oluştururken yalnızca driver_options dizisinde kullanılabileceğini unutmayın.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (int)

Seçenekler my.cnf yerine burada belirtilen dosyadan okunur. Bu seçenek, mysqlnd ile kullanılamaz, çünkü mysqlnd, mysql yapılandırma dosyalarını okumaz.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (int)

Seçenekler my.cnf dosyasında belirtilen gruptan veya MYSQL_READ_DEFAULT_FILE ile belirtilen dosyadan okunur. Bu seçenek, mysqlnd ile kullanılamaz, çünkü mysqlnd, mysql yapılandırma dosyalarını okumaz.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (int)

Azami tampon büyüklüğü; 1 MiB öntanımlıdır. Derleme mysqlnd'ye rağmen yapıldığında bu sabit desteklenmez.

PDO::MYSQL_ATTR_DIRECT_QUERY (int)

Hazır deyimler kullanılmaz, sorgular doğrudan çalıştırılır.

PDO::MYSQL_ATTR_FOUND_ROWS (int)

Değişen satırların değil, bulunan (eşleşen) satırların satısı döner.

PDO::MYSQL_ATTR_IGNORE_SPACE (int)

İşlev isimlerinden sonra boşluklara izin verir. Tüm işlev isimlerini ayrılmış sözcük haline getirir.

PDO::MYSQL_ATTR_COMPRESS (int)

Ağ iletişim sıkıştırmasını etkin kılar.

PDO::MYSQL_ATTR_SSL_CA (int)

SSL sertifika yetkilisinin dosya yolu.

PDO::MYSQL_ATTR_SSL_CAPATH (int)

PEM biçiminde saklanan güvenilir SSL CA sertifikalarını içeren dizinin dosya yolu.

PDO::MYSQL_ATTR_SSL_CERT (int)

SSL sertifikasının dosya yolu.

PDO::MYSQL_ATTR_SSL_CIPHER (int)

OpenSSL tarafından anlaşılan biçemde, SSL şifrelemesi için kullanılmasına izin verilen bir veya daha fazla şifrenin listesi. Örnek: DHE-RSA-AES256-SHA:AES128-SHA

PDO::MYSQL_ATTR_SSL_KEY (int)

SSL anahtarının dosya yolu.

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (int)

Sunucu SSL sertifikasının doğrulanmasını devre dışı bırakmanın bir yolunu sağlar.

Mevcut olduğu PHP sürümleri: 7.0.18 ve PHP 7.1.4.

PDO::MYSQL_ATTR_MULTI_STATEMENTS (int)

false olarak ayarlandığında hem PDO::prepare() hem de PDO::query() işlevinde çoklu sorgu yürütmesini devre dışı bırakır.

Bu sabitin, yeni bir veritabanı tanıtıcısı oluştururken yalnızca driver_options dizisinde kullanılabileceğini unutmayın.

Çalışma Anı Yapılandırması

Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.

PDO_MYSQL Configuration Options
İsim Öntanımlı Değişlik Yeri
pdo_mysql.default_socket "/tmp/mysql.sock" INI_SYSTEM
pdo_mysql.debug NULL INI_SYSTEM
INI_* kiplerinin tanımları ve ayrıntılı açıklamaları Yapılandırma ayarlarının yeri bölümünde bulunabilir.

Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.

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 bool

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

İçindekiler

add a note 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
9
brian at diamondsea dot com
16 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
17 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
1
curt at webmasterbond dot com
13 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
-3
miller_kurt_e at yahoo dot com
16 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
-6
vafa ghoreyshi atgmailcom
7 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
-40
Gerald Schneider
11 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