<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'pdo.prepare.php',
    1 => 'PDO::prepare',
    2 => 'Prepara uma instru&ccedil;&atilde;o para execu&ccedil;&atilde;o e retorna um objeto de instru&ccedil;&atilde;o',
  ),
  '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' => 'pt_BR',
    '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 uma instrução para execução e retorna um objeto de instrução
  </span></p>

 </div>
 <div class="refsect1 description" id="refsect1-pdo.prepare-description">
  <h3 class="title">Descrição</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="modifier">function</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 uma instrução SQL para ser executada pelo
   método <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span>. O modelo de instrução pode
   conter zero ou mais marcadores de parâmetros nomeados (:name) ou pontos de interrogação (?)
   para os quais os valores reais serão substituídos quando a instrução for executada.
   Os marcadores de parâmetros nomeados e de ponto de interrogação não podem ser usados ​​no mesmo
   modelo de instrução; apenas um ou outro estilo de parâmetro.
   Use esses parâmetros para vincular qualquer entrada do usuário, não inclua a entrada do usuário
   diretamente na consulta.
  </p>
  <p class="para">
   Deve-se incluir um marcador de parâmetro exclusivo para cada valor que se deseja passar
   para a instrução ao chamar <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span>.
   Um marcador de parâmetro nomeado com o mesmo nome não pode ser usado mais de uma vez em uma instrução
   preparada, a menos que o modo de emulação esteja ativado.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Os marcadores de parâmetro podem representar apenas um literal de dados completo.
    Nenhuma parte do literal, nem palavra-chave, nem identificador, nem qualquer parte arbitrária
    da consulta pode ser vinculada usando parâmetros. Por exemplo, não se pode vincular múltiplos valores
    a um único parâmetro na cláusula IN() de uma instrução SQL.
   </span>
  </p></blockquote>
  <p class="para">
   Chamar <span class="methodname"><strong>PDO::prepare()</strong></span> e
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> para instruções que serão
   emitidas diversas vezes com valores de parâmetros diferentes otimiza o
   desempenho da aplicação, permitindo que o driver negocie
   cache no lado do cliente e/ou do servidor do plano de consulta e metainformações. Além disso, chamar <span class="methodname"><strong>PDO::prepare()</strong></span> e
   <span class="methodname"><a href="pdostatement.execute.php" class="methodname">PDOStatement::execute()</a></span> ajuda a evitar ataques de injeção de SQL, eliminando a necessidade de
   inserir aspas e escapar manualmente dos parâmetros.
  </p>
  <p class="para">
   O PDO irá emular instruções preparadas/parâmetros vinculados para drivers que
   não os suportam nativamente, e também pode reescrever marcadores de parâmetros nomeados
   ou no estilo ponto de interrogação para algo mais apropriado, se o driver
   suportar um estilo, mas não o outro.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Antes do PHP 8.4.0, o analisador usado para instruções preparadas emuladas e para
    reescrever parâmetros nomeados ou no estilo de ponto de interrogação suportava escapes
    de barra invertida não padrão para aspas simples e duplas. Isso significava que aspas
    de término imediatamente precedidas por uma barra invertida não eram reconhecidas como tal, o que
    poderia resultar na detecção incorreta de parâmetros, fazendo com que a instrução preparada
    falhasse quando fosse executada. Uma solução alternativa era não usar preparações emuladas para
    essas consultas SQL e evitar a reescrita de parâmetros usando um estilo de parâmetro
    que fosse suportado nativamente pelo driver.
   </span>
  </p></blockquote>
  <p class="para">
   A partir do PHP 7.4.0, os pontos de interrogação podem ser escapados duplicando-os. Isso significa que
   a string <code class="literal">??</code> será traduzida para <code class="literal">?</code>
   ao enviar a consulta ao banco de dados.
  </p>
  <p class="simpara">
   A partir do PHP 8.4.0, O PDO usa analisadores específicos do driver para localizar marcadores de
   parâmetros, de forma que os marcadores que aparecem dentro de strings literais ou comentários não
   são confundidos como marcadores de parâmetro. O analisador padrão reconhece literais de string entre
   aspas simples e duplas, assim como
   comentários de duas barras e comentários no estilo C não aninhados. Drivers individuais podem
   fornecer um analisador que reconheça sintaxe adicional ou diferente; consulte a documentação
   específica do driver para mais detalhes.
  </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">
       Este deve ser um modelo de instrução SQL válido para o servidor de banco de dados de destino.
      </p>
     </dd>
    
    
     <dt><code class="parameter">options</code></dt>
     <dd>
      <p class="para">
       Este array contém um ou mais pares chave=&gt;valor para definir
       valores de atributos para o objeto PDOStatement que esse método
       retorna. Normalmente usa-se isso para definir o
       valor <code class="literal">PDO::ATTR_CURSOR</code> como
       <code class="literal">PDO::CURSOR_SCROLL</code> para solicitar um cursor rolável.
       Alguns drivers têm opções específicas que podem ser definidas no
       momento da preparação.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-pdo.prepare-returnvalues">
  <h3 class="title">Valor Retornado</h3>
  <p class="para">
   Se o servidor de banco de dados preparar a instrução com sucesso,
   <span class="methodname"><strong>PDO::prepare()</strong></span> retornará um
   objeto <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span>.
   Se o servidor de banco de dados não conseguir preparar a instrução com sucesso,
   <span class="methodname"><strong>PDO::prepare()</strong></span> retornará <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> ou emitirá
   uma exceção <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> (dependendo do <a href="pdo.error-handling.php" class="link">tratamento de erros</a>).
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Instruções preparadas emuladas não se comunicam com o servidor de banco de dados,
    portanto <span class="methodname"><strong>PDO::prepare()</strong></span> não verifica a instrução.
   </span>
  </p></blockquote>
 </div>


 <div class="refsect1 errors" id="refsect1-pdo.prepare-errors">
  <h3 class="title">Erros/Exceções</h3>
  <p class="simpara">
