PHP Conference Japan 2024

SQLite3::createFunction

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

SQLite3::createFunction註冊一個 PHP 函式,以用作 SQL 純量函式

說明

public SQLite3::createFunction(
    字串 $name,
    可呼叫 $callback,
    整數 $argCount = -1,
    整數 $flags = 0
): 布林值

註冊一個 PHP 函式或使用者定義函式,以用作 SQL 陳述式中的 SQL 純量函式。

參數

name

要建立或重新定義的 SQL 函式名稱。

callback

用於定義 SQL 函數行為的 PHP 函數或使用者自訂函數的回呼名稱。

此函數需定義為

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 則註解

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(
"建立函式失敗\n");

// 這個查詢將會如預期般運作
$result = $db->query("SELECT * FROM table1 WHERE
preg_match('/^(apple|orange)$/', variable1)"
);

?>
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