sqlite_create_function

(PHP 5)

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



sqlite_create_function
Brett
20-May-2005 10:27
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
}

?>
Brett
20-May-2005 09:44
It appears that UDFs created by sqlite_create_function() do not work properly within INSERT or DELETE statements.

A simplified INSERT example:

<?php

// SQLite UDF
// Mimic MySQL FROM_UNIXTIME function
function from_unixtime($unixtime)
{
   return
"'".date('Y-m-d H:i:s', $unixtime)."'";
}

// -----------------------------------------------------------

// Open the database and create the UDF
$handle = sqlite_open('db.sqlite', 0666);
sqlite_create_function($handle, 'FROM_UNIXTIME', 'from_unixtime', 1);

// Insert a row
$sql = "
   INSERT INTO table (name, timestamp)
   VALUES ('Foo', FROM_UNIXTIME("
.time().");
   "
;

$result = sqlite_exec($handle, $sql);

// Retrieve the row
$sql    = "SELECT * FROM table";
$result = sqlite_unbuffered_query($handle, $sql)
$row    = sqlite_fetch_all($result, SQLITE_ASSOC);

// Dump
print_r($row);

?>

This will show:

Array
(
   [0] => Array
       (
           [name] => 'Foo'
           [timestamp] => -1
       )
)

The expected result for timestamp would be something like '2005-05-20 10:00:00'
info at myphp dot it
28-Dec-2004 01:52
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 :)

<sqlite_create_aggregatesqlite_current>
 Last updated: Tue, 15 Nov 2005