PHP Conference Ehime 2026

Pdo\Sqlite::setAuthorizer

(PHP 8 >= 8.5.0)

Pdo\Sqlite::setAuthorizerConfigura una retrollamada para usarla como autorizador y limitar lo que puede hacer una sentencia

Descripción

public function Pdo\Sqlite::setAuthorizer(?callable $callback): void

Establece una retrollamada que será invocada por SQLite cada vez que se realice una acción (lectura, eliminación, actualización, etc.). Se utiliza cuando se prepara una sentencia SQL de una fuente no confiable para garantizar que la sentencia no acceda a datos que no tiene permitido ver ni ejecute sentencias maliciosas que dañen la base de datos.

El autorizador solo se utiliza durante la fase de preparación de la sentencia. Puede ser llamado varias veces para una sola sentencia: una consulta SELECT o UPDATE lo invoca por cada columna que sería leída o actualizada. Se ejecuta de nuevo cada vez que SQLite vuelve a preparar una sentencia, lo que puede ocurrir mientras la sentencia está siendo ejecutada, por ejemplo, después de que el esquema haya cambiado.

El autorizador es llamado con hasta cinco argumentos. Los argumentos recibidos se describen en SQLite3::setAuthorizer().

Solo puede haber un autorizador activo en una conexión de base de datos a la vez. Cada llamada a este método reemplaza la anterior. El autorizador está deshabilitado de forma predeterminada, y puede deshabilitarse de nuevo estableciendo una retrollamada null.

La retrollamada no debe modificar la conexión de base de datos que la invocó.

Más detalles pueden encontrarse en la » documentación de SQLite.

Nota:

Este método es el equivalente de SQLite3::setAuthorizer(), salvo que devuelve void en lugar de bool.

Parámetros

callback

El callable a invocar, o null para deshabilitar la retrollamada de autorización actual.

Debe devolver uno de Pdo\Sqlite::OK, Pdo\Sqlite::DENY o Pdo\Sqlite::IGNORE. Cuando se devuelve Pdo\Sqlite::DENY, la sentencia que activó el autorizador falla con un error que indica que el acceso ha sido denegado. Cuando se devuelve Pdo\Sqlite::IGNORE para una acción de lectura, la sentencia se prepara de modo que se sustituye un valor null por la columna que habría sido leída.

Valores devueltos

No se retorna ningún valor.

Errores/Excepciones

Este método en sí mismo no lanza excepciones, pero si la retrollamada del autorizador no devuelve un valor de tipo int, o devuelve un int que no es uno de Pdo\Sqlite::OK, Pdo\Sqlite::DENY o Pdo\Sqlite::IGNORE, la preparación de la sentencia lanza un TypeError o un ValueError respectivamente.

Ejemplos

Ejemplo #1 Ejemplo de Pdo\Sqlite::setAuthorizer()

Solo se permiten acciones de lectura en la conexión. Los códigos de acción están expuestos como constantes de clase SQLite3, lo que requiere que la extensión SQLite3 esté disponible; sus valores enteros pueden usarse directamente en caso contrario.

<?php
$db = new Pdo\Sqlite('sqlite::memory:');
$db->exec('CREATE TABLE users (id, name)');

$db->setAuthorizer(function (int $action, ...$args) {
    return match ($action) {
        SQLite3::SELECT, SQLite3::READ => Pdo\Sqlite::OK,
        default => Pdo\Sqlite::DENY,
    };
});

var_dump($db->query('SELECT name FROM users') instanceof PDOStatement);

try {
    $db->exec('DROP TABLE users');
} catch (PDOException $e) {
    echo $e->getMessage(), "\n";
}
?>

Resultado del ejemplo anterior es similar a:

bool(true)
SQLSTATE[HY000]: General error: 23 not authorized

Véase también

  • SQLite3::setAuthorizer() - Configura una función de retrollamada para utilizar como autorizador para limitar lo que una sentencia puede hacer
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top