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 — SQL deyimlerinde kullanmak üzere bir kullanıcı tanımlı işlevi kayda geçirir
Açıklama
$db
, string $işlev_adı
, callback $geriçağırım
[, int $değ_sayısı = -1
] )Nesne yönelimli kullanım
SQL deyimlerinde kullanmak üzere bir kullanıcı tanımlı işlevi kayda geçirir.
Kullanıcı tanımlı işlevler, işlev çağırabilen SQL deyimlerinde kulllanılır. SELECT ve UPDATE deyimlerinden başka tetikleyiciler de işlev çağırabilmektedir.
Değiştirgeler
-
db -
SQLite Veritabanı özkaynağı. Yordamsal kullanımda sqlite_open() işlevi tarafından döndürülür. Nesne yönelimli kullanımda bu değiştirgeye gerek yoktur.
-
işlev_adı -
SQL deyiminde kullanılacak işlevin adı.
-
geriçağırım -
Tanımlanan SQL işlevini elde edecek geriçağırım işlevi.
Bilginize: Geriçağırım işlevlerinin SQLite'ın tanıdığı veri türlerini döndürmesi gerekir (bir sayıl tür gibi).
-
değ_sayısı -
Geriçağırım işlevi belli sayıda değiştirge gerektiriyorsa SQLite çözümleyiciye bir ipucu vermek için kullanılır.
Bilginize: Diğer veritabanı eklentileri (MySQL gibi) ile uyumluluk için iki ayrı sözdizimi desteklenmektedir. Genelde tercih edilen sözdizimi
dbdeğiştirgesinin ilk değiştirge olarak kullanıldığı ilk sözdizimidir.
Dönen Değerler
Hiçbir değer dönmez.
Örnekler
Örnek 1 - sqlite_create_function() örneği
<?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 'sqlite veritabanı açılırken hata: ' . $sqliteerror;
exit;
}
?>
Bu örnekte, bir dizgenin MD5 toplamını hesaplayıp bunu ters çeviren bir
işlev tanımlanmaktadır. SQL deyimi çalıştırıldığında işlevimiz dosya isminin
dönüştürülmüş değerini döndürmektedir. $rows sonucu
içerecektir.
Bu tekniğin güzel tarafı veriyi sorguladıktan sonra sonucu işlemek için bir foreach döngüsü kullanımını gerektirmemesidir.
Veritabanı ilk açıldığında PHP, php adında bir işlevi
kayda geçirir. Yeni bir isim kaydetmek zorunda kalmadan
php ismini işlev_adı olarak
kullanabilirsiniz.
Örnek 2 - php işlevi kullanım örneği
<?php
$rows = sqlite_array_query($dbhandle, "SELECT php('md5', dosya) from files");
?>
Bu örnek veritabanındaki her dosya sütunu için
md5() işlevini çağırır ve sonucu
$rows içinde döndürür.
Bilginize:
Başarımı arttırmak amacıyla PHP, kullanıcı tanımlı işleve aktarılan ve ondan dönen ikil verileri özdevinimli olarak kodlamaz veya çözümlemez. Bu yöntemde ikil veriler kullanmak istiyorsanız ikil verileri kodlama ve çözme işlemlerini kendiniz gerçeklemelisiniz. Bu konuda daha ayrıntılı bilgi edinmek için sqlite_udf_encode_binary() ve sqlite_udf_decode_binary() işlevinin açıklamasına bakınız.
Başarımı arttırmak uygulamanız için vazgeçilmezlerdense kullanıcı tanımlı işlevlerde ikil verileri işlemeniz önerilmez.
sqlite_create_function() ve sqlite_create_aggregate() işlevlerini SQLite'ın dahili SQL işlevlerini geçersiz kılmak için kullanabilirsiniz.
Ayrıca Bakınız
- sqlite_create_aggregate() - SQL deyimlerinde kullanmak üzere toparlayıcı bir kullanıcı tanımlı işlevi kayda geçirir
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 :)
