|
 |
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.
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
function from_unixtime($unixtime)
{
return date('Y-m-d H:i:s', $unixtime); }
?>
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
function from_unixtime($unixtime)
{
return "'".date('Y-m-d H:i:s', $unixtime)."'";
}
$handle = sqlite_open('db.sqlite', 0666);
sqlite_create_function($handle, 'FROM_UNIXTIME', 'from_unixtime', 1);
$sql = "
INSERT INTO table (name, timestamp)
VALUES ('Foo', FROM_UNIXTIME(".time().");
";
$result = sqlite_exec($handle, $sql);
$sql = "SELECT * FROM table";
$result = sqlite_unbuffered_query($handle, $sql)
$row = sqlite_fetch_all($result, SQLITE_ASSOC);
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);
?>
It works fine :)
| |