sqlite_create_function
(PHP 5, PECL pdo_sqlite:0.2-0.3 sqlite:1.0-1.0.3)
sqlite_create_function — Регистрирует функцию для использования в SQL запросах
Описание
sqlite_create_function() позволяет зарегистрировать PHP функцию для использования в SQLite в качестве UDF (User Defined Function - функция, определенная пользователем), что позволяет использовать эту функцию в SQL запросах.
Аргумент dbhandle задает базу данных, для которой определяется новая функция, function_name - имя функции, которое будкт использоваться в SQL запросах. Аргумент callback задает PHP функцию, которая будет вызываться при обращении к определяемой SQL функции. Необязательный аргумент num_args задает количество аргументов, которое принимает фунция. Рекомендуется всегда передавать этот аргумент, если функция принимает фиксированное количество аргументов.
Определенная таким образом функция может быть использована в любом SQL запросе, допускающем использование функций, например SELECT и UPDATE, а также в триггерах.
Пример #1 Пример использования sqlite_create_function()
<?php
function md5_and_reverse($string)
{
return strrev(md5($string));
}
if ($dbhandle = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
sqlite_create_function($dbhandle, 'md5rev', 'md5_and_reverse', 1);
$sql = 'SELECT md5rev(filename) FROM files';
$rows = sqlite_array_query($dbhandle, $sql);
} else {
echo 'Error opening sqlite db: ' . $sqliteerror;
exit;
}
?>
В этом примере мы определяем функцию, которая вычисляет MD5 хэш строки, а затем обращает полученную строку. При выполнении SQL запроса, значение поля filename преобразуется нашей функцией. Массив $rows содержит обработанный результат.
Достоинство этой техники в том, что нет необходимости обрабатывать полученный результат в цикле.
При открытии базы данных, регистрируется функция с именем php. Эта функция может быть использована для вызова любой функции PHP без регистрации.
Пример #2 Пример использования функции php
<?php
$rows = sqlite_array_query($dbhandle, "SELECT php('md5', filename) from files");
?>
В этом примере, функция md5() будет вызвана для поля filename в каждой записи.
Замечание: Для повышения производительности, PHP не кодирует и не декодирует даные, передаваемые в UDF и возвращаемые из нее. Вы должны позаботиться о кодировании/раскодировании самостоятельно, если есть необходимость обрабатывать бинарные данные. Смотрите описания функций sqlite_udf_encode_binary() и sqlite_udf_decode_binary().
Не рекомендуется использовать UDF для обработки бинарных данных, за исключением случаев, когда нет необходимости достичь высокого быстродействия.
sqlite_create_function() и sqlite_create_aggregate() могут быть использованы для переопределения встроенных функций SQLite.
Смотрите также
See also sqlite_create_aggregate().
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- SQLite
- sqlite_array_query
- sqlite_busy_timeout
- sqlite_changes
- sqlite_close
- sqlite_column
- sqlite_create_aggregate
- sqlite_create_function
- sqlite_current
- sqlite_error_string
- sqlite_escape_string
- sqlite_exec
- sqlite_factory
- sqlite_fetch_all
- sqlite_fetch_array
- sqlite_fetch_column_types
- sqlite_fetch_object
- sqlite_fetch_single
- sqlite_fetch_string
- sqlite_field_name
- sqlite_has_more
- sqlite_has_prev
- sqlite_key
- sqlite_last_error
- sqlite_last_insert_rowid
- sqlite_libencoding
- sqlite_libversion
- sqlite_next
- sqlite_num_fields
- sqlite_num_rows
- sqlite_open
- sqlite_popen
- sqlite_prev
- sqlite_query
- sqlite_rewind
- sqlite_seek
- sqlite_single_query
- sqlite_udf_decode_binary
- sqlite_udf_encode_binary
- sqlite_unbuffered_query
- sqlite_valid
Коментарии
The function can be a method of a class:
<?php
class sqlite_function {
function md5($value)
{
return md5($value);
}
}
$dbhandle = sqlite_open('SQLiteDB');
sqlite_create_function($dbhandle, 'md5', array('sqlite_function', 'md5'), 1);
// From now on, you can use md5 function inside your SQL statements
?>
It works fine :)
In my previous comment, there was an error in the code which was causing the issue.
Removing the surrounding quotes from from_unixtime()'s return value solved the issue, and so UDFs _do work_ from within DELETEs and INSERTs! Yay!
<?php
// SQLite UDF
// Mimic MySQL FROM_UNIXTIME
function from_unixtime($unixtime)
{
return date('Y-m-d H:i:s', $unixtime); // no surrouding quotes
}
?>
Although you can create an UDF named 'regexp()', I think it won't be registered as REGEXP operator..
<?php
//registering REGEXP
function my_sqlite_regexp($x,$y){
return (int)preg_match("`$y`i",$x);
}
echo $db->createFunction('regexp','my_sqlite_regexp',2);
//testing regexp as function, working
$res = $db->query("SELECT * FROM x WHERE regexp(c,'h')", SQLITE_ASSOC , $err) ;
//testing regexp as operator, not working, near "REGEXP": syntax error
$res = $db->query("SELECT * FROM x WHERE c REGEXP 'h'", SQLITE_ASSOC , $err);
?>
I'd also swapped the function parameters $x and $y, but also not works..
-----
From SQLite documentation:
"The REGEXP operator is a special syntax for the regexp() user function. No regexp() user function is defined by default and so use of the REGEXP operator will normally result in an error message. If a application-defined SQL function named "regexp" is added at run-time, that function will be called in order to implement the REGEXP operator."
The (probably) all too often requested regexp() function actually works just fine.
<?php
$db = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$db->sqliteCreateFunction('regexp', function($y, $x) { return preg_match('/' . addcslashes($y, '/') . '/', $x); }, 2);
$db->query('SELECT ("Things!" REGEXP "^T") `result`');
?>