SQLite3::createFunction

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::createFunction注册一个 PHP 函数作为 SQL 标量函数

说明

public SQLite3::createFunction(
    string $name,
    callable $callback,
    int $argCount = -1,
    int $flags = 0
): bool

注册一个 PHP 函数或用户定义函数作为 SQL 标量函数,用于 SQL 语句中。

参数

name

要创建或重新定义的 SQL 函数的名称。

callback

要应用为回调的 PHP 函数或用户定义函数的名称,定义 SQL 函数的行为。

此函数需要定义为

callback(mixed $value, mixed ...$values): mixed
value

传递给 SQL 函数的第一个参数。

values

传递给 SQL 函数的更多参数。

argCount

SQL 函数接受的参数数量。如果此参数为 -1,则 SQL 函数可以接受任意数量的参数。

flags

标志的按位连接。目前,只支持 SQLITE3_DETERMINISTIC,它指定在单个 SQL 语句中,对于相同的输入,函数始终返回相同的结果。

返回值

如果成功创建函数,则返回 true,如果失败,则返回 false

变更日志

版本 说明
7.1.4 添加了 flags 参数。

示例

示例 #1 SQLite3::createFunction() 示例

<?php
function my_udf_md5($string) {
return
hash('md5', $string);
}

$db = new SQLite3('mysqlitedb.db');
$db->createFunction('my_udf_md5', 'my_udf_md5');

var_dump($db->querySingle('SELECT my_udf_md5("test")'));
?>

上面的示例将输出类似以下内容

string(32) "098f6bcd4621d373cade4e832627b4f6"

添加注释

用户贡献注释 2 个注释

9
koalay at gmail dot com
14 年前
由于 SQLite 默认不支持正则表达式,我们可以创建一个用户函数来完成这项工作。

<?php

$db
= new SQLite3("database.sqlit3", 0666);

// 创建一个名为 "preg_match" 的函数
// 使用 php 核心函数 "preg_match"
if ($db->createFunction("preg_match", "preg_match", 2) === FALSE)
exit(
"Failed creating function\n");

// 然后,此查询将按预期工作
$result = $db->query("SELECT * FROM table1 WHERE
preg_match('/^(apple|orange)$/', variable1)"
);

?>
-1
bohwaz
12 年前
在 PHP 5.4 中,将有一个 createCollation 方法来使用您的自定义排序规则方法,以便能够使用 unicode 对数据集进行排序,例如:

<?php
setlocale
(LC_COLLATE, 'fr_FR.UTF-8');
$db->createCollation('PHP_COLLATE', 'strcoll');

$db->query('SELECT * FROM my_table ORDER BY name COLLATE PHP_COLLATE;');
?>

但在此酷炫的功能可用之前,您需要做一些技巧,例如,对法语进行以下操作

<?php
function sqlite3_to_ascii($str, $charset = 'UTF-8')
{
// 不要处理空字符串
if (!trim($str))
return
$str;

// 我们只处理非 ASCII 字符串
if (preg_match('!^[[:ascii:]]+$!', $str))
return
$str;

$str = htmlentities($str, ENT_NOQUOTES, $charset);

$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
$str = preg_replace('#&[^;]+;#', '', $str);

return
$str;
}

$db->createFunction('to_ascii', 'sqlite3_to_ascii', 1);
$res = $db->query('SELECT * FROM test ORDER BY to_ascii(text);');
?>

这将在排序之前将非 ASCII 字符转换为 ASCII 字符。事实上,这对于非拉丁语言将不起作用,但对于拉丁语言,它比没有好。

请注意,这将使查询速度降低大约 1.8 倍(在 10,000 行表上测试)。
To Top