Since regular expression is not supported by default SQLite, we can create a user function to do the job.
<?php
$db = new SQLite3("database.sqlit3", 0666);
// create a function named "preg_match"
// with the php core function "preg_match"
if ($db->createFunction("preg_match", "preg_match", 2) === FALSE)
exit("Failed creating function\n");
// this query will then works as expected
$result = $db->query("SELECT * FROM table1 WHERE
preg_match('/^(apple|orange)$/', variable1)");
?>SQLite3::createFunction
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
SQLite3::createFunction
Референца за `sqlite3.createfunction.php` со подобрена типографија и навигација.
SQLite3::createFunction
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SQLite3::createFunction — Регистрира PHP функција за употреба како SQL скаларна функција
= NULL
string
$name,callable
$callback,int
$argCount = -1,int
$flags = 0): bool
Регистрира PHP функција или кориснички дефинирана функција за употреба како SQL скаларна функција за употреба во SQL изјави.
Параметри
name-
Име на SQL функцијата што треба да се креира или предефинира.
callback-
Име на PHP функција или кориснички дефинирана функција за примена како повратен повик, дефинирајќи го однесувањето на SQL функцијата.
Оваа функција треба да биде дефинирана како:
value-
Првиот аргумент што се предава на SQL функцијата.
values-
Понатамошни аргументи што се предаваат на SQL функцијата.
argCount-
Бројот на аргументи што ги зема SQL функцијата. Ако овој параметар е
-1, тогаш SQL функцијата може да земе било кој број на аргументи. flags-
Бинарна конјункција на знаменца. Моментално, само
SQLITE3_DETERMINISTICе поддржано, што специфицира дека функцијата секогаш враќа ист резултат дадени исти влезови во рамките на еден SQL израз.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true по успешно креирање на функцијата, false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 7.1.4 |
На flags параметарот е додаден.
|
Примери
Пример #1 Го специфицира тоа што базата на податоци SQLite3 треба да биде креирана ако веќе не постои. example
<?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 забелешки
In PHP 5.4 there will be a createCollation method to use your custom collation method, to be able to sort datasets using unicode, like this:
<?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;');
?>
But until this cool feature becomes available, you'll have to do some tricks, like this for french:
<?php
function sqlite3_to_ascii($str, $charset = 'UTF-8')
{
// Don't process empty strings
if (!trim($str))
return $str;
// We only process non-ascii strings
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);');
?>
This will convert non-ascii characters to ascii ones before collation. In fact this won't work with non-latin languages, but for latin-languages it's better than nothing.
Please note that this will slow down about 1.8 times the query (tested on a 10.000 rows table).