PHP Conference Japan 2024

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