PHP 7.1.0 Released

Funções do MySQL (PDO_MYSQL)

Introdução

PDO_MYSQL é um driver que implementa a interface PHP Data Objects (PDO) para habilitar o acesso do PHP ao MySQL 3.x, 4.x and 5.x.

PDO_MYSQL utiliza as vantagens do suporte nativo à prepared statement presente no MySQL 4.1 e superior. Se você está usando uma versão antiga da biblioteca do cliente mysql, o PDO irá emular o prepared statement.

Aviso

Cuidado: Alguns tipos de tabelas do MySQL (storage engines) não suportam transações. Ao escrever código para um banco de dados transacional onde o tipo de tabela não suporta transações, o MySQL irá entender que a transação foi inicializada com sucesso. Além disso, qualquer query DDL irá, de forma implícita, executar o commit para qualquer transação que esteja pendente.

Instalação

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 than 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. As of PHP 5.4, 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.

Changelog
Versão Descrição
5.4.0 mysqlnd became the default MySQL library when compiling PDO_MYSQL. Previously, libmysqlclient was the default MySQL library.
5.4.0 MySQL client libraries 4.1 and below are no longer supported.
5.3.9 Added SSL support with mysqlnd and OpenSSL.
5.3.7 Added SSL support with libmysqlclient and OpenSSL.

Constantes pré-definidas

As constantes abaixo são definidas por este driver, e somente estarão disponíveis quando esta extensão for compilada no PHP ou carregada dinamicamente em tempo de execução. Em adição, estas constantes especificas do drive somente devem ser usadas se você estive usando este drive. Usar atributos especificos do mysql com o driver postgree pode resultar em um funcionamento não esperado. PDO::getAttribute() deve ser usado para obter o atributo PDO_ATTR_DRIVER_NAME para se certificar do driver, se o seu código puder ser usado com vários drivers.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (integer)
Se esse atributo é definido como TRUE em um PDOStatement, o driver MySQL usará a versão bufferizada da API do MySQL. Se você está escrevendo um código portável, você deve usar PDOStatement::fetchAll().

Exemplo #1 Forçando queries a serem bufferizadas no 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)

Habilita LOAD LOCAL INFILE.

Note que essa constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

PDO::MYSQL_ATTR_INIT_COMMAND (integer)

Comando para executar ao se conectar no servidor MySQL. Irá ser executado novamente ao reconectar.

Note que essa constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (integer)

Lê configurações do arquivo definido nas opções ao invés do arquivo my.cnf. Essa opção não está disponível se mysqlnd for usado, porque mysqlnd não lê os arquivos de configurações do mysql.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (integer)

Lê configurações do grupo nomeado em my.cnf ou no arquivo especificado com MYSQL_READ_DEFAULT_FILE. Essa opção não está disponível se mysqlnd for usado, porque mysqlnd não lê os arquivos de configurações do mysql.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (integer)

Tamanho máximo do buffer. O padrão é 1 MiB. Essa constante não é suportada quando utilizado mysqlnd.

PDO::MYSQL_ATTR_DIRECT_QUERY (integer)

Executa queries diretamente, não usa prepared statements.

PDO::MYSQL_ATTR_FOUND_ROWS (integer)

Retorna a quantidade de linhas encontradas (matched), e não a quantidade de linhas modificadas.

PDO::MYSQL_ATTR_IGNORE_SPACE (integer)

Permite espaços depois do nome das funções. Torna o nome de todas as funções palavras reservadas.

PDO::MYSQL_ATTR_COMPRESS (integer)

Habilita a compressão na comunicação de rede. Também é suportado quando é compilado usando mysqlnd a partir do PHP 5.3.11.

PDO::MYSQL_ATTR_SSL_CA (integer)

Caminho para o arquivo da autoridade certificadora (CA) SSL.

Isto existe desde o PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CAPATH (integer)

Caminho para o diretório que contém os certificados SSL confiáveis da autoridade certificadora (CA), armazenados no formato PEM.

Isto existe desde o PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CERT (integer)

Caminho para o certificado SSL.

Isto existe desde o PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CIPHER (integer)

Uma lista de um ou mais "ciphers" admissíveis para usar na encriptação SSL, em um formato compreendido pelo OpenSSL. For example: DHE-RSA-AES256-SHA:AES128-SHA

Isto existe desde o PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_KEY (integer)

Caminho para a chave SSL.

Isto existe desde o PHP 5.3.7.

