Pdo\Sqlite::createAggregate: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
(Skapade sidan med '== Pdo\Sqlite::createAggregate == '''(PHP 8 >= 8.4.0)''' Pdo\Sqlite::createAggregate — Registrerar en aggregerande användardefinierad funktion för användning i SQL-frågor. === Beskrivning === '''public Pdo\Sqlite::createAggregate( string $name, callable $step, callable $finalize, int $numArgs = -1 ): bool''' Denna metod liknar Pdo\Sqlite::createFunction men registrerar funktioner som används för att beräkna resultat aggregerade över alla...')
 
Ingen redigeringssammanfattning
 
(En mellanliggande sidversion av samma användare visas inte)
Rad 2: Rad 2:
'''(PHP 8 >= 8.4.0)'''
'''(PHP 8 >= 8.4.0)'''


Pdo\Sqlite::createAggregate — Registrerar en aggregerande användardefinierad funktion för användning i SQL-frågor.
Pdo\Sqlite::createAggregate — Registrerar en aggregerande användardefinierad funktion för användning i SQL-frågor


=== Beskrivning ===
=== Beskrivning ===
Rad 12: Rad 12:
): bool'''
): bool'''


Denna metod liknar [[Pdo\Sqlite::createFunction]] men registrerar funktioner som används för att beräkna resultat aggregerade över alla rader i en fråga. Skillnaden är att två funktioner krävs: en för att ackumulera data (step) och en för att slutföra beräkningen (finalize).
Den här metoden liknar [[Pdo\Sqlite::createFunction]] förutom att den registrerar funktioner som kan användas för att beräkna ett resultat aggregerat över alla rader i en fråga.


'''Tips:''' Genom att använda denna metod kan inbyggda SQL-funktioner åsidosättas.
Den största skillnaden mellan den här metoden och [[Pdo\Sqlite::createFunction]] är att två funktioner krävs för att hantera aggregeringen.
 
'''Tips'''
Genom att använda den här metoden är det möjligt att åsidosätta inbyggda SQL-funktioner.


=== Parametrar ===
=== Parametrar ===
; name   
; name   
: Namnet på funktionen som ska användas i SQL-frågor.
: Namnet på funktionen som används i SQL-frågor.


; step   
; step   
: Callback-funktion som anropas för varje rad i resultatmängden. Den ska ackumulera resultatet och lagra det i aggregeringskontexten.   
: Callback-funktion som anropas för varje rad i resultatmängden. Callback-funktionen bör ackumulera resultatet och lagra det i aggregeringskontexten.   
: Funktionens definition:
Den här funktionen måste definieras så här:
 
<pre>
<pre>
step(
step(
Rad 31: Rad 36:
): mixed
): mixed
</pre>
</pre>
: '''context:''' Första gången null, därefter värdet från den senaste step-funktionen.
 
: '''rownumber:''' Radens nummer.
'''context'''
: '''value:''' Det första argumentet som skickas till aggregeringen.
''null'' för den första raden; vid efterföljande rader kommer det att ha värdet som tidigare returnerades från step-funktionen; du bör använda detta för att upprätthålla tillståndet för aggregeringen.
: '''values:''' Ytterligare argument som skickas till aggregeringen.
 
: Returnerade värdet används som ''context'' vid nästa anrop av step eller finalize.
'''rownumber'''
Det aktuella radnumret.
 
'''value'''
Det första argumentet som skickas till aggregeringen.
 
'''values'''
Fler argument som skickas till aggregeringen.
 
Returvärdet för den här funktionen kommer att användas som context-argument i nästa anrop av step- eller finalize-funktionerna.


; finalize   
; finalize   
: Callback-funktion som aggregerar det ackumulerade data från varje rad.   
: Callback-funktion för att aggregera den ”uppstegade” datan från varje rad. När alla rader har bearbetats kommer den här funktionen att anropas, och den bör då ta datan från aggregeringskontexten och returnera resultatet. Den här callback-funktionen bör returnera en typ som SQLite förstår (d.v.s. en skalär typ).   
: Funktionens definition:
Den här funktionen måste definieras så här:
 
<pre>
<pre>
fini(mixed $context, int $rowcount): mixed
fini(mixed $context, int $rowcount): mixed
</pre>
</pre>
: '''context:''' Håller värdet från sista anropet till step-funktionen.
 
: '''rowcount:''' Antal rader över vilka aggregeringen gjordes.
'''context'''
: Returnerade värdet används som aggregeringens slutresultat.
Innehåller returvärdet från det allra sista anropet till step-funktionen.
 
'''rowcount'''
Innehåller antalet rader över vilka aggregeringen utfördes.
 
Returvärdet för den här funktionen kommer att användas som returvärde för aggregeringen.


; numArgs   
; numArgs   
: En indikation för SQLite-parsaren om hur många argument funktionen accepterar.
: En antydan till SQLite-parsern om callback-funktionen tar ett förutbestämt antal argument.


=== Returvärden ===
=== Returvärden ===
Returnerar ''true'' vid framgång eller ''false'' vid misslyckande.
Returnerar true vid framgång eller false vid misslyckande.


=== Exempel ===
=== Exempel ===


==== Exempel 1: Skapa en aggregerande funktion ====
==== Exempel #1 Pdo\Sqlite::createAggregate()-exempel ====
I det här exemplet skapar vi en anpassad aggregeringsfunktion som heter max_length och som kan användas i SQL-frågor.
 
I det här exemplet skapar vi en aggregerande funktion, kallad max_length, som beräknar längden på den längsta strängen i en av kolumnerna i tabellen. För varje rad anropas funktionen max_len_step och får en parameter $context. Parametern context fungerar som vilken annan PHP-variabel som helst och kan sättas till att innehålla en array eller till och med ett objekt. I det här exemplet använder vi den för att spara det maximala längdvärdet vi har sett hittills; om $string har en längd som är längre än det nuvarande maximala värdet uppdaterar vi context för att innehålla detta nya maximala värde.
 
När alla rader har bearbetats anropar SQLite funktionen max_len_finalize för att bestämma det aggregerade resultatet. Det är möjligt att utföra någon form av beräkning baserat på data i $context. I det här grundläggande exemplet beräknades resultatet medan frågan fortskred, så context-värdet kan returneras direkt.
 
<pre>
<pre>
Run code
<?php
<?php
$data = [
$data = [
Rad 74: Rad 101:
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
foreach ($data as $str) {
foreach ($data as $str) {
     $insert->execute([$str]);
     $insert->execute(array($str));
}
}
$insert = null;
$insert = null;
Rad 93: Rad 120:
$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');
$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');


var_dump($db->query('SELECT max_len(a) FROM strings')->fetchAll());
var_dump($db->query('SELECT max_len(a) from strings')->fetchAll());
?>
?>
</pre>
</pre>


Utdata:
=== Tips ===
<pre>
Det rekommenderas INTE att du sparar en kopia av värdena i context och sedan bearbetar dem i slutet, då du skulle få SQLite att använda mycket minne för att behandla frågan – tänk bara på hur mycket minne som skulle krävas om en miljon rader sparades i minnet, var och en med en sträng på 32 byte i längd.
array(1) {
  [0]=>
  array(1) {
    ["max_len(a)"]=>
    int(5)
  }
}
</pre>
 
'''Tips:''' Försök inte lagra en kopia av alla värden i kontexten och bearbeta dem i slutet, då detta kan orsaka att SQLite använder mycket minne för att behandla frågan.


=== Se även ===
=== Se även ===
* [[Pdo\Sqlite::createFunction]] Registrerar en användardefinierad funktion för användning i SQL-frågor.  
* [[Pdo\Sqlite::createFunction]] - Registrerar en användardefinierad funktion för användning i SQL-frågor   
* [[Pdo\Sqlite::createCollation]] Registrerar en användardefinierad funktion som kollationsfunktion i SQL-frågor.  
* [[Pdo\Sqlite::createCollation]] - Registrerar en användardefinierad funktion för användning som kollationsfunktion i SQL-frågor   
* sqlite_create_function()   
* sqlite_create_function()   
* sqlite_create_aggregate()
* sqlite_create_aggregate()

Nuvarande version från 23 december 2024 kl. 06.47

Pdo\Sqlite::createAggregate

(PHP 8 >= 8.4.0)

Pdo\Sqlite::createAggregate — Registrerar en aggregerande användardefinierad funktion för användning i SQL-frågor

Beskrivning

public Pdo\Sqlite::createAggregate(

   string $name,
   callable $step,
   callable $finalize,
   int $numArgs = -1

): bool

Den här metoden liknar Pdo\Sqlite::createFunction förutom att den registrerar funktioner som kan användas för att beräkna ett resultat aggregerat över alla rader i en fråga.

Den största skillnaden mellan den här metoden och Pdo\Sqlite::createFunction är att två funktioner krävs för att hantera aggregeringen.

Tips Genom att använda den här metoden är det möjligt att åsidosätta inbyggda SQL-funktioner.

Parametrar

name
Namnet på funktionen som används i SQL-frågor.
step
Callback-funktion som anropas för varje rad i resultatmängden. Callback-funktionen bör ackumulera resultatet och lagra det i aggregeringskontexten.

Den här funktionen måste definieras så här:

step(
    mixed $context,
    int $rownumber,
    mixed $value,
    mixed ...$values
): mixed

context null för den första raden; vid efterföljande rader kommer det att ha värdet som tidigare returnerades från step-funktionen; du bör använda detta för att upprätthålla tillståndet för aggregeringen.

rownumber Det aktuella radnumret.

value Det första argumentet som skickas till aggregeringen.

values Fler argument som skickas till aggregeringen.

Returvärdet för den här funktionen kommer att användas som context-argument i nästa anrop av step- eller finalize-funktionerna.

finalize
Callback-funktion för att aggregera den ”uppstegade” datan från varje rad. När alla rader har bearbetats kommer den här funktionen att anropas, och den bör då ta datan från aggregeringskontexten och returnera resultatet. Den här callback-funktionen bör returnera en typ som SQLite förstår (d.v.s. en skalär typ).

Den här funktionen måste definieras så här:

fini(mixed $context, int $rowcount): mixed

context Innehåller returvärdet från det allra sista anropet till step-funktionen.

rowcount Innehåller antalet rader över vilka aggregeringen utfördes.

Returvärdet för den här funktionen kommer att användas som returvärde för aggregeringen.

numArgs
En antydan till SQLite-parsern om callback-funktionen tar ett förutbestämt antal argument.

Returvärden

Returnerar true vid framgång eller false vid misslyckande.

Exempel

Exempel #1 Pdo\Sqlite::createAggregate()-exempel

I det här exemplet skapar vi en anpassad aggregeringsfunktion som heter max_length och som kan användas i SQL-frågor.

I det här exemplet skapar vi en aggregerande funktion, kallad max_length, som beräknar längden på den längsta strängen i en av kolumnerna i tabellen. För varje rad anropas funktionen max_len_step och får en parameter $context. Parametern context fungerar som vilken annan PHP-variabel som helst och kan sättas till att innehålla en array eller till och med ett objekt. I det här exemplet använder vi den för att spara det maximala längdvärdet vi har sett hittills; om $string har en längd som är längre än det nuvarande maximala värdet uppdaterar vi context för att innehålla detta nya maximala värde.

När alla rader har bearbetats anropar SQLite funktionen max_len_finalize för att bestämma det aggregerade resultatet. Det är möjligt att utföra någon form av beräkning baserat på data i $context. I det här grundläggande exemplet beräknades resultatet medan frågan fortskred, så context-värdet kan returneras direkt.

Run code
<?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());
?>

Tips

Det rekommenderas INTE att du sparar en kopia av värdena i context och sedan bearbetar dem i slutet, då du skulle få SQLite att använda mycket minne för att behandla frågan – tänk bara på hur mycket minne som skulle krävas om en miljon rader sparades i minnet, var och en med en sträng på 32 byte i längd.

Se även

  • Pdo\Sqlite::createFunction - Registrerar en användardefinierad funktion för användning i SQL-frågor
  • Pdo\Sqlite::createCollation - Registrerar en användardefinierad funktion för användning som kollationsfunktion i SQL-frågor
  • sqlite_create_function()
  • sqlite_create_aggregate()

Sidslut

Orginalhemsidan på Engelska :https://www.php.net/manual/en/pdo-sqlite.createaggregate.php
PHP Funktioner Funktionsreferens Databas-tillägg


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp Huddinge som har sponsrat Linux.se med webbhotell.