<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'pdo.connections.php',
    1 => 'Verbindungen und Verbindungsmanagement',
    2 => 'Verbindungen und Verbindungsmanagement',
  ),
  'up' => 
  array (
    0 => 'book.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.constants.php',
    1 => 'Vordefinierte Konstanten',
  ),
  'next' => 
  array (
    0 => 'pdo.transactions.php',
    1 => 'Transaktionen und auto-commit',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    '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">Verbindungen und Verbindungsmanagement</h1>

 <p class="para">
  Verbindungen werden durch das Erstellen von Instanzen der PDO-Basisklasse
  erzeugt. Es ist unerheblich, welchen Treiber Sie benutzen wollen. Sie
  benutzen immer den PDO-Klassennamen. Der Konstruktor erwartet Parameter
  zur Angabe der Datenbankquelle (auch bekannt als DSN) und optional für
  Benutzername und Passwort (falls vorhanden).
 </p>
 <p class="para">
  <div class="example" id="example-1"><p><strong>Beispiel #1 Mit MySQL verbinden</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">
  Wenn es Fehler bei der Verbindung gibt, wird eine Ausnahme vom Typ
  <code class="literal">PDOException</code> geworfen. Sie können die Ausnahme abfangen,
  wenn Sie sich selbst um die Fehlerbedingung kümmern wollen, oder Sie
  können es einer globalen Routine zur Ausnahmebehandlung überlassen, die
  Sie mit <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> konfigurieren.
 </p>
 <p class="para">
  <div class="example" id="example-2"><p><strong>Beispiel #2 Verbindungsfehler behandeln</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">// z.B. nach einem Timeout versuchen, die Verbindung erneut aufzubauen<br /></span><span style="color: #007700">}</span></span></code></div>
   </div>

  </div>
 </p>
 <div class="warning"><strong class="warning">Warnung</strong>
  <p class="para">
   Wie jede andere <a href="language.exceptions.php" class="link">Exception</a> kann
   auch <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> entweder explizit über eine
   <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>-Anweisung oder implizit über
   <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> abgefangen werden. Andernfalls
   ist das Standardverhalten, eine nicht abgefangene Exception in einen
   <strong><code>E_FATAL_ERROR</code></strong> umzuwandeln. Der fatale Fehler enthält
   einen Backtrace, der Verbindungsdetails preisgeben könnte. Deshalb sollte
   die <var class="filename">php.ini</var>-Option
   <a href="errorfunc.configuration.php#ini.display-errors" class="link"><code class="literal">display_errors</code></a>
   auf einem Produktionsserver auf <code class="literal">0</code> gesetzt werden.
  </p>
 </div>
 <p class="para">
  Bei erfolgreicher Verbindung zur Datenbank wird eine Instanz der
  PDO-Klasse an Ihr Skript zurückgegeben. Die Verbindung bleibt während der
  Lebensdauer des PDO-Objekts aktiv. Um die Verbindung zu beenden, müssen
  Sie das Objekt löschen, indem Sie sicherstellen, dass alle Referenzen
  darauf gelöscht werden - das erreichen Sie, indem Sie der Variable, die
  das Objekt beinhaltet, <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> zuweisen. Wenn Sie das nicht explizit tun,
  schließt PHP die Verbindung automatisch, wenn Ihr Skript endet.
 </p>
 <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
  <span class="simpara">
   Gibt es noch weitere Referenzen auf dieses PDO-Exemplar (wie etwa von einem
   PDOStatement-Exemplar, oder von anderen Variablen, die dasselbe PDO-Exemplar
   referenzieren), müssen diese ebenfalls entfernt werden (zum Beispiel durch
   die Zuweisung von <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> an die Variable, die das PDOStatement referenziert).
  </span>
 </p></blockquote>
 <p class="para">
  <div class="example" id="example-3"><p><strong>Beispiel #3 Eine Verbindung schließen</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">// hier die Verbindung nutzen<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">// und nachdem das erledigt ist, wird sie geschlossen<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">
  Viele Webanwendungen profitieren von persistenten Verbindungen zum
  Datenbankserver. Persistente Verbindungen werden nicht am Ende des Skripts
  geschlossen, sondern werden gecacht und wiederverwendet, wenn ein anderes
  Skript eine Verbindung mit denselben Daten anfordert. Der Cache an
  persistenten Verbindungen erlaubt Ihnen, den Overhead zu vermeiden, wenn
  jedesmal eine neue Verbindung geöffnet wird, sobald ein Skript mit der
  Datenbank kommunizieren muss, was sich in einer schnelleren Anwendung
  widerspiegelt.
 </p>
 <p class="para">
  <div class="example" id="example-4"><p><strong>Beispiel #4 Persistente Verbindungen</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">
  Der Wert der <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> Option wird nach <a href="language.types.boolean.php" class="link">Boolean</a>
  kovertiert (aktiviere/deaktiviere persistente Verbindungen), es sei denn es ist ein
  nicht-numerischer <a href="language.types.string.php" class="link">String</a>; in diesem Fall ermöglicht es die Verwendung mehrerer
  persistenter Verbindungspools. Das ist nützlich, wenn unterschiedliche Verbindungen
  inkompatible Einstellungen verwenden, beispielsweise unterschiedliche Werte von
  <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">Hinweis</strong>: 
  <p class="para">
   Wenn Sie persistente Verbindungen verwenden wollen, müssen Sie
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> im Array von Treiberoptionen
   setzen, das an den PDO-Konstruktor übergeben wird. Wenn Sie dieses Attribut
   mittels <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span> nach der Instanziierung des
   Objekts setzen, verwendet der Treiber keine persistenten Verbindungen.
  </p>
 </p></blockquote>
 <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
  <p class="para">
   Wenn Sie den PDO-ODBC-Treiber benutzen und Ihre ODBC-Bibliotheken ODBC Connection
   Pooling unterstützen (unixODBC und Windows etwa, es könnte auch andere geben), dann
   wird empfohlen, dass sie keine persistenten PDO-Verbindungen benutzen, sondern das
   Cachen der Verbindungen der ODBC Connection Pooling-Schicht überlassen. Der ODBC
   Connection Pool wird mit anderen Modulen im Prozess geteilt. Wenn PDO also
   angewiesen wird die Verbindung zu cachen, wird diese Verbindung nie dem ODBC
   Connection Pool zurückgegeben, was darin resultiert, dass zusätzliche Verbindungen
   aufgebaut werden, um jene anderen Module zu bedienen.
  </p>
 </p></blockquote>
</div>
<?php manual_footer($setup); ?>