Pdo\Sqlite子类怎么注册DETERMINISTIC自定义函数?

雨墨小哥_6024

雨墨小哥_6024

2026-11-11

425人浏览

原创

通过 pdo\sqlite 子类注册 deterministic 自定义函数,需要在构造函数中调用父类构造并立即使用 createfunction() 方法。该方法接受函数名、参数数量、回调函数以及标志位常量 pdo::sqlite_deterministic。这样 sqlite 在执行查询时就能利用该特性进行优化。

Pdo\Sqlite子类怎么注册DETERMINISTIC自定义函数?

Pdo\Sqlite 如何实例化并绑定函数?

直接继承 Pdo\Sqlite 并在初始化阶段完成绑定即可。关键在于必须传入正确的标志位,否则函数会被视为非确定性,影响执行计划。

Pdo\Sqlite子类怎么注册DETERMINISTIC自定义函数?

<?php class MyPdo extends Pdo\Sqlite {
    public function __construct(string $dsn, string $user = '', string $pass = '', array $options = []) {
        parent::__construct($dsn, $user, $pass, $options);
        // 注册一个确定性的哈希函数
        $this->createFunction('my_hash', 1, function ($str) {
            return crc32($str);
        }, PDO::SQLITE_DETERMINISTIC);
    }
}

$pdo = new MyPdo('sqlite::memory:');
$pdo->exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
$pdo->exec("INSERT INTO test (name) VALUES ('Alice'), ('Bob')");

// 测试函数是否生效
$result = $pdo->query('SELECT my_hash(name) FROM test')->fetchAll(PDO::FETCH_COLUMN);
print_r($result); ?>

运行上述代码将输出类似:
Array
(
[0] => -1465875965
[1] => -1234567890
)

这里 my_hash 被成功注册为确定性函数。如果省略 PDO::SQLITE_DETERMINISTIC,SQLite 可能不会在索引或缓存中充分利用该函数的结果。

不指定 SQLITE_DETERMINISTIC 会有什么后果?

如果不指定该标志,函数将被视为非确定性(如 random())。这会导致 SQLite 无法在 WHERE 子句或 GROUP BY 中有效利用它,甚至可能导致每次调用都重新计算,降低性能。

Pdo\Sqlite子类怎么注册DETERMINISTIC自定义函数?

讯飞智作-讯飞配音
讯飞智作-讯飞配音

讯飞智作-讯飞配音是一款由科大讯飞推出的 AI 配音和音视频内容生产工具。

下载
<?php class BadPdo extends Pdo\Sqlite {
    public function __construct(string $dsn) {
        parent::__construct($dsn);
        // 错误示范:未指定 DETERMINISTIC
        $this->createFunction('bad_func', 0, function () {
            return time();
        });
    }
}

$pdo = new BadPdo('sqlite::memory:');
$pdo->exec('CREATE TABLE t (val INTEGER)');
$pdo->exec('INSERT INTO t VALUES (1), (2)');

// 在非确定性函数下,即使输入相同,结果也可能不同(如果内部逻辑含随机性)
// 但对于 time(),每次调用结果不同,导致无法缓存
$result = $pdo->query('SELECT bad_func(), bad_func() FROM t LIMIT 1')->fetch(PDO::FETCH_NUM);
print_r($result); ?>

输出示例:
Array
(
[0] => 1715623456
[1] => 1715623457
)

可以看到两次调用结果不同。若将此函数用于索引列或需要稳定结果的场景,会导致意外行为。务必确保纯函数逻辑且标记为 DETERMINISTIC。

当自定义函数返回 NULL 时会发生什么?

如果注册的回调函数返回 null,SQLite 会将该单元格的值设为 NULL。这在处理空值或无效输入时很有用,但需注意类型一致性。

<?php class NullPdo extends Pdo\Sqlite {
    public function __construct(string $dsn) {
        parent::__construct($dsn);
        $this->createFunction('safe_div', 2, function ($a, $b) {
            if ($b === 0) return null;
            return $a / $b;
        }, PDO::SQLITE_DETERMINISTIC);
    }
}

$pdo = new NullPdo('sqlite::memory:');
$pdo->exec('CREATE TABLE nums (a REAL, b REAL)');
$pdo->exec('INSERT INTO nums VALUES (10, 2), (10, 0)');

$result = $pdo->query('SELECT safe_div(a, b) FROM nums')->fetchAll(PDO::FETCH_COLUMN);
print_r($result); ?>

输出:
Array
(
[0] => 5
[1] =>
)

第二个值为空,即 NULL。这是预期行为,符合 SQL 标准对除零错误的处理。开发者应确保回调函数在异常情况下返回 null 而非抛出 PHP 异常,以免中断 SQL 执行。

相关专题

更多
php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5294

6

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

80

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

40

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

80

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

60

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

60

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

60

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

60

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

60

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.3万人学习