sqlite_create_function
PHP 5
註冊一個用戶自定義的 SQL 語句
sqlite_create_function
PHP 5
註冊一個用戶自定義的 SQL 語句
描述:
void sqlite_create_function( resource $dbhandle , string $function_name , callback $callback [, int $num_args ] )
面向對象風格的方法 :
class SQLiteDatabase
{
void createFunction( string $function_name , callback $callback [, int $num_args ] )
}
sqlite_create_function() 允許你用 PHP 的函式來編寫擴充 SQLite 的 UDF ( 用戶自定義函式 ), 然後你就可以在 SQL 語句中調用該函式了 .
UDF 可以被用在任何能夠調用 SQL 函式的語句中,如 SELECT 、 UPDATE 還有觸發器 .
參數
dbhandle
由 sqlite_open() 函式執行後返回的 SQLite 資料庫檔案的句柄 . 如果是使用面向對象的方法(類調用)則不需要該參數 .
function_name
要創建的 SQL 函式名 .
callback
用來實現自定義 SQL 函式的回調函式 .
回調函式返回的數據類型應該可以被 SQLite 正確的識別 .
num_args
如果回調函式的參數個數是固定的,則用該參數來告訴 SQLite 的語法分析器參數的個數 .
為了能夠兼容其它資料庫的擴展函式 ( 例如 MySQL) ,最好使用兩種函式接口中第一個參數是的 dbhandle 那種形式 .
代碼演示
sqlite_create_function() 例子
<?php
function md5_and_reverse ( $string )
function md5_and_reverse ( $string )
{
return strrev ( md5 ( $string ));
}
if ( $dbhandle = sqlite_open ( 'mysqlitedb' , 0666 , $sqliteerror ))
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 );
}
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;
exit;
}
?>
?>
在這個例子中 , 我們用一個函式來計算字元串的 md5 值 , 然後把值做翻轉 . 當 SQL 語句執行的時候得到的結果是經過函式轉換後的 filename 的值 . $rows 保存了程式執行的結果 .
此外更方便的地方是在執行完查詢之後,你不需要調用 foreach() 循環來獲得查詢的數據 .
PHP 一打開資料庫就註冊了一個叫 php 的特別的自定義函式 . 這個 php 函式可以被任何 PHP 函式調用,而不需要先註冊它 .
直接調用 PHP 函式的例子
<?php
$rows = sqlite_array_query ( $dbhandle , "SELECT php('md5', filename) from files" );
?>
$rows = sqlite_array_query ( $dbhandle , "SELECT php('md5', filename) from files" );
?>
這個例子在資料庫的每個 filename 列上調用 md5() 函式,然後把返回的結果的總和存入變數 $rows.
考慮到效率的原因 , PHP 不會自動對你的自定義函式中的二進制數據進行編碼或解碼 . 你需要自己對你的函式的二進制參數或返回值進行編碼或解碼 . 你可以用一下兩個函式來完成這項任務 sqlite_udf_encode_binary() 、 sqlite_udf_decode_binary() .
當然我們並不建議您在自定義函式中處理二進制數據,除非您的程式不在乎執行的效率 .
你可以用 sqlite_create_function() 和 sqlite_create_aggregate() 來覆蓋 SQLite 原有的 SQL 函式 .