<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.pdo.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'pdo.connections.php',
    1 => 'Conexiones y gestor de conexi&oacute;n',
    2 => 'Conexiones y gestor de conexi&oacute;n',
  ),
  'up' => 
  array (
    0 => 'book.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.constants.fetch-modes.php',
    1 => 'Modos de recuperaci&oacute;n',
  ),
  'next' => 
  array (
    0 => 'pdo.transactions.php',
    1 => 'Transacciones y validaci&oacute;n autom&aacute;tica (autocommit)',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/pdo/connections.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="pdo.connections" class="chapter">
 <h1 class="title">Conexiones y gestor de conexión</h1>

 <p class="para">
  Las conexiones se establecen creando instancias de la clase base de PDO.
  No importa qué controlador se desee utilizar; siempre se utiliza el nombre
  de la clase PDO. El constructor acepta argumentos para especificar
  la fuente de la base de datos (conocida como DSN) y opcionalmente,
  el nombre de usuario y la contraseña (si los hay).
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Conexión a MySQL</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Si existen errores de conexión, se lanza un objeto <code class="literal">PDOException</code>.
  Este error puede ser capturado si se desea gestionar la excepción, o bien
  puede ser tratado por el gestor global de excepciones definido
  mediante la función <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span>.
 </p>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 Gestión de errores de conexión</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">try {<br />    </span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br />} catch (</span><span style="color: #0000BB">PDOException $e</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// intentar reintentar la conexión después de un cierto tiempo, por ejemplo<br /></span><span style="color: #007700">}</span></span></code></div>
   </div>

  </div>
 </p>
 <div class="warning"><strong class="warning">Advertencia</strong>
  <p class="para">
   Al igual que todas las demás <a href="language.exceptions.php" class="link">excepciones</a>,
   <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> puede ser capturada ya sea explícitamente, mediante
   una instrucción <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, o implícitamente a través de <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span>.
   De lo contrario, se producirá el comportamiento por defecto de convertir una excepción no capturada en una
   <strong><code>E_FATAL_ERROR</code></strong>.
   El error fatal contendrá un backtrace que podría revelar detalles sobre la conexión.
   Por lo tanto, la opción <var class="filename">php.ini</var> <a href="errorfunc.configuration.php#ini.display-errors" class="link"><code class="literal">display_errors</code></a>
   debe estar configurada a <code class="literal">0</code> en un servidor de producción.
  </p>
 </div>
 <p class="para">
  Cuando la conexión a la base de datos tiene éxito, se devuelve una instancia de la clase
  PDO al script. La conexión permanece activa mientras el objeto PDO lo esté. Para cerrar la conexión,
  se debe destruir el objeto asegurándose de que todas sus referencias sean eliminadas. Esto puede hacerse
  asignando <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> a la variable que gestiona el objeto. Si no se hace explícitamente, PHP cerrará
  automáticamente la conexión cuando el script llegue al final.
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <span class="simpara">
   Si aún existen otras referencias a esta instancia PDO (por ejemplo,
   desde una instancia PDOStatement u otras variables que referencian
   la misma instancia PDO), estas también deben ser eliminadas (por
   ejemplo, asignando <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> a la variable que referencia el PDOStatement).
  </span>
 </p></blockquote>
 <p class="para">
  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 Cierre de una conexión</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// usar la conexión aquí<br /></span><span style="color: #0000BB">$sth </span><span style="color: #007700">= </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT * FROM foo'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// y ahora, cerrarla !<br /></span><span style="color: #0000BB">$sth </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Muchas aplicaciones web utilizan conexiones persistentes a los servidores
  de base de datos. Las conexiones persistentes no se cierran al final del
  script, sino que se almacenan en caché y se reutilizan cuando otro script solicita una conexión
  utilizando los mismos parámetros. La caché de conexiones persistentes
  permite evitar establecer una nueva conexión cada vez que un
  script necesita acceder a una base de datos, lo que hace que la aplicación web sea más rápida.
 </p>
 <p class="para">
  <div class="example" id="example-4">
   <p><strong>Ejemplo #4 Conexiones persistentes</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">, array(<br />    </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_PERSISTENT </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true<br /></span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  El valor de la opción <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> se convierte
  en <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> (activar/desactivar conexiones persistentes), a menos que sea
  una <span class="type"><a href="language.types.string.php" class="type string">string</a></span> no numérica, en cuyo caso esto permite el uso de
  varios grupos de conexiones persistentes.
  Esto es útil si las conexiones diferentes utilizan parámetros
  incompatibles, por ejemplo, valores diferentes de
  <strong><code><a href="ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query">PDO::MYSQL_ATTR_USE_BUFFERED_QUERY</a></code></strong>.
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   Si se desea utilizar conexiones persistentes, se debe
   utilizar el valor <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> en el
   array de opciones del controlador pasado al constructor PDO. Si se
   establece este atributo con el método <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   después de la instanciación del objeto, el controlador no utilizará las
   conexiones persistentes.
  </p>
 </p></blockquote>
 <div class="warning"><strong class="warning">Advertencia</strong>
  <p class="para">
   PDO no realiza ninguna limpieza de las conexiones persistentes. Las tablas temporales, los bloqueos, las transacciones y otros cambios
   con estado pueden permanecer de usos anteriores de la conexión, causando problemas inesperados. Consulte la sección
   <a href="features.persistent-connections.php" class="link">Conexiones persistentes a bases de datos</a> para más información.
  </p>
 </div>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   Si se utiliza el controlador PDO ODBC y si su librería ODBC soporta
   el pool de conexiones ODBC (tanto unixODBC como Windows lo soportan;
   puede ser más), entonces se recomienda no utilizar las conexiones persistentes
   PDO, sino dejar que el pool de conexiones ODBC almacene en caché las conexiones.
   El pool de conexiones ODBC es compartido con otros módulos en el proceso;
   si PDO almacena en caché la conexión, entonces esta conexión nunca será devuelta
   por el pool de conexiones ODBC, lo que hace que se creen múltiples conexiones para
   otros módulos.
  </p>
 </p></blockquote>
</div>
<?php manual_footer($setup); ?>