Emite um erro de nível <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> se o atributo <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong> estiver definido
como <strong><code><a href="pdo.constants.php#pdo.constants.errmode-warning">PDO::ERRMODE_WARNING</a></code></strong>.
</p>
<p class="simpara">
Lança uma exceção <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> se o atributo <strong><code><a href="pdo.constants.php#pdo.constants.attr-errmode">PDO::ATTR_ERRMODE</a></code></strong>
estiver definido como <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">Exemplos</h3>
  <p class="para">
   <div class="example" id="example-1"><p><strong>Exemplo #1 Modelo de instrução SQL com parâmetros nomeados</strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/* Executa uma instrução preparada passando um array de valores */
</span><span style="color: #0000BB">$sql </span><span style="color: #007700">= </span><span style="color: #DD0000">'SELECT name, colour, calories
    FROM fruit
    WHERE calories &lt; :calories AND colour = :colour'</span><span style="color: #007700">;
</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">]);
</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">]);
</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">();
</span><span style="color: #FF8000">/* Chaves de arrays podem ser prefizadas com dois-pontos ":" também (opcional) */
</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">]);
</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">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
   <div class="example" id="example-2">
    <p><strong>Exemplo #2 Modelo de instrução SQL com parâmetros de ponto de interrogação</strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/* Executa uma instrução preparada passando um array de valores */
</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
    FROM fruit
    WHERE calories &lt; ? AND colour = ?'</span><span style="color: #007700">);
</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">]);
</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">();
</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">]);
</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">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
   <div class="example" id="example-3">
    <p><strong>Exemplo #3 Modelo de instrução SQL com ponto de interrogação escapado</strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/* nota: isso só é válido em bancos de dados PostgreSQL */
</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">);
</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">]);
</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">();
</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">]);
</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">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

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


 <div class="refsect1 seealso" id="refsect1-pdo.prepare-seealso">
  <h3 class="title">Veja Também</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><a href="pdo.exec.php" class="methodname" rel="rdfs-seeAlso">PDO::exec()</a> - Executa uma instru&ccedil;&atilde;o SQL e retorna o n&uacute;mero de linhas afetadas</span></li>
    <li><span class="methodname"><a href="pdo.query.php" class="methodname" rel="rdfs-seeAlso">PDO::query()</a> - Prepara e executa uma instru&ccedil;&atilde;o SQL sem marcadores</span></li>
    <li><span class="methodname"><a href="pdostatement.execute.php" class="methodname" rel="rdfs-seeAlso">PDOStatement::execute()</a> - Executa ums instru&ccedil;&atilde;o preparada</span></li>
   </ul>
  </p>
 </div>

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