PHP 5.4.33 Released

Funciones de MySQL (PDO_MYSQL)

Introducción

PDO_MYSQL es un controlador que implementa la interfaz de Objetos de Datos de PHP (PDO) para permitir el acceso de PHP a bases de datos de MySQL 3.x, 4.x y 5.x.

PDO_MYSQL aprovechará el soporte nativo de sentencias preparadas presente en MySQL 4.1 y superior. Si se utiliza una versión anterior de las bibliotecas cliente de MySQL, PDO las emulará.

Advertencia

Algunos tipos de tablas (motores de almacenamiento) de MySQL no admiten transacciones. Cuando se escribe código de base de datos transaccional usando un tipo de tabla que no soporta transacciones, MySQL aparentará que se inició una transacción éxito. Además, cualquier consulta DDL ejecutada consignará implícitamente cualquier transacción pendiente.

Instalación

Utilice --with-pdo-mysql[=DIR] para instalar la extensión PDO MySQL, donde la opción [=DIR] es el directorio base de la instalación de MySQL. Si a [=DIR] se le pasa mysqlnd, entonces será utilizado el controlador nativo de MySQL.

Opcionalmente, --with-mysql-sock[=DIR] establece la ubicación del puntero del socket de unix de MySQL para todas las extensiones de MySQL, incluyendo PDO_MYSQL. Si no se especifica, se buscará en las ubicaciones predeterminadas.

Opcionalmente, --with-zlib-dir[=DIR] se utiliza para establecer la ruta para el prefijo de instalación de libz.

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

El soporte para SSL se habilita mediante las constantes de PDO_MySQL apropiadas, lo cual es equivalente a llamar a la » función mysql_ssl_set() de la API en C de MySQL. Asimismo, SSL no se puede habilitar con PDO::setAttribute, debido a que la conexión ya existe. Véase también la documentación de MySQL sobre » conectarse a MySQL con SSL.

Historial de cambios
Versión Descripción
5.4.0 Ya no se da soporte a las bibliotedas cliente de MySQL 4.1 y anteriores.
5.3.9 Agregado el soporte para SSL con mysqlnd y OpenSSL.
5.3.7 Agregado el soporte para SSL con libmysqlclient y OpenSSL.

Constantes predefinidas

Estas constantes están definidas por este controlador, y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución. Además, estas constantes específicas del controlador deberían ser utilizadas sólo si está usando este controlador. Usar atributos específicos del controlador con otro controlador podría resultar en un comportamiento inesperado. PDO::getAttribute() puede ser empleado para obtener el atributo PDO_ATTR_DRIVER_NAME para verificar el controlador, si el código puede ejecutarse con múltiples controladores.

MYSQL_ATTR_USE_BUFFERED_QUERY (integer)
Si este atributo es definido como TRUE en PDOStatement, el controlador de MySQL usará las versiones de la API de MySQL guardadas en el búfer. Si se está escribiendo código portable, en su lugar se debería usar PDOStatement::fetchAll().

Ejemplo #1 Forzar consultas para que sean guardadas en el búfer en mysql