PDO::MYSQL_ATTR_MULTI_STATEMENTS (integer)

Desabilita a execução de queries múltiplas nas funções PDO::prepare() e PDO::query() quando definido como FALSE.

Note que essa constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

Isto existe desde o PHP 5.5.21 and PHP 5.6.5.

Configurações em Execução

O comportamento dessas funções podem ser modificado pelas configurações do php.ini.

PDO_MYSQL Configuration Options
Nome Padrão Modificável
pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM
pdo_mysql.debug NULL PHP_INI_SYSTEM
Para mais detalhes e definições dos modos PHP_INI_*, veja Onde uma configuração deve ser definida.

Uma rápida explicação das diretivas de configuração.

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.

Índice

add a note add a note

User Contributed Notes 12 notes

up
12
curt at webmasterbond dot com
5 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
6
brian at diamondsea dot com
8 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
9 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
0
proyecto2016
4 days ago
A way to doing a PDORepository

<?php
   
abstract class PDORepository{
        const
USERNAME="root";
        const
PASSWORD="";
        const
HOST="localhost";
        const
DB="parcial";

        private function
getConnection(){
           
$username = self::USERNAME;
           
$password = self::PASSWORD;
           
$host = self::HOST;
           
$db = self::DB;
           
$connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);
            return
$connection;
        }
        protected function
queryList($sql, $args){
           
$connection = $this->getConnection();
           
$stmt = $connection->prepare($sql);
           
$stmt->execute($args);
            return
$stmt;
        }
    }

?>
up
1
rmottey at gmail dot com
8 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
0
miller_kurt_e at yahoo dot com
8 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
-1
georgy dot garnov at gmail dot com
2 years ago
PDO::MYSQL_ATTR_LOCAL_INFILE - will not work if you have
open_basedir in your php.ini
up
-1
dibakar at talash dot net
10 years ago
PDO is much better option for calling procedures, views or triggers of mysql 5.x versions from PHP instead of using mysqli extension. Following is a simple demo script which can  help anybody on how to call and use mysql procedures through php

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();

        echo "<B>outputting...</B><BR>";
        while ($rs = $stmt->fetch(PDO::FETCH_OBJ)) {
            echo "output: ".$rs->name."<BR>";
        }
        echo "<BR><B>".date("r")."</B>";
   
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
up
-2
Gerald Schneider
3 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.
up
-8
david at manifestwebdesign dot com
5 years ago
The SSL options are silently ignored in PHP 5.3.8, see https://bugs.php.net/bug.php?id=55870
Looks like it's addressed upstream, I just want to save others the hour and a half I just wasted :)
up
-8
info at westgatesearch dot com
2 years ago
Here is a real world example of a PHP PDO MySQL Data Entry App with SQL Insert and redirect to a report to show the data "just entered" as auto-generated by an expert system, WizzyWeb

$handler = new PDO('mysql:host=localhost;dbname=db', 'username', 'password');

$sql = "INSERT INTO Employees (EmployeeFirstName, EmployeeLastName, EmployeeOffice, EmployeeDepartment, EmployeeEmailAddress, EmployeeExtension, EmployeeTitle) VALUES (:EmployeeFirstName, :EmployeeLastName, :EmployeeOffice, :EmployeeDepartment, :EmployeeEmailAddress, :EmployeeExtension, :EmployeeTitle)";

$query = $handler->prepare($sql);

$query->execute(array(
':EmployeeFirstName' => $EmployeeFirstName,
':EmployeeLastName' => $EmployeeLastName,
':EmployeeOffice' => $EmployeeOffice,
':EmployeeDepartment' => $EmployeeDepartment,
':EmployeeEmailAddress' => $EmployeeEmailAddress,
':EmployeeExtension' => $EmployeeExtension,
':EmployeeTitle' => $EmployeeTitle
));

// You can uncomment this code to see which PDO drivers are available and troubleshoot the PDO database connection
//try {
//   print_r(PDO::getAvailableDrivers()); # Enumerates available PDO drivers available
//   $handler = new PDO('mysql:host=localhost;dbname=db1', 'username', 'password');
//   $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//} catch(PDOException $e) {
//   echo $e->getMessage();
//   die();
//}

header("Location: http://www.wizzyweb.com/php/report.php");
up
-28
konrads dot smelkovs at gmail dot com
9 years ago
A note for the eager:
There is no way how to get returned row count from an executed prepared statement without fetching the rows.
To Top