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
}
?>
sqlite_create_function
(PHP 5, PECL pdo_sqlite:0.2-0.3 sqlite:1.0-1.0.3)
sqlite_create_function — Registra uma Função Definida pelo Usuário (UDF) para usar em SQL.
Descrição
sqlite_create_function() permite a você registrar uma função do PHP para usar com o SQLite como uma UDF (Função Definida pelo Usuário), assim ela pode ser usada apartir de suas SQLs.
O parâmetro dbhandle especifica o banco de dados que você quer estender, function_name especifica no nome da função que você quer usar em seus SQL, callback é qualquer função valida(função criada com function) que deve ser chamada para cuidar da função SQL. O parâmetro opcional numero_de_argumentos é usado como uma dica pelo interpretador do SQLite. É recomendado que você especifique um valor apenas se sua função aceitar sempre um numero fixo de parâmetros.
A UDF pode ser usada em qualquer SQL que possa chamar funções, como SELECT e UPDATE, também em triggers.
Exemplo #1 Exemplo de 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 'Erro ao abrir o banco de dados sqlite: ' . $sqliteerror;
exit;
}
?>
Neste exemplo, nós temos uma função que calcula a soma md5 de uma string e a reverte. Quando a SQL é executada, retorna o valor de filename transformado pela nossa função. Os dados retornados em $rows contém o resultado processado.
A beleza desta tecnica é que você não precisa processar o resultado usando um loop foreach() depois de ter feito a query na tabela.
O PHP registra uma função chamada php quando o banco de dados é aberto. A função php pode ser usada para chamar qualquer função do PHP sem precisar registrar ela antes.
Exemplo #2 Exemplo de como usar a função php
<?php
$rows = sqlite_array_query($dbhandle, "SELECT php('md5', filename) from files");
?>
Esta função irá chamar a função md5() para cada coluna filename na tabela e retornar o resultado em $rows
Nota: Por razões de velocidade, O PHP não irá codificar/decodificar dados binários passados para e das UDF´s. Você precisa manualmente codificar/decodificar os parâmetros e valores de retorno de precisar lidar com dados binários desta maneira. De uma olhada em sqlite_udf_encode_binary() e sqlite_udf_decode_binary() para maiores detalhes.
Não é recomendado usar UDF's para procassar dados binários, a menos que velocidade não seja um requerimento para a sua aplicação.
Você pode usar sqlite_create_function() e sqlite_create_aggregate() para sobrescrever as funções nativas de SQL do SQLite.
Veja também sqlite_create_aggregate().
sqlite_create_function
20-May-2005 10:27
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'
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 :)
