PHP 7.4.22 Released!

SQLite3::createAggregate

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

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

Açıklama

public SQLite3::createAggregate(
    string $isim,
    callable $sekme_işlevi,
    callable $son_işlev,
    int $değş_sayısı = -1
): bool

SQL deyimlerinde toparlayıcı bir SQL işlevi olarak kullanılmak üzere bir PHP işlevini veya bir kullanıcı tanımlı işlevi kayda geçirir.

Değiştirgeler

isim

Oluşturulacak veya yeniden tanımlanacak toparlayıcı SQL işlevinin ismi.

sekme_işlevi

Sonuç kümesinin her satırı için çalıştırılacak geriçağırım işlevinin ismi. Bu geriçağırım işlevi sonucu biriktirmeli ve toparlayıcı bir bağlamda saklamalıdır.

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

sekme_işlevi(
    mixed $bağlam,
    int $satır_num,
    mixed $değer,
    mixed ...$değerler
): mixed
bağlam

İlk satır için null; sonraki satırlarda sekme_işlevinden evvelce dönmüş değer. Bunu toparlayıcı bağlamı oluşturmakta kullanmalısınız.

satır_num

İşlenen satır numarası.

değer

Toparlayıcı bağlama aktarılacak ilk değiştirge.

değerler

Toparlayıcı bağlama aktarılacak diğer değiştirgeler.

Bu işlevin dönüş değeri ardından çağrılacak sekme_işlevi veya son_işlevin bağlam değiştirgesinde kullanılmalıdır.

son_işlev

Veri toplama işlemi bittikten sonra çalıştırılacak geriçağırım işlevinin ismi. Tüm satırlar işlendikten sonra, bu işlev çağrılmalı ve ardından verileri toparlama bağlamından alıp sonucu döndürmelidir. Bu geri çağırım işlevi, SQLite tarafından bilinen türde bir değer (yani değişmez bir değer) döndürmelidir.

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

son_işlev(mixed $bağlam, int $satır_num): mixed
bağlam

Son sekme_işlevinden dönen değer.

satır_num

Daima 0.

Bu işlevin dönüş değeri toparlayıcı için dönüş değeri olarak kullanılır.

değş_sayısı

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

Dönen Değerler

Toparlayıcı başarıyla oluşturulmuşsa true, başarısızlık durumunda false döner.

Örnekler

Örnek 1 - en_uzun toparlayıcı işlev örneği

<?php
$data 
= array(
   
'one',
   
'two',
   
'three',
   
'four',
   
'five',
   
'six',
   
'seven',
   
'eight',
   
'nine',
   
'ten',
   );
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE strings(a)");
$insert $db->prepare('INSERT INTO strings VALUES (?)');
foreach (
$data as $str) {
    
$insert->bindValue(1$str);
    
$insert->execute();
}
$insert null;

function 
en_uzun_sekme($baglam$str_num$dizge)
{
    if (
strlen($dizge) > $baglam) {
        
$baglam strlen($dizge);
    }
    return 
$baglam;
}

function 
en_uzun_son($baglam$str_num)
{
    return 
$baglam === null $baglam;
}

$db->createAggregate('en_uzun''en_uzun_sekme''en_uzun_son');

var_dump($db->querySingle('SELECT en_uzun(a) from strings'));
?>

Yukarıdaki örneğin çıktısı:

int(5)

Bu örnekte, tablonun sütunlarından birindeki en uzun dizenin uzunluğunu hesaplayacak bir toparlama işlevi oluşturulmaktadır. Her satır için en_uzun_sekme işlevi çağrılmakta ve bir $baglam değiştirgesine aktarılmaktadır. $baglam değiştirgesi, diğer PHP değişkenleri gibidir ve bir diziyi veya hatta bir nesne değerini tutacak şekilde ayarlanabilir. Bu örnekte, bulunan en büyük uzunluğu tutmak için kullanılmaktadır. $dizge önceki en uzun dizgeden daha uzunsa, $baglam değiştirgesi bu yeni değeri tutacak şekilde güncellenmektedir.

Tüm satırlar işlendikten sonra SQLite, toparlama sonucunu belirlemek için en_uzun_son işlevini çağırır. Burada, $baglamda bulunan verilere dayanarak bir tür hesaplama yapılabilir. Yine de bu basit örnekte, sorgu ilerledikçe sonuç hesaplanmakta, bu nedenle bağlam değerini döndürmek yeterli olmaktadır.

İpucu

SQLite'ın sorguyu işlemek için çok fazla bellek kullanmasına neden olacağından, değerlerin bir kopyasının bağlamda saklanması ve ardından bunların en sonda işlenmesi ÖNERİLMEZ. Her biri 32 bayt uzunluğunda bir dizge içeren bir milyon satır...

İpucu

SQLite3::createAggregate() yöntemi SQLite'ın dahili SQL işlevlerini geçersiz kılmak için kullanılabilir.

add a note add a note

User Contributed Notes 2 notes

up
4
boris dot dd at gmail dot com
4 years ago
<?php
class Test extends SQLite3
{
    public function
__construct($file)
    {
       
parent::__construct($file);
       
$this->createAggregate('groupConcat', [$this, 'concatStep'], [$this, 'concatFinal']);
    }
    public function
concatStep(&$context, $rowId, $string, $delimiter)
    {
        if (!isset(
$context)) {
           
$context = [
               
'delimiter' => $delimiter,
               
'data'      => []
            ];
        }
       
$context['data'][] = $string;
        return
$context;
    }
    public function
concatFinal(&$context)
    {
        return
implode($context['delimiter'], $context['data']);
    }
}
$SQLite = new Test('/tmp/test.sqlite');
$SQLite->exec("create table `test` (`id` TEXT, `color` TEXT, `size` TEXT)");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'red', 'M')");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'green', 'M')");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'blue', 'S')");
$Result = $SQLite->query("select `size`, groupConcat(`color`, ';') as `color` from `test` group by `size`");
while (
$row = $Result->fetchArray(SQLITE3_ASSOC)) {
   
print_r($row);
}
/*
Array
(
    [size] => M
    [color] => red;green
)
Array
(
    [size] => S
    [color] => blue
)
*/
up
-3
sukmaagungsaputra at gmail dot com
6 years ago
Lacks of example, right?
Let's try to give to SQlite3 the capability like ones of MySQL's
- REGEXP operator,
- MD5 function, and
- GROUP_CONCAT aggregate function

$db = new SQLite3($filename);
$db->createFunction('regexp', function ($a,$b) { return preg_match("/$a/i", $b); });
$db->createFunction('md5', function ($a) { return md5($a); });
$db->createAggregate ('group_concat',
            function(&$context, $rownumber, $str) { $context[]=$str; return $context; },
            function(&$context) {return implode(",", (array) $context); });
To Top