PHP 8.1.0 RC 2 available for testing

SQLite3::createFunction

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::createFunctionSayıl bir SQL işlevi olarak kullanılmak üzere bir PHP işlevini kayda geçirir

Açıklama

public SQLite3::createFunction(
    string $isim,
    callable $işlev,
    int $değş_sayısı = -1,
    int $seçenekler = 0
): bool

Mevcut veya yeni bir SQL işlevinin davranışını tanımlamak üzere bir geriçağırım işlevi olarak kullanılacak bir geriçağırım işlevini kayda geçirir.

Değiştirgeler

isim

Oluşturulacak veya yeniden tanımlanacak SQL işlevi.

işlev

SQL işlevinin davranışını tanımlamak üzere bir geriçağırım işlevi olarak kullanılacak bir PHP işlevi veya kullanıcı tanımlı bir işlevin ismi.

Bu işlev şöyle tanımlanmalıdır:

işlev(mixed $değer, mixed ...$değerler): mixed
değer

SQL işlevine aktarılacak ilk değiştirge.

değerler

SQL işlevine aktarılacak diğer değiştirgeler.

değ_sayısı

SQL işlevinin alacağı değiştirge sayısı. -1 belirtilirse SQL işlevi herhangi bir sayıda değiştirge alabilir demektir.

seçenekler

Seçeneklerin bitsel birleşimi. Şimdilik sadece, işlevin tek bir SQL deyiminde aynı girdiler verildiğinde her zaman aynı sonucu döndüreceğini belirten SQLITE3_DETERMINISTIC desteklenmektedir.

Dönen Değerler

İşlev başarıyla oluşturulmuşsa true yoksa false döner.

Sürüm Bilgisi

Sürüm: Açıklama
7.1.4 seçenekler değiştirgesi eklendi.

Örnekler

Örnek 1 - SQLite3::createFunction() örneği

<?php
function my_udf_md5($string) {
    return 
md5($string);
}

$db = new SQLite3('mysqlitedb.db');
$db->createFunction('my_udf_md5''my_udf_md5');

var_dump($db->querySingle('SELECT my_udf_md5("test")'));
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

string(32) "098f6bcd4621d373cade4e832627b4f6"

add a note add a note

User Contributed Notes 2 notes

up
7
koalay at gmail dot com
11 years ago
Since regular expression is not supported by default SQLite, we can create a user function to do the job.

<?php

$db
= new SQLite3("database.sqlit3", 0666);

// create a function named "preg_match"
// with the php core function "preg_match"
if ($db->createFunction("preg_match", "preg_match", 2) === FALSE)
  exit(
"Failed creating function\n");

// this query will then works as expected
$result = $db->query("SELECT * FROM table1 WHERE
  preg_match('/^(apple|orange)$/', variable1)"
);

?>
up
-1
bohwaz
9 years ago
In PHP 5.4 there will be a createCollation method to use your custom collation method, to be able to sort datasets using unicode, like this:

<?php
setlocale
(LC_COLLATE, 'fr_FR.UTF-8');
$db->createCollation('PHP_COLLATE', 'strcoll');

$db->query('SELECT * FROM my_table ORDER BY name COLLATE PHP_COLLATE;');
?>

But until this cool feature becomes available, you'll have to do some tricks, like this for french:

<?php
function sqlite3_to_ascii($str, $charset = 'UTF-8')
{
   
// Don't process empty strings
   
if (!trim($str))
        return
$str;

   
// We only process non-ascii strings
   
if (preg_match('!^[[:ascii:]]+$!', $str))
        return
$str;

   
$str = htmlentities($str, ENT_NOQUOTES, $charset);

   
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
   
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
   
$str = preg_replace('#&[^;]+;#', '', $str);

    return
$str;
}

$db->createFunction('to_ascii', 'sqlite3_to_ascii', 1);
$res = $db->query('SELECT * FROM test ORDER BY to_ascii(text);');
?>

This will convert non-ascii characters to ascii ones before collation. In fact this won't work with non-latin languages, but for latin-languages it's better than nothing.

Please note that this will slow down about 1.8 times the query (tested on a 10.000 rows table).
To Top