sqlite_create_function

(PHP 5, PECL pdo_sqlite:0.2-0.3 sqlite:1.0-1.0.3)

sqlite_create_function — Регистрирует функцию для использования в SQL запросах

Описание

bool sqlite_create_function ( resource $dbhandle , string $function_name , mixed $callback [, int $num_args ] )

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().

Коментарии

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 :)
2004-12-28 15:52:34
http://php5.kiev.ua/manual/ru/function.sqlite-create-function.html
Автор:
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
}

?>
2005-05-20 13:27:55
http://php5.kiev.ua/manual/ru/function.sqlite-create-function.html
Автор:
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."
2011-07-20 01:44:39
http://php5.kiev.ua/manual/ru/function.sqlite-create-function.html
The (probably) all too often requested regexp() function actually works just fine.

<?php

$db 
= new PDO('sqlite::memory:'nullnull, [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`');

?>
2016-12-01 07:35:43
http://php5.kiev.ua/manual/ru/function.sqlite-create-function.html

    Поддержать сайт на родительском проекте КГБ