1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-24 07:12:15 +01:00
Files
archived-doc-de/reference/pdo/error-handling.xml
Martin Samesch 6283fc4752 Sync with EN
2022-09-24 19:01:42 +02:00

164 lines
5.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 1508d46d0998c4843a22d28460bb6c4244290129 Maintainer: xatenev Status: ready -->
<!-- Reviewed: yes -->
<!-- Rev-Revision: eae19eb5fe0f5bebcbce382ea7a505cedeb5a883 Reviewer: samesch -->
<chapter xml:id="pdo.error-handling" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Fehler und Fehlerbehandlung</title>
<para>
PDO bietet Ihnen die Wahl unter 3 verschiedenen Strategien zur
Fehlerbehandlung, um Ihrem Stil der Anwendungsentwicklung gerecht zu werden.
</para>
<itemizedlist>
<listitem>
<para>
<constant>PDO::ERRMODE_SILENT</constant>
</para>
<para>
Vor PHP 8.0.0 war das die Standardmethode. PDO setzt einfach den
Fehler-Code, damit Sie ihn mit den Methoden
<methodname>PDO::errorCode</methodname> und
<methodname>PDO::errorInfo</methodname> sowohl im Statement- als auch im
Datenbank-Objekt überprüfen können. Wenn der Fehler aus einem Aufruf eines
Statement-Objekts hervorging, würden Sie die Methoden
<methodname>PDOStatement::errorCode</methodname> oder
<methodname>PDOStatement::errorInfo</methodname> des Objekts aufrufen. Wenn
der Fehler aus einem Aufruf des Datenbank-Objekts hervorging, würden Sie
diese Methoden stattdessen auf dem Datenbank-Objekt aufrufen.
</para>
</listitem>
<listitem>
<para>
<constant>PDO::ERRMODE_WARNING</constant>
</para>
<para>
Zusätzlich zum Setzen des Fehler-Codes wird PDO eine traditionelle
E_WARNING-Nachricht ausgeben. Diese Einstellung ist nützlich während des
Debuggens/Testens, wenn Sie sehen wollen, welche Probleme aufgetreten
sind, ohne den Ablauf der Anwendung zu unterbrechen.
</para>
</listitem>
<listitem>
<para>
<constant>PDO::ERRMODE_EXCEPTION</constant>
</para>
<para>
Seit PHP 8.0.0 ist das die Standardmethode. Zusätzlich zum Setzen des
Fehler-Codes wirft PDO eine <classname>PDOException</classname> und setzt
deren Eigenschaften so, dass sie den Fehler-Code und Fehlerinformationen
wiedergeben. Diese Einstellung ist auch nützlich während des Debuggens, da
sie das Skript am Ort des Fehlers gewissermaßen "sprengt" und sehr schnell
mögliche Problemstellen in Ihrem Code aufzeigt. (Zur Erinnerung:
Transaktionen bekommen automatisch einen Rollback, wenn eine Ausnahme das
Skript beendet.)
</para>
<para>
Diese Einstellung ist auch nützlich, da Sie ihre Fehlerbehandlung klarer
als mit traditionellen PHP-Warnungen strukturieren können und mit weniger
Code und Verschachtelung als im stillen Modus mit expliziter Überprüfung
des Rückgabewertes jedes einzelnen Datenbankaufrufes.
</para>
<para>
Unter <link linkend="language.exceptions">Ausnahmen</link> finden Sie
weitere Informationen über Ausnahmen in PHP.
</para>
</listitem>
</itemizedlist>
<para>
PDO benutzt Fehler-Codes nach SQL-92 SQLSTATE. Individuelle PDO-Treiber sind
selbst verantwortlich, ihre nativen Fehler-Codes in die entsprechenden
SQLSTATE-Pendants umzuwandeln. Die Methode
<methodname>PDO::errorCode</methodname> gibt einen einzelnen SQLSTATE-Code
zurück. Wenn Sie genauere Informationen über einen Fehler benötigen, bietet
PDO auch die Methode <methodname>PDO::errorInfo</methodname>, die ein Array
zurückgibt, das den SQLSTATE-Code, den treiberspezifischen Fehler-Code und
die treiberspezifische Fehlermeldung enthält.
</para>
<para>
<example>
<title>Eine PDO Instanz erstellen und die Fehlermethode setzen</title>
<programlisting role="php">
<![CDATA[
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// This will cause PDO to throw a PDOException (when the table doesn't exist)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10
Stack trace:
#0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...')
#1 {main}
thrown in /tmp/pdo_test.php on line 10
]]>
</screen>
</example>
</para>
<note>
<para>
<methodname>PDO::__construct</methodname> wirft immer eine
<classname>PDOException</classname>, wenn die Verbindung fehlschlägt
unabhängig davon welcher <constant>PDO::ATTR_ERRMODE</constant> gerade
eingestellt ist.
</para>
</note>
<para>
<example>
<title>Erzeugen eines PDO-Exemplars und setzen der Fehlermethode per Konstruktor</title>
<programlisting role="php">
<![CDATA[
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
// Dies wird PDO veranlassen einen Fehler der Stufe E_WARNING anstelle einer
// Exception auszulösen (falls die Tabelle nicht existiert)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in
/tmp/pdo_test.php on line 9
]]>
</screen>
</example>
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->