PHP Unconference Europe 2015

sqlite_create_function

SQLiteDatabase::createFunction

(PHP 5 < 5.4.0, sqlite >= 1.0.0)

sqlite_create_function -- SQLiteDatabase::createFunction Registra una función "regular" definida por el usuario para ser usada en sentencias SQL

Descripción

void sqlite_create_function ( resource $dbhandle , string $function_name , callable $callback [, int $num_args = -1 ] )

Estilo orientado a objetos (método):

public void SQLiteDatabase::createFunction ( string $function_name , callable $callback [, int $num_args = -1 ] )

sqlite_create_function() permite registrar una función PHP con SQLite como un UDF (User Defined Function), para así poder ser llamada desde dentro de sus sentencias SQL.

La UDF puede ser usada en cualquier sentencia SQL que pueda llamar a funciones, tales como sentencias SELECT y UPDATE, y también en triggers.

Parámetros

dbhandle

El recurso de base de datos devuelto desde sqlite_open(). Este parámetro no es requerido cuando se usa el método "Orientado a objetos".

function_name

El nombre de la función que se va a usar en las sentencias SQL.

callback

Función de retorno para manejar la función SQL definida.

Nota: Las funciones de retorno deben devolver un tipo que SQLite sea capaz de entender (por ejemplo tipo escalar).

num_args

Sugerencia para el intérprete de SQLite si la función acepta un número predeterminado de argumentos.

Nota: Dos sintaxis alternativas son soportadas para la compatibilidad con otras extensiones de base de datos (tal como MySQL). La forma preferida es la primera, donde el parámetro dbhandle es el primero de la función.

Valores devueltos

No devuelve ningún valor.

Ejemplos

Ejemplo #1 Ejemplo 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 
'Error opening sqlite db: ' $sqliteerror;
    exit;
}
?>

En este ejemplo tenemos una función que calcula el valor md5 de un string, y luego lo pone del revés. Cuando se ejecuta la sentencia SQL, devuelve el valor del nombre de fichero transformado por otra función. Los datos devueltos en $rows contienen el resultado de la consulta procesada.

La belleza de esta técnica es que no se necesita procesar el resultado utilizando un loop foreach despues de que se hayan consultado los datos.

PHP registra una función especial llamada php cuando la base de datos se abre por primera vez. La función php puede ser usada para llamar cualquier función PHP sin tener que registrarla primero.

Ejemplo #2 Ejemplo de uso de la función PHP

<?php
$rows 
sqlite_array_query($dbhandle"SELECT php('md5', filename) from files");
?>

Este ejemplo llamará la función md5() en cada columna filename en la base de datos y devolverá el resultado en $rows

Nota:

Por razones de funcionamiento, PHP no codifica/descodifica automaticamente datos binarios pasados para y desde los UDFs. Es necesario codificar/descodificar manualmente los parámetros y valores devueltos si se necesita procesar los datos binarios de esta manera. Echar un vistazo a sqlite_udf_encode_binary() y sqlite_udf_decode_binary() para más información.

Sugerencia

No se recomienda usar UDFs para manejar el proceso de datos binarios, a menos que el alto rendimiento no sea un requisito indispensable para su aplicación.

Sugerencia

Puede utilizar sqlite_create_function() y sqlite_create_aggregate() para reemplazar las funciones SQL nativas de SQLite.

Ver también

add a note add a note

User Contributed Notes 3 notes

up
1
info at myphp dot it
9 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
Dodolidet
3 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
0
Brett
9 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