Pdo\Sqlite::createAggregate
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Pdo\Sqlite::createAggregate
Референца за `pdo-sqlite.createaggregate.php` со подобрена типографија и навигација.
Pdo\Sqlite::createAggregate
Класата Dom\DtdNamedNodeMap
Pdo\Sqlite::createAggregate — Registers an aggregating user-defined function for use in SQL statements
= NULL
string
$name,callable
$step,callable
$finalize,int
$numArgs = -1): bool
Овој метод е сличен на (PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0) Регистрира агрегирачка кориснички дефинирана функција за употреба во SQL изјави
освен што регистрира функции што можат да се користат за пресметување на резултат агрегиран низ сите редови на една нарачка. (PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0) Клучната разлика помеѓу овој метод и
Со користење на овој метод е можно да се презапишат нативни SQL функции.
Параметри
name- Името на функцијата што се користи во SQL изрази.
step-
е тоа што се потребни две функции за управување со агрегатот.
Оваа функција треба да биде дефинирана како:
context-
nullПовикана функција за секој ред од резултатот. Повиканата функција треба да го акумулира резултатот и да го зачува во контекстот на агрегацијата. rownumber- за првиот ред; на последователните редови ќе ја има вредноста што претходно била вратена од функцијата за чекор; треба да ја користите оваа за одржување на состојбата на агрегатот.
value- Тековниот број на редот.
values- Првиот аргумент предаден на агрегатот.
contextВратената вредност од оваа функција ќе се користи како finalize-
аргумент во следниот повик на функциите за чекор или финализирање. скаларен тип).
Оваа функција треба да биде дефинирана како:
context-
Повикана функција за агрегирање на „чекорирани“ податоци од секој ред. Откако ќе се обработат сите редови, оваа функција ќе биде повикана и треба да ги земе податоците од контекстот на агрегацијата и да го врати резултатот. Оваа повикана функција треба да врати тип што го разбира SQLite (т.е.
rowcount-
Ги чува вратените вредности од последниот повик на функцијата за чекор.
numArgs- Вратената вредност од оваа функција ќе се користи како вратена вредност за агрегатот.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех.
Примери
Пример #1 PDO::sqliteCreateAggregate() example
Наговестување до SQLite парсерот ако повиканата функција прифаќа предодреден број на аргументи.
max_length Во овој пример ќе создадеме прилагодена агрегирачка функција наречена
што може да се користи во SQL прашања. max_lengthВо овој пример, создаваме агрегирачка функција, наречена max_len_step функцијата се повикува и ѝ се предава $context параметар. Параметарот за контекст е како секоја друга PHP променлива и може да се постави да држи array или дури и object. Во овој пример, го користиме за да ја задржиме максималната должина што сме ја виделе досега; ако $string има должина поголема од моменталниот максимум, го ажурираме контекстот за да ја задржиме оваа нова максимална должина.
Откако ќе се обработат сите редови, SQLite ја повикува max_len_finalize функцијата за да го одреди збирниот резултат. Можно е да се изврши некаков вид пресметка врз основа на податоците во $context. Во овој основен пример резултатот беше пресметан како што напредуваше прашањето, така што вредноста на контекстот може директно да се врати.
<?php
$data = [
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
];
$db = new Pdo\Sqlite('sqlite::memory:');
$db->exec("CREATE TABLE strings(a)");
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
foreach ($data as $str) {
$insert->execute(array($str));
}
$insert = null;
function max_len_step($context, $row_number, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}
function max_len_finalize($context, $row_count)
{
return $context === null ? 0 : $context;
}
$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');
var_dump($db->query('SELECT max_len(a) from strings')->fetchAll());
?>НЕ се препорачува да чувате копија од вредностите во контекстот, а потоа да ги обработувате на крајот, бидејќи би предизвикале SQLite да користи многу меморија за обработка на прашањето - само замислете колку меморија би ви била потребна ако милион редови беа складирани во меморијата, секој содржејќи низа долга 32 бајти.
Види Исто така
- (PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0) - Регистрира кориснички дефинирана функција за употреба во SQL изрази
- (PHP 5 >= 5.3.11, PHP 7, PHP 8) - Регистрира кориснички дефинирана функција за употреба како функција за споредување во SQL изрази
- sqlite_create_function()
- sqlite_create_aggregate()