<?php
if ($bs->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
    
$sentencia $bs->prepare('select * from foo',
        array(
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
} else {
    die(
"mi aplicación sólo funciona con mysql; debería usar \$sentencia->fetchAll() en su lugar");
}
?>

MYSQL_ATTR_LOCAL_INFILE (integer)

Activa LOAD LOCAL INFILE.

Se ha de tener en cuenta que esta constante se puede usar solamente en el array driver_options cuando se construye un nuevo gestor de base de datos.

MYSQL_ATTR_INIT_COMMAND (integer)

Comando a ejecutar cuando se conecta al servidor MySQL. Al reconectar se volverá a ejecutar automáticamente.

Se ha de tener en cuenta que esta constante se puede usar solamente en el array driver_options cuando se construye un nuevo gestor de base de datos.

MYSQL_ATTR_READ_DEFAULT_FILE (integer)

Lee las opciones desde el fichero indicado en lugar de my.cnf. Si se usa mysqlnd, esta opción no está disponible debido a que mysqlnd no lee los fichero de configuración de mysql.

MYSQL_ATTR_READ_DEFAULT_GROUP (integer)

Opciones de lectura del grupo indicado desde my.cnf o desde el fichero especificado con MYSQL_READ_DEFAULT_FILE. Si se usa mysqlnd, esta opción no está disponible debido a que mysqlnd no lee los ficheros de configuración de mysql.

MYSQL_ATTR_MAX_BUFFER_SIZE (integer)

Tamaño máximo del búfer. Lo predeterminado es MiB. Esta constante no está admitida cuando se compila para mysqlnd.

MYSQL_ATTR_DIRECT_QUERY (integer)

Realiza consultas directas, no usa setencias preparadas.

MYSQL_ATTR_FOUND_ROWS (integer)

Devuelve el número de filas encontradas (coindicentes), no el número de filas modificadas.

MYSQL_ATTR_IGNORE_SPACE (integer)

Permite espacios después de los nombres de función. Hace de todos los nombres de función palabras reservadas.

MYSQL_ATTR_COMPRESS (integer)

Activa la compresión de comunicación de red. Esta constante no está admitida cuando se compila para mysqlnd.

MYSQL_ATTR_SSL_CA (integer)

La ruta al fichero de la autoridad certificadora SSL.

Existe a partir de PHP 5.3.7.

MYSQL_ATTR_SSL_CAPATH (integer)

La ruta al directorio que contiene los certificados AC SSL autorizados, los cuales están almacenados en formato PEM.

Existe a partir de PHP 5.3.7.

MYSQL_ATTR_SSL_CERT (integer)

La ruta al fichero del certificado SSL.

Existe a partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_CIPHER (integer)

Una lista de uno o más cifradores permisibles a usar para la encriptación SSL, en un formato entendido por OpenSSL. Por ejemplo: DHE-RSA-AES256-SHA:AES128-SHA

Existe a partir de PHP 5.3.7.

PDO::MYSQL_ATTR_SSL_KEY (integer)

La ruta al fichero de la clave SSL.

Existe a partir de PHP 5.3.7.

Configuración en tiempo de ejecución

El comportamiento de estas funciones se ve afectado por la configuración de php.ini.

Opciones de configuración de PDO_MYSQL
Nombre Por defecto Cambiable
pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM
pdo_mysql.debug NULL PHP_INI_SYSTEM
Para más detalles y definiciones de los modos de PHP_INI_*, vea Dónde se puede realizar un ajuste de configuración.

He aquí una breve explicación de las directivas de configuración.

pdo_mysql.default_socket string

Establece un socket de dominio Unix. Este valor se puede establecer en tiempo de compilación si un socket de dominio se encuentra en la configuración. Este ajuste ini es sólo de Unix.

pdo_mysql.debug boolean

Activa la depuración de PDO_MYSQL. Este ajuste solo está disponible cuando PDO_MYSQL está compilado para mysqlnd y en el modo de depuración de PDO.

Tabla de contenidos

add a note add a note

User Contributed Notes 11 notes

up
8
dibakar at talash dot net
8 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
4
rmottey at gmail dot com
6 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
davey at php dot net
7 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()

- Davey
up
1
marty at excudo dot net
6 years ago
Davey wrote:
> 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()
>
> - Davey

Almost correct. It should be:

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

so, without the quotes.
otherwise it still won't work :)
up
1
brian at diamondsea dot com
6 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
0
curt at webmasterbond dot com
3 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
miller_kurt_e at yahoo dot com
6 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
Gerald Schneider
10 months 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
-4
david at manifestwebdesign dot com
2 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
-6
kat dot shupe dot work at gmail dot com
5 months ago
So, I'm trying to get one PHP file to be able to call from two SQL databases at the same time. How can I do that? Or rather, how can I close a connection being made by SqltoAssoc PDO function so I can start a second one with a completely different SQL database?

Thanks in advanced!
up
-14
konrads dot smelkovs at gmail dot com
7 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