<?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.error-handling.php',
    1 => 'Los errores y su gesti&oacute;n',
    2 => 'Los errores y su gesti&oacute;n',
  ),
  'up' => 
  array (
    0 => 'book.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.prepared-statements.php',
    1 => 'Consultas preparadas y procedimientos almacenados',
  ),
  'next' => 
  array (
    0 => 'pdo.lobs.php',
    1 => 'Los objetos grandes (LOB)',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/pdo/error-handling.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="pdo.error-handling" class="chapter">
 <h1 class="title">Los errores y su gestión</h1>

 <p class="para">
  PDO ofrece 3 formas diferentes de gestionar los errores para adaptarse mejor
  a la aplicación.
 </p>
 <ul class="itemizedlist">
  <li class="listitem">
   <p class="para">
    <strong><code><a href="pdo.constants.php#pdo.constants.errmode-silent">PDO::ERRMODE_SILENT</a></code></strong>
   </p>
   <p class="para">
    Anterior a PHP 8.0.0, este es el modo por omisión.
    PDO define simplemente el código de error para ser inspeccionado
    mediante los métodos <span class="methodname"><a href="pdo.errorcode.php" class="methodname">PDO::errorCode()</a></span> y
    <span class="methodname"><a href="pdo.errorinfo.php" class="methodname">PDO::errorInfo()</a></span> en los objetos que representan
    las consultas, así como en los que representan las bases de datos; si el error
    resulta de una llamada al objeto que representa la consulta, se puede llamar
    al método <span class="methodname"><a href="pdostatement.errorcode.php" class="methodname">PDOStatement::errorCode()</a></span> o al método
    <span class="methodname"><a href="pdostatement.errorinfo.php" class="methodname">PDOStatement::errorInfo()</a></span> en el objeto.
    Si el error resulta de una llamada al objeto que representa una base de datos,
    también se pueden llamar estos dos mismos métodos en el objeto.
   </p>
  </li>
  <li class="listitem">
   <p class="para">
    <strong><code><a href="pdo.constants.php#pdo.constants.errmode-warning">PDO::ERRMODE_WARNING</a></code></strong>
   </p>
   <p class="para">
    Además de definir el código de error, PDO emitirá un mensaje E_WARNING
    tradicional. Esta configuración es útil durante las pruebas y el depurado,
    si se desea ver el problema sin interrumpir la aplicación.
   </p>
  </li>
  <li class="listitem">
   <p class="para">
    <strong><code><a href="pdo.constants.php#pdo.constants.errmode-exception">PDO::ERRMODE_EXCEPTION</a></code></strong>
   </p>
   <p class="para">
    A partir de PHP 8.0.0, este es el modo por omisión.
    Además de definir el código de error, PDO lanzará una excepción
    <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> y definirá las propiedades
    para representar el código de error y la información complementaria.
    Esta configuración es igualmente útil durante el depurado, ya que
    permitirá &quot;saltar&quot; el punto crítico del código, mostrando rápidamente
    el problema encontrado (recuerde: las transacciones son automáticamente
    revertidas si la excepción hace que el script termine).
   </p>
   <p class="para">
    El modo &quot;excepción&quot; es también muy útil ya que permite
    estructurar el gestor de errores de forma más clara que
    con las alertas tradicionales de PHP y, además, con menos código que
    cuando se ejecuta el código en modo silencio, y se verifica sistemáticamente
    los valores devueltos después de cada llamada a la base de datos.
   </p>
   <p class="para">
    Ver el capítulo sobre las <a href="language.exceptions.php" class="link">excepciones</a>
    para más información sobre las excepciones en PHP.
   </p>
  </li>
 </ul>
 <p class="para">
  PDO utiliza los códigos de error SQL-92 SQLSTATE; cada controlador PDO es
  responsable de vincular sus códigos nativos a los códigos SQLSTATE apropiados.
  El método <span class="methodname"><a href="pdo.errorcode.php" class="methodname">PDO::errorCode()</a></span> devuelve un código
  SQLSTATE único. Si se necesitan información específica sobre el error, PDO
  también ofrece el método <span class="methodname"><a href="pdo.errorinfo.php" class="methodname">PDO::errorInfo()</a></span>
  que devuelve un array conteniendo el código SQLSTATE, el código de error específico
  del controlador y la cadena describiendo el error proveniente del controlador.
 </p>

 <p class="para">
  <div class="example" id="example-1"><p><strong>Ejemplo #1 Creación de una instancia PDO y
   definición del modo de error</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dsn </span><span style="color: #007700">= </span><span style="color: #DD0000">'mysql:dbname=testdb;host=127.0.0.1'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #DD0000">'dbuser'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$password </span><span style="color: #007700">= </span><span style="color: #DD0000">'dbpass'</span><span style="color: #007700">;<br /><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: #0000BB">$dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setAttribute</span><span style="color: #007700">(</span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_ERRMODE</span><span style="color: #007700">, </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ERRMODE_EXCEPTION</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Esto provocará una PDOException (cuando la tabla no existe).<br /></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 wrongcolumn FROM wrongtable"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table &#039;testdb.wrongtable&#039; doesn&#039;t exist in /tmp/pdo_test.php:10
Stack trace:
#0 /tmp/pdo_test.php(10): PDO-&gt;query(&#039;SELECT wrongcol...&#039;)
#1 {main}
  thrown in /tmp/pdo_test.php on line 10
</pre></div>
   </div>
  </div>
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   <span class="methodname"><a href="pdo.construct.php" class="methodname">PDO::__construct()</a></span> siempre lanza una excepción
   <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> si la conexión falla, independientemente de la configuración
   de <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong>.
  </p>
 </p></blockquote>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 Crea una instancia PDO y define el modo de error desde el constructor</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dsn </span><span style="color: #007700">= </span><span style="color: #DD0000">'mysql:dbname=test;host=127.0.0.1'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #DD0000">'googleguy'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$password </span><span style="color: #007700">= </span><span style="color: #DD0000">'googleguy'</span><span style="color: #007700">;<br /><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: #0000BB">$dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">, array(</span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_ERRMODE </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ERRMODE_WARNING</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Esto hará que PDO lance un error de nivel E_WARNING en lugar de una excepción (cuando la tabla no existe)<br /></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 wrongcolumn FROM wrongtable"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

    <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table &#039;test.wrongtable&#039; doesn&#039;t exist in
/tmp/pdo_test.php on line 9
</pre></div>
    </div>
  </div>
 </p>
</div>
<?php manual_footer($setup); ?>