<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.sqlite3.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'sqlite3.setauthorizer.php',
    1 => 'SQLite3::setAuthorizer',
    2 => 'Configura um retorno de chamada a ser usado como um autorizador para limitar o que uma declara&ccedil;&atilde;o pode fazer',
  ),
  'up' => 
  array (
    0 => 'class.sqlite3.php',
    1 => 'SQLite3',
  ),
  'prev' => 
  array (
    0 => 'sqlite3.querysingle.php',
    1 => 'SQLite3::querySingle',
  ),
  'next' => 
  array (
    0 => 'sqlite3.version.php',
    1 => 'SQLite3::version',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/sqlite3/sqlite3/setauthorizer.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="sqlite3.setauthorizer" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">SQLite3::setAuthorizer</h1>
  <p class="verinfo">(PHP 8)</p><p class="refpurpose"><span class="refname">SQLite3::setAuthorizer</span> &mdash; <span class="dc-title">Configura um retorno de chamada a ser usado como um autorizador para limitar o que uma declaração pode fazer</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-sqlite3.setauthorizer-description">
  <h3 class="title">Descrição</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="methodname"><strong>SQLite3::setAuthorizer</strong></span>(<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span></span> <code class="parameter">$callback</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   Define um retorno de chamada que será chamado pelo SQLite toda vez que uma ação for executada
   (leitura, exclusão, atualização, etc.). Isso é usado ao preparar uma declaração SQL de
   uma fonte não confiável para garantir que as declarações SQL não tentem acessar dados aos quais
   não têm permissão para ver, ou que não tentem executar declarações maliciosas que
   danifiquem o banco de dados. Por exemplo, um aplicativo pode permitir que um usuário insira consultas
   SQL arbitrárias para avaliação por um banco de dados. Mas o aplicativo não quer que o usuário
   possa fazer alterações arbitrárias no banco de dados. Um autorizador poderia então ser colocado em
   prática enquanto o SQL inserido pelo usuário está sendo preparado, o que proíbe tudo exceto
   declarações SELECT.
  </p>
  <p class="para">
   O retorno de chamada do autorizador pode ser chamado várias vezes para cada declaração preparada pelo
   SQLite. Uma consulta <code class="literal">SELECT</code> ou <code class="literal">UPDATE</code> chamará o
   autorizador para cada coluna que seria lida ou atualizada.
  </p>
  <p class="para">
   O autorizador é chamado com até cinco parâmetros. O primeiro parâmetro é sempre
   fornecido e é um <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> (código de ação) correspondente a uma constante de
   <code class="literal">SQLite3</code>. Os outros parâmetros são passados apenas para algumas ações. A
   tabela a seguir descreve o segundo e o terceiro parâmetros de acordo com a ação:
   <table class="doctable table">
    <caption><strong>Lista de códigos de ação e parâmetros</strong></caption>
    
     <thead>
      <tr>
       <th>Ação</th>
       <th>Segundo parâmetro</th>
       <th>Terceiro parâmetro</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-index">SQLite3::CREATE_INDEX</a></code></strong></td><td>Nome do Índice</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-table">SQLite3::CREATE_TABLE</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-temp-index">SQLite3::CREATE_TEMP_INDEX</a></code></strong></td><td>Nome do Índice</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-temp-table">SQLite3::CREATE_TEMP_TABLE</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-temp-trigger">SQLite3::CREATE_TEMP_TRIGGER</a></code></strong></td><td>Nome do Gatilho</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-temp-view">SQLite3::CREATE_TEMP_VIEW</a></code></strong></td><td>Nome da Visualização</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-trigger">SQLite3::CREATE_TRIGGER</a></code></strong></td><td>Nome do Gatilho</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-view">SQLite3::CREATE_VIEW</a></code></strong></td><td>Nome da Visualização</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.delete">SQLite3::DELETE</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-index">SQLite3::DROP_INDEX</a></code></strong></td><td>Nome do Índice</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-table">SQLite3::DROP_TABLE</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-temp-index">SQLite3::DROP_TEMP_INDEX</a></code></strong></td><td>Nome do Índice</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-temp-table">SQLite3::DROP_TEMP_TABLE</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-temp-trigger">SQLite3::DROP_TEMP_TRIGGER</a></code></strong></td><td>Nome do Gatilho</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-temp-view">SQLite3::DROP_TEMP_VIEW</a></code></strong></td><td>Nome da Visualização</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-trigger">SQLite3::DROP_TRIGGER</a></code></strong></td><td>Nome do Gatilho</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-view">SQLite3::DROP_VIEW</a></code></strong></td><td>Nome da Visualização</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.insert">SQLite3::INSERT</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.pragma">SQLite3::PRAGMA</a></code></strong></td><td>Nome do Pragma</td><td>Primeiro argumento passado ao pragma, ou <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.read">SQLite3::READ</a></code></strong></td><td>Nome da Tabela</td><td>Nome da Coluna</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.select">SQLite3::SELECT</a></code></strong></td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.transaction">SQLite3::TRANSACTION</a></code></strong></td><td>Operação</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.update">SQLite3::UPDATE</a></code></strong></td><td>Nome da Tabela</td><td>Nome da Coluna</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.attach">SQLite3::ATTACH</a></code></strong></td><td>Nome do Arquivo</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.detach">SQLite3::DETACH</a></code></strong></td><td>Nome do Banco de Dados</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.alter-table">SQLite3::ALTER_TABLE</a></code></strong></td><td>Nome do Banco de Dados</td><td>Nome da Tabela</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.reindex">SQLite3::REINDEX</a></code></strong></td><td>Nome do Índice</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.analyze">SQLite3::ANALYZE</a></code></strong></td><td>Nome da Tabela</td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-vtable">SQLite3::CREATE_VTABLE</a></code></strong></td><td>Nome da Tabela</td><td>Nome do Módulo</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-vtable">SQLite3::DROP_VTABLE</a></code></strong></td><td>Nome da Tabela</td><td>Nome do Módulo</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.function">SQLite3::FUNCTION</a></code></strong></td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td><td>Nome da Função</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.savepoint">SQLite3::SAVEPOINT</a></code></strong></td><td>Operação</td><td>Nome do Ponto de Salvamento</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.recursive">SQLite3::RECURSIVE</a></code></strong></td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td><td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></td></tr>

     </tbody>
    
   </table>

  </p>
  <p class="para">
   O 4º parâmetro será o nome do banco de dados (<code class="literal">&quot;main&quot;</code>,
   <code class="literal">&quot;temp&quot;</code>, etc.) se aplicável.
  </p>
  <p class="para">
   O 5º parâmetro para o retorno de chamada do autorizador é o nome do gatilho ou
   visualização mais interno responsável pela tentativa de acesso ou <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> se esta tentativa de acesso é
   diretamente a partir do código SQL de nível superior.
  </p>
  <p class="para">
   Quando o retorno de chamada retorna <strong><code><a href="class.sqlite3.php#sqlite3.constants.ok">SQLite3::OK</a></code></strong>, isso significa que a operação
   solicitada é aceita. Quando o retorno de chamada retorna <strong><code><a href="class.sqlite3.php#sqlite3.constants.deny">SQLite3::DENY</a></code></strong>,
   a chamada que acionou o autorizador falhará com uma mensagem de erro explicando que o
   acesso foi negado.
  </p>
  <p class="para">
   Se o código de ação for <strong><code><a href="class.sqlite3.php#sqlite3.constants.read">SQLite3::READ</a></code></strong> e o retorno de chamada retornar
   <strong><code><a href="class.sqlite3.php#sqlite3.constants.ignore">SQLite3::IGNORE</a></code></strong>, então a declaração preparada é
   construída para substituir um valor <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> no lugar da coluna da tabela que
   seria lida se <strong><code><a href="class.sqlite3.php#sqlite3.constants.ok">SQLite3::OK</a></code></strong> tivesse sido retornado. O
   retorno <strong><code><a href="class.sqlite3.php#sqlite3.constants.ignore">SQLite3::IGNORE</a></code></strong> pode ser usado para negar a um usuário
   não confiável o acesso a colunas individuais de uma tabela.
  </p>
  <p class="para">
   Quando uma tabela é referenciada por um <code class="literal">SELECT</code>, mas nenhum valor de coluna é
   extraído dessa tabela (por exemplo, em uma consulta como <code class="literal">&quot;SELECT count(*) FROM
   table&quot;</code>), então o retorno de chamada do autorizador <strong><code><a href="class.sqlite3.php#sqlite3.constants.read">SQLite3::READ</a></code></strong> é
   invocado uma vez para essa tabela com um nome de coluna que é uma string vazia.
  </p>
  <p class="para">
   Se o código de ação for <strong><code><a href="class.sqlite3.php#sqlite3.constants.delete">SQLite3::DELETE</a></code></strong> e o retorno de chamada retornar
   <strong><code><a href="class.sqlite3.php#sqlite3.constants.ignore">SQLite3::IGNORE</a></code></strong>, então a operação DELETE prossegue, mas a
   otimização de truncamento é desativada e todas as linhas são excluídas individualmente.
  </p>
  <p class="para">
   Apenas um autorizador pode estar em vigor em uma conexão de banco de dados de cada vez. Cada chamada
   para <span class="methodname"><strong>SQLite3::setAuthorizer()</strong></span> substitui a chamada anterior. Desative o
   autorizador instalando um retorno de chamada <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. O autorizador é desativado por padrão.
  </p>
  <p class="para">
   O retorno de chamada do autorizador não deve fazer nada que modifique a conexão de banco de dados
   que invocou o retorno de chamada do autorizador.
  </p>
  <p class="para">
   Observe que o autorizador é chamado apenas quando uma declaração é preparada, não quando ela é
   executada.
  </p>
  <p class="para">
   Mais detalhes podem ser encontrados na
   <a href="http://sqlite.org/c3ref/set_authorizer.html" class="link external">&raquo;&nbsp;documentação do SQLite3</a>.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-sqlite3.setauthorizer-parameters">
  <h3 class="title">Parâmetros</h3>
  <dl>
   
    <dt><code class="parameter">callback</code></dt>
    <dd>
     <p class="para">
      O <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> a ser chamado.
     </p>
     <p class="para">
      Se <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> for passado, isso desativará o retorno de chamada do autorizador atual.
     </p>
    </dd>
   
  </dl>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-sqlite3.setauthorizer-returnvalues">
  <h3 class="title">Valor Retornado</h3>
  <p class="para">
   Retorna <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> em caso de sucesso ou <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> em caso de falha.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-sqlite3.setauthorizer-errors">
  <h3 class="title">Erros/Exceções</h3>
  <p class="para">
   Este método não lança nenhum erro, mas se um autorizador estiver habilitado e retornar um
   valor inválido, a preparação da declaração lançará um erro (ou exceção, dependendo
   do uso do método <span class="methodname"><a href="sqlite3.enableexceptions.php" class="methodname">SQLite3::enableExceptions()</a></span>).
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-sqlite3.setauthorizer-examples">
  <h3 class="title">Exemplos</h3>
  <div class="example" id="example-1">
   <p><strong>Exemplo #1 Exemplo de <span class="methodname"><strong>SQLite3::setAuthorizer()</strong></span></strong></p>
   <div class="example-contents"><p>
    Isso permite apenas o acesso à leitura, e apenas algumas colunas da
    tabela <code class="literal">users</code> serão retornadas. Outras colunas serão substituídas por
    <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$db </span><span style="color: #007700">= new </span><span style="color: #0000BB">SQLite3</span><span style="color: #007700">(</span><span style="color: #DD0000">'data.sqlite'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exec</span><span style="color: #007700">(</span><span style="color: #DD0000">'CREATE TABLE users (id, name, password);'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exec</span><span style="color: #007700">(</span><span style="color: #DD0000">'INSERT INTO users VALUES (1, \'Pauline\', \'Snails4eva\');'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$allowed_columns </span><span style="color: #007700">= [</span><span style="color: #DD0000">'id'</span><span style="color: #007700">, </span><span style="color: #DD0000">'name'</span><span style="color: #007700">];<br /><br /></span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setAuthorizer</span><span style="color: #007700">(function (</span><span style="color: #0000BB">int $action</span><span style="color: #007700">, ...</span><span style="color: #0000BB">$args</span><span style="color: #007700">) use (</span><span style="color: #0000BB">$allowed_columns</span><span style="color: #007700">) {<br />    if (</span><span style="color: #0000BB">$action </span><span style="color: #007700">=== </span><span style="color: #0000BB">SQLite3</span><span style="color: #007700">::</span><span style="color: #0000BB">READ</span><span style="color: #007700">) {<br />        list(</span><span style="color: #0000BB">$table</span><span style="color: #007700">, </span><span style="color: #0000BB">$column</span><span style="color: #007700">) = </span><span style="color: #0000BB">$args</span><span style="color: #007700">;<br /><br />        if (</span><span style="color: #0000BB">$table </span><span style="color: #007700">=== </span><span style="color: #DD0000">'users' </span><span style="color: #007700">&amp;&amp; </span><span style="color: #0000BB">in_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$column</span><span style="color: #007700">, </span><span style="color: #0000BB">$allowed_columns</span><span style="color: #007700">)) {<br />            return </span><span style="color: #0000BB">SQLite3</span><span style="color: #007700">::</span><span style="color: #0000BB">OK</span><span style="color: #007700">;<br />        }<br /><br />        return </span><span style="color: #0000BB">SQLite3</span><span style="color: #007700">::</span><span style="color: #0000BB">IGNORE</span><span style="color: #007700">;<br />    }<br /><br />    return </span><span style="color: #0000BB">SQLite3</span><span style="color: #007700">::</span><span style="color: #0000BB">DENY</span><span style="color: #007700">;<br />});<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">querySingle</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT * FROM users WHERE id = 1;'</span><span style="color: #007700">));</span></span></code></div>
   </div>


   <div class="example-contents"><p>O exemplo acima produzirá:</p></div>
   <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Array
(
    [id] =&gt; 1
    [name] =&gt; Pauline
    [password] =&gt;
)</pre>
</div>
   </div>
  </div>
 </div>


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