<?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
)
*/SQLite3::createAggregate
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
SQLite3::createAggregate
Референца за `sqlite3.createaggregate.php` со подобрена типографија и навигација.
SQLite3::createAggregate
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SQLite3::createAggregate — Регистрира PHP функција за употреба како SQL агрегатна функција
= NULL
string
$name,callable
$stepCallback,callable
$finalCallback,int
$argCount = -1): bool
Регистрира PHP функција за употреба како SQL агрегатна функција
Параметри
name-
Регистрира PHP функција или кориснички дефинирана функција за употреба како SQL агрегатна функција за употреба во SQL изрази.
stepCallback-
Име на SQL агрегатот што треба да се креира или предефинира.
Оваа функција треба да биде дефинирана како:
context-
nullПовикана функција за секој ред од резултатот. Повиканата функција треба да го акумулира резултатот и да го зачува во контекстот на агрегацијата. rownumber-
за првиот ред; на последователните редови ќе ја има вредноста што претходно била вратена од функцијата за чекор; треба да ја користите оваа за одржување на состојбата на агрегатот.
value-
Тековниот број на редот.
values-
Првиот аргумент предаден на агрегатот.
contextВратената вредност од оваа функција ќе се користи како finalCallback-
Повикувачка функција повикана за секој ред од множеството резултати. Вашата PHP функција треба да го акумулира резултатот и да го зачува во контекстот на агрегацијата. скаларен тип).
Оваа функција треба да биде дефинирана како:
context-
Повикана функција за агрегирање на „чекорирани“ податоци од секој ред. Откако ќе се обработат сите редови, оваа функција ќе биде повикана и треба да ги земе податоците од контекстот на агрегацијата и да го врати резултатот. Оваа повикана функција треба да врати тип што го разбира SQLite (т.е.
rownumber-
Секогаш
0.
argCount-
Повикувачка функција за агрегирање на „чекорените“ податоци од секој ред. Откако сите редови ќе бидат обработени, оваа функција ќе биде повикана и таа треба да ги земе податоците од контекстот на агрегацијата и да го врати резултатот. Оваа повикувачка функција треба да врати тип разбирлив за SQLite (т.е.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true Бројот на аргументи што ги зема SQL агрегатот. Ако овој параметар е негативен, тогаш SQL агрегатот може да земе кој било број на аргументи. false при неуспех.
Примери
при успешно креирање на агрегатот, или
<?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 max_len_step($context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}
function max_len_finalize($context, $rownumber)
{
return $context === null ? 0 : $context;
}
$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');
var_dump($db->querySingle('SELECT max_len(a) from strings'));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
int(5)
Пример #1 пример за функција за агрегирање max_length max_len_step функцијата се повикува и ѝ се предава $context Во овој пример, креираме агрегирачка функција која ќе ја пресмета должината на најдолгиот стринг во една од колоните на табелата. За секој ред,
$string има должина поголема од моменталниот максимум, го ажурираме контекстот за да ја задржиме оваа нова максимална должина.
параметар. Контекст параметарот е како и секоја друга PHP променлива и може да се постави да држи вредност од тип низа или дури и објект. Во овој пример, ние едноставно го користиме за да ја задржиме максималната должина што сме ја виделе досега; ако
max_len_finalize Откако сите редови ќе бидат обработени, SQLite ја повикува $contextфункцијата за да го одреди резултатот од агрегацијата. Овде, можеме да извршиме некаква пресметка врз основа на податоците пронајдени во
НЕ се препорачува да чувате копија од вредностите во контекстот, а потоа да ги обработувате на крајот, бидејќи би предизвикале SQLite да користи многу меморија за обработка на прашањето - само замислете колку меморија би ви била потребна ако милион редови беа складирани во меморијата, секој содржејќи низа долга 32 бајти.
Можете да користите . Во нашиот едноставен пример, сепак, го пресметувавме резултатот додека течеше прашањето, така што едноставно треба да ја вратиме вредноста на контекстот. SQLite3::createAggregate()
Белешки од корисници 2 забелешки
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); });