<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'sqlite3.setauthorizer.php',
    1 => 'SQLite3::setAuthorizer',
    2 => 'Configura una funci&oacute;n de retrollamada para utilizar como autorizador para limitar lo que una sentencia puede hacer',
  ),
  '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' => 'es',
    '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 una función de retrollamada para utilizar como autorizador para limitar lo que una sentencia puede hacer</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-sqlite3.setauthorizer-description">
  <h3 class="title">Descripción</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 una función de retrollamada que será llamada por SQLite cada vez que se realiza una acción
   (lectura, eliminación, actualización, etc.). Esto se utiliza durante la preparación de una sentencia SQL a partir
   de una fuente no confiable para asegurarse de que las sentencias SQL no intenten acceder a datos
   a los que no están autorizadas a acceder, o que no intenten ejecutar sentencias
   maliciosas que dañen la base de datos. Por ejemplo, una aplicación puede autorizar a un usuario
   a introducir consultas SQL arbitrarias para evaluación por una base de datos. Pero la aplicación no quiere
   que el usuario pueda realizar modificaciones arbitrarias en la base de datos. Un autorizador podría
   entonces establecerse mientras el SQL introducido por el usuario es preparado para prohibir todo excepto las
   declaraciones SELECT.
  </p>
  <p class="para">
   La función de retrollamada del autorizador puede ser llamada varias veces para cada sentencia preparada por
   SQLite. Una consulta <code class="literal">SELECT</code> o <code class="literal">UPDATE</code> llamará al autorizador para cada
   columna que sería leída o actualizada.
  </p>
  <p class="para">
   La función de retrollamada del autorizador es llamada con hasta cinco parámetros. El primer parámetro siempre es
   proporcionado, y es un <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> (código de acción) correspondiente a una constante de
   <code class="literal">SQLite3</code>. Los otros parámetros solo se pasan para ciertas acciones. La
   tabla siguiente describe los parámetros segundo y tercero según la acción:
   <table class="doctable table">
    <caption><strong>Lista de códigos de acción y parámetros</strong></caption>
    
     <thead>
      <tr>
       <th>Acción</th>
       <th>Segundo parámetro</th>
       <th>Tercer 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>Nombre del índice</td><td>Nombre de la tabla</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-table">SQLite3::CREATE_TABLE</a></code></strong></td><td>Nombre de la tabla</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>Nombre del índice</td><td>Nombre de la tabla</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>Nombre de la tabla</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>Nombre del disparador</td><td>Nombre de la tabla</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>Nombre de la vista</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>Nombre del disparador</td><td>Nombre de la tabla</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.create-view">SQLite3::CREATE_VIEW</a></code></strong></td><td>Nombre de la vista</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>Nombre de la tabla</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>Nombre del índice</td><td>Nombre de la tabla</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-table">SQLite3::DROP_TABLE</a></code></strong></td><td>Nombre de la tabla</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>Nombre del índice</td><td>Nombre de la tabla</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>Nombre de la tabla</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>Nombre del disparador</td><td>Nombre de la tabla</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>Nombre de la vista</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>Nombre del disparador</td><td>Nombre de la tabla</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.drop-view">SQLite3::DROP_VIEW</a></code></strong></td><td>Nombre de la vista</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>Nombre de la tabla</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>Nombre Pragma</td><td>El primer argumento pasado al pragma, o <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>Nombre de la tabla</td><td>Nombre de la columna</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>Operación</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>Nombre de la tabla</td><td>Nombre de la columna</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.attach">SQLite3::ATTACH</a></code></strong></td><td>Filename</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>Nombre de la base de datos</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>Nombre Database</td><td>Nombre de la tabla</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.reindex">SQLite3::REINDEX</a></code></strong></td><td>Nombre del í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>Nombre de la tabla</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>Nombre de la tabla</td><td>Nombre del 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>Nombre de la tabla</td><td>Nombre del 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>Nombre de la función</td></tr>

      <tr><td><strong><code><a href="class.sqlite3.php#sqlite3.constants.savepoint">SQLite3::SAVEPOINT</a></code></strong></td><td>Operación</td><td>Nombre del punto de guardado</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">
   El cuarto parámetro será el nombre de la base de datos (<code class="literal">&quot;main&quot;</code>,
   <code class="literal">&quot;temp&quot;</code>, etc.) si es aplicable.
  </p>
  <p class="para">
   El quinto parámetro de la función de retrollamada del autorizador es el nombre del disparador o de la vista más
   interno que es responsable del intento de acceso o <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> si este intento de acceso proviene directamente del
   código SQL de nivel superior.
  </p>
  <p class="para">
   Cuando la función de retrollamada devuelve <strong><code><a href="class.sqlite3.php#sqlite3.constants.ok">SQLite3::OK</a></code></strong>, significa que la operación
   solicitada es aceptada. Cuando la función de retrollamada devuelve <strong><code><a href="class.sqlite3.php#sqlite3.constants.deny">SQLite3::DENY</a></code></strong>, la llamada que
   provocó el autorizador fallará con un mensaje de error explicando que
   el acceso es denegado.
  </p>
  <p class="para">
   Si el código de acción es <strong><code><a href="class.sqlite3.php#sqlite3.constants.read">SQLite3::READ</a></code></strong> y la función de retrollamada devuelve
   <strong><code><a href="class.sqlite3.php#sqlite3.constants.ignore">SQLite3::IGNORE</a></code></strong>, entonces la sentencia preparada se construye para sustituir un valor
   <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> en lugar de la columna de la tabla que se habría leído si <strong><code><a href="class.sqlite3.php#sqlite3.constants.ok">SQLite3::OK</a></code></strong> se hubiera devuelto.
   Devolver <strong><code><a href="class.sqlite3.php#sqlite3.constants.ignore">SQLite3::IGNORE</a></code></strong> puede ser utilizado para denegar a un usuario no confiable el acceso
   a columnas individuales de una tabla.
  </p>
  <p class="para">
   Cuando una tabla es referenciada por un <code class="literal">SELECT</code> pero no se extrae ningún valor de columna de
   esa tabla (por ejemplo en una consulta como <code class="literal">&quot;SELECT count(*) FROM table&quot;</code>), entonces la función
   de retrollamada del autorizador se invoca una vez para esa tabla con un nombre de columna que es una cadena vacía.
  </p>
  <p class="para">
   Si el código de acción es <strong><code><a href="class.sqlite3.php#sqlite3.constants.delete">SQLite3::DELETE</a></code></strong> y la función de retrollamada devuelve
   <strong><code><a href="class.sqlite3.php#sqlite3.constants.ignore">SQLite3::IGNORE</a></code></strong>, entonces la operación DELETE continúa pero la optimización de truncamiento es
   desactivada y todas las filas se eliminan individualmente.
  </p>
  <p class="para">
   Solo un autorizador puede estar activo en una conexión de base de datos a la vez. Cada llamada a
   <span class="methodname"><strong>SQLite3::setAuthorizer()</strong></span> reemplaza la llamada anterior. Desactive el autorizador instalando
   una retrollamada <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. El autorizador está desactivado por omisión.
  </p>
  <p class="para">
   La función de retrollamada del autorizador no debe hacer nada que modifique la conexión de base de
   datos que ha invocado la función de retrollamada del autorizador.
  </p>
  <p class="para">
   Es importante señalar que el autorizador solo se llama cuando una sentencia es preparada, no cuando es
   ejecutada.
  </p>
  <p class="para">
   Más detalles pueden encontrarse en la
   <a href="http://sqlite.org/c3ref/set_authorizer.html" class="link external">&raquo;&nbsp;documentación de 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">
      El <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> a llamar.
     </p>
     <p class="para">
      Si se pasa <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, esto desactivará la retrollamada del autorizador actual.
     </p>
    </dd>
   
  </dl>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-sqlite3.setauthorizer-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   Esta función retorna <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-sqlite3.setauthorizer-errors">
  <h3 class="title">Errores/Excepciones</h3>
  <p class="para">
   Este método no lanza ningún error, pero si un autorizador está activado y devuelve un
   valor inválido, la preparación de la sentencia lanzará un error (o una excepción, según
   el uso del 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">Ejemplos</h3>
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Ejemplo de <span class="methodname"><strong>SQLite3::setAuthorizer()</strong></span></strong></p>
   <div class="example-contents"><p>
     Esto solo autoriza el acceso de lectura, y solo ciertas columnas de la tabla
     <code class="literal">users</code> serán devueltas. Las otras columnas serán reemplazadas 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>El ejemplo anterior mostrará:</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); ?>