<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.pdo.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'pdo.prepare.php',
    1 => 'PDO::prepare',
    2 => 'Bereitet eine Anweisung zur Ausf&uuml;hrung vor und liefert ein Anweisungsobjekt',
  ),
  'up' => 
  array (
    0 => 'class.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.lastinsertid.php',
    1 => 'PDO::lastInsertId',
  ),
  'next' => 
  array (
    0 => 'pdo.query.php',
    1 => 'PDO::query',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/pdo/pdo/prepare.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="pdo.prepare" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">PDO::prepare</h1>
  <p class="verinfo">(PHP 5 &gt;= 5.1.0, PHP 7, PHP 8, PHP 8,PECL pdo &gt;= 0.1.0)</p><p class="refpurpose"><span class="refname">PDO::prepare</span> &mdash; <span class="dc-title">
   Bereitet eine Anweisung zur Ausführung vor und liefert ein Anweisungsobjekt
  </span></p>

 </div>

 <div class="refsect1 description" id="refsect1-pdo.prepare-description">
  <h3 class="title">Beschreibung</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="methodname"><strong>PDO::prepare</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$query</code></span>, <span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$options</code><span class="initializer"> = []</span></span>): <span class="type"><span class="type"><a href="class.pdostatement.php" class="type PDOStatement">PDOStatement</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   Bereitet eine SQL-Anweisung vor, die von der Methode
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> ausgeführt werden soll. Die
   Vorlage für eine Anweisung kann null oder mehr benannte (:name) oder mit
   Fragezeichen (?) versehene Platzhalter für Parameter enthalten, die bei der
   Ausführung der Anweisung durch reale Werte ersetzt werden. Benannte und
   Fragezeichen-Parameter dürfen nicht gleichzeitig in derselben
   Anweisungsvorlage verwendet werden, sondern nur eine der beiden Varianten.
   Diese Parameter werden verwendet, um die Benutzereingaben zu binden.
   Benutzerangaben sollten niemals direkt in die Abfrage aufgenommen werden.
  </p>
  <p class="para">
   Für jeden Wert, der beim Aufruf von
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> an die Anweisung übergeben
   werden soll, muss ein eindeutiger Platzhalter angegeben werden. Ein
   benannter Platzhalter darf nur dann mehrfach verwendet werden, wenn der
   Emulationsmodus aktiviert ist.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Die Platzhalter für die Parameter können nur ein vollständiges
    Datenliteral darstellen. Es ist nicht möglich, einen Teil eines Literals,
    ein Schlüsselwort, einen Bezeichner oder einen beliebigen Teil einer
    Abfrage an einen Parameter zu binden. So können zum Beispiel in einer
    IN()-Klausel einer SQL-Anweisung nicht mehrere Werte an einen einzigen
    Parameter gebunden werden.
   </p>
  </p></blockquote>
  <p class="para">
   Mittels <span class="methodname"><strong>PDO::prepare()</strong></span> und
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> kann der Treiber bei
   Anweisungen, die mehrfach mit unterschiedlichen Parameterwerten ausgeführt
   werden, die Leistung einer Anwendung optimieren, indem er die
   Zwischenspeicherung des Abfrageplans und der Metainformationen auf Client-
   und/oder Serverseite aushandelt. Außerdem trägt dies dazu bei, Angriffe
   durch SQL-Injection zu verhindern, weil die Parameter nicht mehr manuell
   maskiert und in Anführungszeichen gesetzt werden müssen.
  </p>
  <p class="para">
   Bei Treibern, die diese nicht unterstützen, emuliert PDO vorbereitete
   Anweisungen/gebundene Parameter und kann außerdem benannte oder mit
   Fragezeichen versehene Parametermarkierungen in eine geeignetere Form
   umwandeln, wenn der Treiber zwar die eine, nicht aber die andere Form
   unterstützt.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <span class="simpara">
    Der Parser, der für emulierte vorbereitete Anweisungen verwendet wird und
    die benannten oder durch Fragezeichen angegebenen Parameter umschreibt,
    unterstützt die nicht standardmäßige Maskierung einfacher und doppelter
    Anführungszeichen durch Backslashes. Dies hat zur Folge, dass
    abschließende Anführungszeichen, denen ein Backslash unmittelbar
    vorausgeht, nicht als solche erkannt werden, was dazu führen kann, dass
    Parameter falsch erkannt werden und die vorbereitete Anweisung bei ihrer
    Ausführung fehlschlägt. Um dies zu umgehen, sollten für solche
    SQL-Abfragen keine emulierten vorbereiteten Anweisungen verwendet werden.
    Außerdem sollte ein vom Treiber nativ unterstützter Parameterstil
    verwendet werden, um ein Umschreiben der Parameter zu vermeiden.
   </span>
  </p></blockquote>
  <p class="para">
   Seit PHP 7.4.0 können Fragezeichen durch Verdoppeln maskiert werden. Das
   bedeutet, dass die Zeichenkette <code class="literal">??</code> beim Senden der
   Abfrage an die Datenbank in <code class="literal">?</code> übersetzt wird.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-pdo.prepare-parameters">
  <h3 class="title">Parameter-Liste</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">query</code></dt>
     <dd>
      <p class="para">
       Dies muss eine für den jeweiligen Datenbankserver gültige Vorlage für
       eine SQL-Anweisung sein.
      </p>
     </dd>
    
    
     <dt><code class="parameter">options</code></dt>
     <dd>
      <p class="para">
       Dieses Array enthält ein oder mehrere Schlüssel=&gt;Wert-Paare, um die
       Werte der Attribute des von dieser Methode zurückgegebenen
       PDOStatement-Objekts zu setzen. Am häufigsten wird dies verwendet, um
       den Wert von <strong><code><a href="pdo.constants.php#pdo.constants.attr-cursor">PDO::ATTR_CURSOR</a></code></strong> für einen
       scrollbaren Cursor auf <strong><code><a href="pdo.constants.php#pdo.constants.cursor-scroll">PDO::CURSOR_SCROLL</a></code></strong> zu
       setzen. Einige Treiber haben treiberspezifische Optionen, die während
       der Vorbereitung gesetzt werden können.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-pdo.prepare-returnvalues">
  <h3 class="title">Rückgabewerte</h3>
  <p class="para">
   Wenn der Datenbankserver die Anweisung erfolgreich vorbereitet hat, gibt
   <span class="methodname"><strong>PDO::prepare()</strong></span> ein
   <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span>-Objekt zurück. Schlägt die Vorbereitung
   fehl, gibt <span class="methodname"><strong>PDO::prepare()</strong></span> <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück oder löst
   eine <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> aus (abhängig von der
   <a href="pdo.error-handling.php" class="link">Fehlerbehandlung</a>).
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Da emulierte vorbereitete Anweisungen nicht mit dem Datenbankserver
    kommunizieren, überprüft <span class="methodname"><strong>PDO::prepare()</strong></span> die
    Anweisung nicht.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 errors" id="refsect1-pdo.prepare-errors">
  <h3 class="title">Fehler/Exceptions</h3>
  <p class="para">
