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."
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
$dbhandle
, string $function_name
, callable $callback
[, int $num_args = -1
] )Estilo orientado a objetos (método):
$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
dbhandlees 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.
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.
Puede utilizar sqlite_create_function() y sqlite_create_aggregate() para reemplazar las funciones SQL nativas de SQLite.
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
}
?>
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'
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 :)
