sqlite_create_function

(PHP 5 < 5.4.0, sqlite >= 1.0.0)

sqlite_create_function Registra uma Função Definida pelo Usuário (UDF) para usar em SQL.

Descrição

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

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.

Dica

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.

Dica

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

add a note add a note

User Contributed Notes 4 notes

up
1
anrdaemon at freemail dot ru
8 years ago
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`');

?>
up
1
Dodolidet
13 years ago
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."
up
1
info at myphp dot it
19 years ago
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 :)
up
0
Brett
19 years ago
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
}

?>
To Top