Gibt einen Fehler der Stufe <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> aus, wenn das Attribut <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong>
auf <strong><code><a href="pdo.constants.php#pdo.constants.errmode-warning">PDO::ERRMODE_WARNING</a></code></strong> gesetzt ist.
</p>
<p class="para">
Löst eine <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> aus, wenn das Attribut <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong>
auf <strong><code><a href="pdo.constants.php#pdo.constants.errmode-exception">PDO::ERRMODE_EXCEPTION</a></code></strong> gesetzt ist.
</p>
 </div>


 <div class="refsect1 examples" id="refsect1-pdo.prepare-examples">
  <h3 class="title">Beispiele</h3>
  <p class="para">
   <div class="example" id="example-1"><p><strong>Beispiel #1 Vorlage für eine SQL-Anweisung mit benannten Parametern</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: #FF8000">/* Ausführen einer vorbereiteten Anweisung durch Übergabe eines Arrays von Werten */<br /></span><span style="color: #0000BB">$sql </span><span style="color: #007700">= </span><span style="color: #DD0000">'SELECT name, colour, calories<br />    FROM fruit<br />    WHERE calories &lt; :calories AND colour = :colour'</span><span style="color: #007700">;<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">prepare</span><span style="color: #007700">(</span><span style="color: #0000BB">$sql</span><span style="color: #007700">, [</span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_CURSOR </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">CURSOR_FWDONLY</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #DD0000">'calories' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">150</span><span style="color: #007700">, </span><span style="color: #DD0000">'colour' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'red'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$red </span><span style="color: #007700">= </span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetchAll</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">/* Den Array-Schlüsseln kann auch ein Doppelpunkt ":" vorangestellt werden (optional) */<br /></span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #DD0000">':calories' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">175</span><span style="color: #007700">, </span><span style="color: #DD0000">':colour' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'yellow'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$yellow </span><span style="color: #007700">= </span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetchAll</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 Vorlage für eine SQL-Anweisung mit Fragezeichen als Platzhalter</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: #FF8000">/* Ausführen einer vorbereiteten Anweisung durch Übergabe eines Arrays von Werten */<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">prepare</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT name, colour, calories<br />    FROM fruit<br />    WHERE calories &lt; ? AND colour = ?'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #0000BB">150</span><span style="color: #007700">, </span><span style="color: #DD0000">'red'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$red </span><span style="color: #007700">= </span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetchAll</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #0000BB">175</span><span style="color: #007700">, </span><span style="color: #DD0000">'yellow'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$yellow </span><span style="color: #007700">= </span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetchAll</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 Vorlage für eine SQL-Anweisung mit maskierten Fragezeichen</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: #FF8000">/* Hinweis: dies ist nur bei PostgreSQL-Datenbanken möglich */<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">prepare</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT * FROM issues WHERE tag::jsonb ?? ?'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #DD0000">'feature'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$featureIssues </span><span style="color: #007700">= </span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetchAll</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #DD0000">'performance'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$performanceIssues </span><span style="color: #007700">= </span><span style="color: #0000BB">$sth</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetchAll</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 seealso" id="refsect1-pdo.prepare-seealso">
  <h3 class="title">Siehe auch</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><a href="pdo.exec.php" class="methodname" rel="rdfs-seeAlso">PDO::exec()</a> - F&uuml;hrt ein SQL-Statement aus und liefert die Anzahl der betroffenen Zeilen</span></li>
    <li><span class="methodname"><a href="pdo.query.php" class="methodname" rel="rdfs-seeAlso">PDO::query()</a> - Bereitet eine SQL-Anweisung ohne Platzhalter vor und f&uuml;hrt sie aus</span></li>
    <li><span class="methodname"><a href="pdostatement.execute.php" class="methodname" rel="rdfs-seeAlso">PDOStatement::execute()</a> - F&uuml;hrt ein Prepared Statement aus</span></li>
   </ul>
  </p>
 </div>


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