PHP Velho Oeste 2024

sqlite_create_function

SQLiteDatabase->createFunction

(PHP 5 < 5.4.0, sqlite >= 1.0.0)

sqlite_create_function -- SQLiteDatabase->createFunctionSQL deyimlerinde kullanmak üzere bir kullanıcı tanımlı işlevi kayda geçirir

Açıklama

sqlite_create_function ( resource $db , string $işlev_adı , callback $geriçağırım [, int $değ_sayısı = -1 ] ) : void

Nesne yönelimli kullanım

createFunction ( string $işlev_adı , callback $geriçağırım [, int $değ_sayısı = -1 ] ) : void

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 db değ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.

İpucu

Başarımı arttırmak uygulamanız için vazgeçilmezlerdense kullanıcı tanımlı işlevlerde ikil verileri işlemeniz önerilmez.

İpucu

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

add a note add a note

User Contributed Notes 4 notes

up
1
anrdaemon at freemail dot ru
7 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
12 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
18 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