SQLite3::createAggregate

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

SQLite3::createAggregateRegistrar una función de PHP para usarla como una función totalizadora de SQL

Descripción

public SQLite3::createAggregate(
    string $name,
    mixed $step_callback,
    mixed $final_callback,
    int $argument_count = -1
): bool

Registra una función de PHP o una definida por el usuario para usarla como una función totalizadora de SQL para utilizarla dentro de sentencias SQL.

Parámetros

name

El nombre de la función totalizadora de SQL a crear o redefinir.

step_callback

El nombre de una función de PHP o una definida por el usuario para aplicarla como una llamada de retorno para cada elemento del total.

final_callback

El nombre de una función de PHP o una definida por el usuario para aplicarla como una llamada de retorno al final de la información del total.

argument_count

El número de argumentos que toma la función de SQL. Si este parámetro es negativo, la función de SQL puede tomar cualquier número de argumentos.

Valores devueltos

Devuelve true si la creación de la función totalizadora tuvo éxito, false en case de error.

add a note add a note

User Contributed Notes 2 notes

up
4
boris dot dd at gmail dot com
7 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
9 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