<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'pdo.prepare.php',
    1 => 'PDO::prepare',
    2 => 'Prepara una consulta para su ejecuci&oacute;n y devuelve un objeto',
  ),
  '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' => 'es',
    '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">
   Prepara una consulta para su ejecución y devuelve un objeto
  </span></p>

 </div>
 <div class="refsect1 description" id="refsect1-pdo.prepare-description">
  <h3 class="title">Descripción</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">
   Prepara una consulta SQL para ser ejecutada por el método
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span>. El modelo de declaración puede contener
   cero o más parámetros nombrados (:nombre) o marcadores
   (?) para los cuales los valores reales serán sustituidos
   cuando la consulta sea ejecutada.
   El uso tanto de parámetros nombrados como de marcadores es
   imposible en un modelo de declaración; solo uno u otro estilo de parámetro.
   Utilícese estos parámetros para ligar las entradas del usuario, no se incluyan
   directamente en la consulta.
  </p>
  <p class="para">
   Debe incluirse un marcador con un nombre único para cada valor que
   se desee pasar en la consulta al llamar a
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span>. No puede utilizarse
   un marcador con dos nombres idénticos en una consulta preparada, a menos que
   el modo de emulación esté activo.
  </p>
<blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Los marcadores de parámetros pueden representar únicamente un literal de
    datos completo.
    Ni una parte de literal, ni una palabra clave, ni un identificador, ni cualquier otra
    consulta arbitraria pueden ser ligados utilizando los parámetros.
    Por ejemplo, no puede asociarse múltiples valores a un solo marcador de nombre entrante, en la cláusula IN() de una consulta SQL.
   </p>
  </p></blockquote>
  <p class="para">
   Llamar a <span class="methodname"><strong>PDO::prepare()</strong></span> y
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> para las consultas
   que deben ser ejecutadas varias veces con diferentes valores de
   parámetros optimiza el rendimiento de la aplicación permitiendo al controlador negociar
   del lado del cliente y/o servidor con la caché de consultas
   y las meta-informaciones. Además, llamar a <span class="methodname"><strong>PDO::prepare()</strong></span> y
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> ayuda a prevenir ataques por
   inyección SQL eliminando la necesidad de proteger los parámetros manualmente.
  </p>
  <p class="para">
   PDO emula las consultas preparadas / los parámetros ligados para los controladores
   que no los soportan nativamente, y puede también reescribir los
   parámetros nombrados o los marcadores en algo más
   apropiado, si el controlador soporta un estilo y no el otro.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    El analizador utilizado para las declaraciones preparadas
    emuladas y para reescribir los parámetros nombrados o del estilo de punto
    de interrogación soporta el escape backslash no estándar para las comillas simples y dobles. Esto significa que las comillas finales que
    son precedidas por un backslash no serán reconocidas como tales, lo que puede
    resultar en una mala detección de los parámetros causando que la declaración
    preparada falle al ser ejecutada. Un contorno es no utilizar las consultas emuladas para tales consultas SQL, y evitar reescribir los parámetros utilizando un estilo de parámetro que es
    soportado nativamente por el controlador.
   </span>
  </p></blockquote>
  <p class="para">
   A partir de PHP 7.4.0, los puntos de interrogación pueden ser escapados duplicándolos.
   Esto significa que la cadena <code class="literal">??</code> será traducida en <code class="literal">?</code>
   al enviar la consulta a la base de datos.
  </p>
 </div>

 <div class="refsect1 parameters" id="refsect1-pdo.prepare-parameters">
  <h3 class="title">Parámetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">query</code></dt>
     <dd>
      <p class="para">
       Debe ser un modelo de consulta SQL válido para el servidor de base de datos objetivo.
      </p>
     </dd>
    
    
     <dt><code class="parameter">options</code></dt>
     <dd>
      <p class="para">
       Este array contiene una o más parejas clave=&gt;valor para definir
       los valores de los atributos para el objeto PDOStatement
       que esta método devuelve. Puede utilizarse esto para definir el valor
       <code class="literal">PDO::ATTR_CURSOR</code> a
       <code class="literal">PDO::CURSOR_SCROLL</code> para solicitar un cursor desplazable.
       Algunos controladores tienen opciones específicas que pueden ser definidas
       en el momento de la preparación.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-pdo.prepare-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   Si el servidor de base de datos prepara con éxito esta consulta,
   <span class="methodname"><strong>PDO::prepare()</strong></span> devuelve un objeto <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span>.
   Si el servidor de base de datos no logra preparar la consulta,
   <span class="methodname"><strong>PDO::prepare()</strong></span> devuelve <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> o emite una excepción
   <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> (siguiendo el
   <a href="pdo.error-handling.php" class="link">gestor de errores</a>).
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    La emulación de consultas preparadas no comunica con el servidor de base
    de datos. También, la función <span class="methodname"><strong>PDO::prepare()</strong></span> no verifica
    la consulta.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 errors" id="refsect1-pdo.prepare-errors">
  <h3 class="title">Errores/Excepciones</h3>
  <p class="para">
Emite un error de nivel <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> si el atributo <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong> está definido
a <strong><code><a href="pdo.constants.php#pdo.constants.errmode-warning">PDO::ERRMODE_WARNING</a></code></strong>.
</p>
<p class="para">
Lanza una excepción <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> si el atributo <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong> está definido
a <strong><code><a href="pdo.constants.php#pdo.constants.errmode-exception">PDO::ERRMODE_EXCEPTION</a></code></strong>.
</p>
 </div>


 <div class="refsect1 examples" id="refsect1-pdo.prepare-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Modelo de declaración SQL con parámetros nombrados</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">/* Ejecuta una consulta preparada pasando un array de valores */<br /></span><span style="color: #0000BB">$sql </span><span style="color: #007700">= </span><span style="color: #DD0000">'SELECT nombre, color, calorias<br />    FROM fruta<br />WHERE calorias &lt; :calorias AND color = :color'</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">'calorias' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">150</span><span style="color: #007700">, </span><span style="color: #DD0000">'color' </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">/* Las claves del array pueden ser prefijadas con dos puntos ":" también (opcional) */<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">':calorias' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">175</span><span style="color: #007700">, </span><span style="color: #DD0000">':color' </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>Ejemplo #2 Modelo de declaración SQL con marcadores</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">/* Ejecuta una consulta preparada pasando un array de valores */<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 nombre, color, calorias<br />    FROM fruta<br />    WHERE calorias &lt; ? AND color = ?'</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">'rojo'</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">'amarillo'</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>Ejemplo #3 Modelo de declaración SQL con un punto de interrogación escapado</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">/* nota: esto solo es válido para bases de datos PostgreSQL */<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">Ver también</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><a href="pdo.exec.php" class="methodname" rel="rdfs-seeAlso">PDO::exec()</a> - Ejecuta una consulta SQL y devuelve el n&uacute;mero de filas afectadas</span></li>
    <li><span class="methodname"><a href="pdo.query.php" class="methodname" rel="rdfs-seeAlso">PDO::query()</a> - Prepara y ejecuta una consulta SQL sin marcadores de sustituci&oacute;n</span></li>
    <li><span class="methodname"><a href="pdostatement.execute.php" class="methodname" rel="rdfs-seeAlso">PDOStatement::execute()</a> - Ejecuta una consulta preparada</span></li>
   </ul>
  </p>
 </div>

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