<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqli.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'mysqli.overview.php',
    1 => '&Uuml;bersicht',
    2 => '&Uuml;bersicht',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'Mysqli',
  ),
  'prev' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'Mysqli',
  ),
  'next' => 
  array (
    0 => 'mysqli.quickstart.php',
    1 => 'Kurzanleitung f&uuml;r den schnellen Einstieg',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/mysqli/overview.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.overview" class="chapter">

  <h1 class="title">Übersicht</h1>


  <p class="para">
   Dieser Abschnitt bietet eine Einführung in die Möglichkeiten, die bei der
   Entwicklung einer PHP-Anwendung, die mit einer MySQL-Datenbank interagieren
   soll, zur Verfügung stehen.
  </p>

  <p class="para">
   <strong>Was ist eine API?</strong>
  </p>

  <p class="para">
   Eine Schnittstelle zur Programmierung von Anwendungen (Application
   Programming Interface, API) definiert die Klassen, Methoden, Funktionen und
   Variablen, die eine Anwendung aufrufen muss, um die gewünschte Aufgabe zu
   erfüllen. Im Falle von PHP-Anwendungen, die mit Datenbanken kommunizieren
   müssen, werden die erforderlichen APIs in der Regel über PHP-Erweiterungen
   bereitgestellt.
  </p>

  <p class="para">
   APIs können entweder prozedural oder objektorientiert sein. Bei einer
   prozeduralen API werden Funktionen aufgerufen, um Aufgaben auszuführen,
   während bei einer objektorientierten API Klassen instanziiert und dann die
   Methoden der resultierenden Objekte aufgerufen werden. Von den beiden ist
   die letztere in der Regel die bevorzugte Schnittstelle, da sie moderner ist
   und zu besser strukturiertem Code führt.
  </p>

  <p class="para">
   Wenn eine PHP-Anwendung geschrieben wird, die sich mit dem MySQL-Server
   verbinden muss, stehen mehrere APIs zur Verfügung. In diesem Dokument wird
   beschrieben, welche Möglichkeiten es gibt und welche die beste Wahl für die
   jeweilige Anwendung ist.
  </p>

  <p class="para">
   <strong>Was ist ein Konnektor?</strong>
  </p>

  <p class="para">
   Der Begriff Konnektor, wie er in der MySQL-Dokumentation verwendet wird,
   bezieht sich auf Software, die es ermöglicht, von einer Anwendung aus eine
   Verbindung zum MySQL-Datenbankserver herzustellen. MySQL bietet Konnektoren
   für verschiedene Sprachen, darunter PHP.
  </p>

  <p class="para">
   Wenn eine PHP-Anwendung mit einem Datenbankserver kommunizieren soll, muss
   PHP-Code geschrieben werden, der die Verbindung zum Datenbankserver, die
   Abfrage der Datenbank und andere datenbankbezogene Funktionen ermöglicht.
   Es wird eine Software benötigt, die die API für die Kommunikation zwischen
   der Anwendung und dem Datenbankserver zur Verfügung stellt und
   gegebenenfalls andere zwischengeschaltete Bibliotheken verwendet. Diese
   Software wird allgemein als Konnektor bezeichnet, weil sie es der Anwendung
   ermöglicht, sich mit einem Datenbankserver zu verbinden.
  </p>

  <p class="para">
   <strong>Was ist ein Treiber?</strong>
  </p>

  <p class="para">
   Ein Treiber ist ein Stück Software, das für die Kommunikation mit einem
   bestimmten Typ von Datenbankserver entwickelt wurde. Der Treiber kann auch
   eine Bibliothek aufrufen, z. B. die MySQL Client Library oder den MySQL
   Native Driver. Diese Bibliotheken implementieren das Low-Level-Protokoll,
   das für die Kommunikation mit dem MySQL-Datenbankserver verwendet wird.
  </p>

  <p class="para">
   So verwendet beispielsweise die Datenbankabstraktionsschicht
   <a href="mysqli.overview.php#mysqli.overview.pdo" class="link">PHP Data Objects (PDO)</a> einen von
   mehreren datenbankspezifischen Treibern. Einer der verfügbaren Treiber ist
   der PDO-MYSQL-Treiber, der eine Schnittstelle zum MySQL-Server bietet.
  </p>

  <p class="para">
   Manchmal werden die Begriffe Konnektor und Treiber synonym verwendet, was
   verwirrend sein kann. In der MySQL-Dokumentation ist der Begriff &quot;Treiber&quot;
   für Software reserviert, die den datenbankspezifischen Teil eines
   Konnektor-Pakets bereitstellt.
  </p>

  <p class="para">
   <strong>Was ist eine Erweiterung?</strong>
  </p>

  <p class="para">
   In der PHP-Dokumentation wird häufig der Begriff
   <em>Erweiterung</em> verwendet. Der PHP-Code besteht aus einem
   Kern und optionalen Erweiterungen der Kernfunktionalität. Zu den
   PHP-Erweiterungen für MySQL gehören mysqli und der PDO-Treiber für
   MySQL, die mit Hilfe des PHP-Frameworks für Erweiterungen implementiert
   werden.
  </p>

  <p class="para">
   Damit die Funktionen einer Erweiterung von PHP-Programmierern
   programmtechnisch genutzt werden können, stellt diese in der Regel eine API
   zur Verfügung. Allerdings stellen nicht alle Erweiterungen, die das
   Framework für PHP-Erweiterungen verwenden, dem PHP-Programmierer eine API
   zur Verfügung.
  </p>

  <p class="para">
   Der PDO-Treiber für MySQL beispielsweise stellt dem PHP-Programmierer keine
   API zur Verfügung, sondern eine Schnittstelle zur darüber liegenden
   PDO-Schicht.
  </p>

  <p class="para">
   Die Begriffe API und Erweiterung sollten nicht als gleichbedeutend
   angesehen werden, da eine Erweiterung dem Programmierer nicht unbedingt
   eine API zur Verfügung stellt.
  </p>

  <p class="para">
   <strong>Was sind die wichtigsten PHP-APIs, die für die
   Verwendung von MySQL zur Verfügung stehen?</strong>
  </p>

  <p class="para">
   Wenn eine Verbindung zu einem MySQL-Datenbankserver hergestellt werden
   soll, gibt es im Wesentlichen zwei Optionen für die API:
  </p>

  <ul class="itemizedlist">

    <li class="listitem">
      <p class="para">
       Die PHP-Erweiterung mysqli
      </p>
    </li>

    <li class="listitem">
      <p class="para">
       PHP Data Objects (PDO)
      </p>
    </li>

  </ul>

  <p class="para">
   Jede hat ihre eigenen Vor- und Nachteile. Die folgende Diskussion soll eine
   kurze Einführung in die wichtigsten Aspekte der einzelnen APIs geben.
  </p>

  <p class="para">
    <strong>Was ist die PHP-Erweiterung mysqli?</strong>
  </p>

  <p class="para">
   Die Erweiterung <code class="literal">mysqli</code>, auch bekannt als MySQL
   <em>improved</em>, wurde entwickelt, um die Vorteile der neuen
   Funktionen, die in MySQL-Systemen ab Version 4.1.3 zur Verfügung stehen,
   nutzen zu können. <code class="literal">mysqli</code> ist in PHP ab Version 5
   enthalten.
  </p>

  <p class="para">
   <code class="literal">mysqli</code> bietet viele Vorteile, aber die wichtigsten
   Verbesserungen gegenüber <code class="literal">mysql</code> sind:

    <ul class="itemizedlist">

      <li class="listitem">
        <p class="para">
         Objektorientierte Schnittstelle
        </p>
      </li>

      <li class="listitem">
        <p class="para">
         Unterstützung für vorbereitete Anweisungen
        </p>
      </li>

      <li class="listitem">
        <p class="para">
         Unterstützung für Mehrfachanweisungen
        </p>
      </li>

      <li class="listitem">
        <p class="para">
         Unterstützung für Transaktionen
        </p>
      </li>

      <li class="listitem">
        <p class="para">
         Verbesserte Debugging-Funktionen
        </p>
      </li>

    </ul>
  </p>

  <p class="para">
   Zusätzlich zur objektorientierten Schnittstelle bietet die Erweiterung auch
   eine prozedurale Schnittstelle.
  </p>

  <p class="para">
   Die Erweiterung <code class="literal">mysqli</code> wird mit Hilfe des PHP-Frameworks
   für Erweiterungen erstellt; der Quellcode befindet sich im Verzeichnis
   <var class="filename">ext/mysqli</var>.
  </p>

  <p class="para">
   Weitere Informationen über die Erweiterung <code class="literal">mysqli</code> sind
   unter <a href="book.mysqli.php" class="xref">Mysqli</a> zu finden.
  </p>

  <p class="para" id="mysqli.overview.pdo">
    <strong>Was ist PDO?</strong>
  </p>

  <p class="para">
   PHP Data Objects, oder PDO, ist eine Abstraktionsschicht für Datenbanken
   speziell für PHP-Anwendungen. PDO bietet eine einheitliche API, die
   unabhängig von der Art des Datenbankservers ist, mit dem sich die Anwendung
   verbindet. Wenn die PDO-API verwendet wird, könnte man theoretisch den
   verwendeten Datenbankserver wechseln, beispielsweise von Firebird zu MySQL,
   und müsste nur geringfügige Änderungen am PHP-Code vornehmen.
  </p>

  <p class="para">
   Andere Beispiele für Datenbankabstraktionsschichten sind JDBC für
   Java-Anwendungen und DBI für Perl.
  </p>

  <p class="para">
   PDO hat zwar seine Vorteile, z. B. eine klare, einfache und portierbare
   API, aber sein Hauptnachteil ist, dass es nicht möglich ist, alle
   verbesserten Features zu nutzen, die in den neuesten Versionen des
   MySQL-Servers verfügbar sind. Beispielsweise können mit PDO nicht die
   Mehrfachanweisungen von MySQL genutzt werden.
  </p>

  <p class="para">
   PDO wird mit Hilfe des PHP-Frameworks für Erweiterungen erstellt; der
   Quellcode befindet sich im Verzeichnis <var class="filename">ext/pdo</var>.
  </p>

  <p class="para">
   Weitere Informationen über PDO sind unter <a href="book.pdo.php" class="xref">PDO</a> zu
   finden.
  </p>

  <p class="para">
    <strong>Was ist der PDO-MYSQL-Treiber?</strong>
  </p>

  <p class="para">
   Der PDO-MYSQL-Treiber ist zumindest aus der Sicht eines PHP-Programmiers
   keine API im eigentlichen Sinne. Genau genommen befindet sich der
   PDO-MYSQL-Treiber in der Schicht unter PDO selbst und bietet eine
   MySQL-spezifische Funktionalität. Der Programmierer ruft zwar die PDO-API
   auf, aber PDO verwendet den PDO-MYSQL-Treiber, um mit dem MySQL-Server zu
   kommunizieren.
  </p>

  <p class="para">
   Der PDO-MYSQL-Treiber ist einer von mehreren verfügbaren PDO-Treibern.
   Daneben gibt es unter anderem PDO-Treiber für die Datenbankserver Firebird
   und PostgreSQL.
  </p>

  <p class="para">
   Der PDO-MYSQL-Treiber wird mit Hilfe des PHP-Frameworks für Erweiterungen
   erstellt; er stellt dem PHP-Programmierer keine API zur Verfügung. Der
   Quellcode befindet sich im Verzeichnis <var class="filename">ext/pdo_mysql</var>.
  </p>

  <p class="para">
   Weitere Informationen über den PDO-MYSQL-Treiber sind unter
   <a href="ref.pdo-mysql.php" class="xref">MySQL PDO-Treiber</a> zu finden.
  </p>

  <p class="para" id="mysqli.overview.mysqlnd">
    <strong>Was ist PHPs MySQL Native Driver?</strong>
  </p>

  <p class="para">
   Um mit dem MySQL-Datenbankserver zu kommunizieren, verwenden
   <code class="literal">mysqli</code> und der PDO-MYSQL-Treiber jeweils eine
   Low-Level-Bibliothek, die das erforderliche Protokoll implementiert. In der
   Vergangenheit war die einzige verfügbare Bibliothek die MySQL Client
   Library, auch bekannt als <code class="literal">libmysqlclient</code>.
  </p>

  <p class="para">
   Die Schnittstelle von <code class="literal">libmysqlclient</code> wurde jedoch
   ursprünglich für C-Anwendungen entwickelt und ist daher nicht für die
   Kommunikation mit PHP-Anwendungen optimiert. Aus diesem Grund wurde für
   PHP-Anwendungen der MySQL Native Driver, <code class="literal">mysqlnd</code>, als
   Alternative zu <code class="literal">libmysqlclient</code> entwickelt.
  </p>

  <p class="para">
   Sowohl die Erweiterung <code class="literal">mysqli</code> als auch der PDO-Treiber
   für MySQL können jeweils so konfiguriert werden, dass sie entweder
   <code class="literal">libmysqlclient</code> oder <code class="literal">mysqlnd</code>
   verwenden. Da <code class="literal">mysqlnd</code> speziell für die Verwendung im
   PHP-System entwickelt wurde, verfügt es über zahlreiche Speicher- und
   Geschwindigkeitsverbesserungen gegenüber <code class="literal">libmysqlclient</code>.
   Es wird dringend empfohlen, diese Verbesserungen zu nutzen.
  </p>

  <p class="para">
   Der MySQL Native Driver wird mit Hilfe des PHP-Frameworks für Erweiterungen
   erstellt; er stellt dem PHP-Programmierer keine API zur Verfügung. Der
   Quellcode befindet sich im Verzeichnis <var class="filename">ext/mysqlnd</var>.
  </p>



  <p class="para">
   <strong>Vergleich der Merkmale</strong>
  </p>

  <p class="para">
   Die folgende Tabelle vergleicht die Funktionalität der wichtigsten Methoden
   für den Aufbau einer Verbindung zu MySQL mittels PHP:
  </p>

  <table id="mysqli.overview.option.comparison" class="doctable table">
   <caption><strong>Vergleich der MySQL-API-Optionen in PHP</strong></caption>
    
      <col width="34*" />
      <col width="33*" />
      <col width="33*" />
      <thead>
        <tr>
          <th class="empty">&nbsp;</th>
          <th>PHP-Erweiterung mysqli</th>
          <th>PDO (mit PDO-Treiber für MySQL und MySQL Native Driver)</th>
        </tr>

      </thead>

      <tbody class="tbody">
        <tr>
          <td>PHP-Version der Einführung</td>
          <td>5.0</td>
          <td>5.0</td>
        </tr>

        <tr>
          <td>MySQL-Entwicklungsstatus</td>
          <td>In aktiver Entwicklung</td>
          <td>In aktiver Entwicklung</td>
        </tr>

        <tr>
          <td>API unterstützt Zeichensätze</td>
          <td>Ja</td>
          <td>Ja</td>
        </tr>

        <tr>
          <td>API unterstützt serverseitige vorbereitete Anweisungen</td>
          <td>Ja</td>
          <td>Ja</td>
        </tr>

        <tr>
          <td>API unterstützt clientseitige vorbereitete Anweisungen</td>
          <td>Nein</td>
          <td>Ja</td>
        </tr>

        <tr>
          <td>API unterstützt gespeicherte Prozeduren</td>
          <td>Ja</td>
          <td>Ja</td>
        </tr>

        <tr>
          <td>API unterstützt Mehrfachanweisungen</td>
          <td>Ja</td>
          <td>Weitestgehend</td>
        </tr>

        <tr>
          <td>Unterstützt die gesamte Funktionalität von MySQL 4.1+</td>
          <td>Ja</td>
          <td>Weitestgehend</td>
        </tr>

      </tbody>
    
  </table>


</div>
<?php manual_footer($setup); ?>