downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PDO_MYSQL DSN> <PDO_INFORMIX DSN
Last updated: Fri, 20 May 2011

view this page in

Funciones MySQL (PDO_MYSQL)

Introducción

PDO_MYSQL es un driver que implementa la extensión PHP Data Objects (PDO) para permitir el acceso de PHP a bases de datos MySQL 3.x, 4.x y 5.x.

PDO_MYSQL aprovechará el soporte nativo de declaraciones preparadas presentes en MySQL 4.1 y superior. Si una versión anterior de las bibliotecas de cliente de MySQL es utilizada, PDO las emulará.

Warning

Atención: Algunos tipos de tablas MySQL (motores de almacenamiento) no son compatibles con las transacciones. Cuando se escriba código de base de datos transaccional usando un tipo de tabla que no soporta transacciones, MySQL supondrá que una transacción fue iniciada con éxito. Además, cualquier consulta DDL emitida validará implícitamente cualquier transacción pendiente.

Instalación

Use --with-pdo-mysql[=DIR] to install the PDO MySQL extension, where the optional [=DIR] is the MySQL base install directory. If mysqlnd is passed as [=DIR], then the MySQL native driver will be used.

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

Constantes predefinidas

Estas constantes están definidas por este driver, 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 driver-specific deberían ser utilizadas sólo si está usando este driver. Usar atributos driver-specific con otro driver puede resultar en un comportamiento inesperado. PDO::getAttribute() puede ser empleado para obtener el atributo PDO_ATTR_DRIVER_NAME para comprobar el driver, si su código puede correr con múltiples drivers.

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

Example #3 Forzar consultas para que sean guardadas en el buffer en 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(
"mi aplicación sólo funciona con mysql; deberia \$stmt->fetchAll() en su lugar");
}
?>

PDO::MYSQL_ATTR_LOCAL_INFILE (integer)

Activa LOAD LOCAL INFILE.

Se tiene que tener en cuenta que esta constante puede ser usada solamente en el array driver_options mientras se está contruyendo un nuevo manejador de base de datos.

PDO::MYSQL_ATTR_INIT_COMMAND (integer)

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

Se tiene que tener en cuenta que esta constante puede ser usada solamente en el array driver_options mientras se está contruyendo un nuevo manejador de base de datos.

PDO::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 archivos de configuración de mysql.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (integer)

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

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (integer)

Tamaño máximo de buffer. Por defecto 1 MiB. Esta constante no es soportada cuando está compilada para mysqlnd.

PDO::MYSQL_ATTR_DIRECT_QUERY (integer)

Realiza consultas directas, no usa comandos preparados.

PDO::MYSQL_ATTR_FOUND_ROWS (integer)

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

PDO::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.

PDO::MYSQL_ATTR_COMPRESS (integer)

Activa la compresión de comunicación de red. Si se usa mysqlnd esta opción no está disponible.

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 Modificable
pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM
pdo_mysql.debug NULL PHP_INI_SYSTEM
Para mayor detalles y definiciones de los modos de PHP_INI_*, vea Dónde 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. Esta configuración ini es sólo 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 PDO modo de depuración.

Table of Contents



PDO_MYSQL DSN> <PDO_INFORMIX DSN
Last updated: Fri, 20 May 2011
 
add a note add a note User Contributed Notes MySQL (PDO)
curt at webmasterbond dot com 16-Apr-2011 12:54
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'
   
)
);
?>
rgagnon24 at gmail dot com 02-Jun-2010 04:06
Note that the MySQL option PDO::MYSQL_ATTR_LOCAL_INFILE can only be set during the initial construction of your PDO object.

It is not supported by PDO::getAttribute() nor PDO::setAttribute() for MySQL PDO objects.
Davy Defaud 22-Apr-2009 07:30
This is the way to force mysql PDO driver to use UTF-8 for the connection :

<?php
$pdo
= new PDO(
   
'mysql:host=hostname;dbname=defaultDbName',
   
'username',
   
'password',
    array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
?>
brian at diamondsea dot com 25-Jul-2008 06:26
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.
miller_kurt_e at yahoo dot com 20-Jul-2008 09:03
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.
practicegoodtheory at gmail dot com 19-Jun-2008 06:56
On Windows, with Apache, it would not load php_pdo_mysql.dll until I put libmysql.dll in Apache's dll path (e.g. apache/bin)
rmottey at gmail dot com 09-Jan-2008 11:51
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();
    }
?>
marty at excudo dot net 17-Oct-2007 12:13
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 :)
bratwizard at yahoo dot com 22-Sep-2007 07:59
> konrads dot smelkovs at gmail dot com
> 18-Jul-2007 03:39
> A note for the eager:
>> There is no way how to get returned row count from an executed prepared statement without fetching the rows.

Sure there is, just do something like this:

if ($sth = $pdo->prepare($sql)) {
    $sth->execute($values);
    $sth->fetch();

    // get count of rows in result set
   if ($sth_rc = $this->getDataset()->query('SELECT FOUND_ROWS()')) {
        $row_count = $sth_rc->fetchColumn(0);
        }
    }
konrads dot smelkovs at gmail dot com 18-Jul-2007 10:39
A note for the eager:
There is no way how to get returned row count from an executed prepared statement without fetching the rows.
davey at php dot net 06-Jun-2007 08:46
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
dibakar at talash dot net 12-Sep-2006 06:31
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();
    }

 
show source | credits | stats | sitemap | contact | advertising | mirror sites