<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.sqlite3.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'sqlite3.createaggregate.php',
    1 => 'SQLite3::createAggregate',
    2 => 'Enregistre une fonction PHP &agrave; utiliser comme fonction d\'agr&eacute;gation SQLite',
  ),
  'up' => 
  array (
    0 => 'class.sqlite3.php',
    1 => 'SQLite3',
  ),
  'prev' => 
  array (
    0 => 'sqlite3.construct.php',
    1 => 'SQLite3::__construct',
  ),
  'next' => 
  array (
    0 => 'sqlite3.createcollation.php',
    1 => 'SQLite3::createCollation',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/sqlite3/sqlite3/createaggregate.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="sqlite3.createaggregate" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">SQLite3::createAggregate</h1>
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">SQLite3::createAggregate</span> &mdash; <span class="dc-title">Enregistre une fonction PHP à utiliser comme fonction d&#039;agrégation SQLite</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-sqlite3.createaggregate-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="methodname"><strong>SQLite3::createAggregate</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$name</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$stepCallback</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$finalCallback</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$argCount</code><span class="initializer"> = -1</span></span><br>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   Enregistre une fonction PHP ou une fonction définie par l&#039;utilisateur à
   utiliser comme fonction d&#039;agrégation SQL, qui sera utilisée dans les requêtes
   SQL.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-sqlite3.createaggregate-parameters">
  <h3 class="title">Liste de paramètres</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">name</code></dt>
     <dd>
      <p class="para">
       Nom de la fonction d&#039;agrégation SQL à créer ou à redéfinir.
      </p>
     </dd>
    
    
     <dt><code class="parameter">stepCallback</code></dt>
     <dd>
      <p class="para">
       Fonction de rappel appelée pour chaque ligne dans le jeu de résultats. La
       fonction PHP devrait accumuler le résultat et stocker son contexte d&#039;agrégation.
      </p>
      <p class="para">
       Cette fonction doit être définie comme :
       <div class="methodsynopsis dc-description">
        <span class="methodname"><span class="replaceable">step</span></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$context</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$rownumber</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$value</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">...$values</code></span><br>): <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span></div>

       <dl>
        
         <dt><code class="parameter">context</code></dt>
         <dd>
          <p class="para">
           <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> pour la première ligne ; sur les lignes suivantes ceci aura la valeur
           qui a été précédemment retournée par la fonction step ; il est recommandé d&#039;utiliser
           ceci pour maintenir l&#039;état d&#039;agrégation.
          </p>
         </dd>
        
        
         <dt><code class="parameter">rownumber</code></dt>
         <dd>
          <p class="para">
           Le numéro de ligne courante.
          </p>
         </dd>
        
        
         <dt><code class="parameter">value</code></dt>
         <dd>
          <p class="para">
           Le premier argument à passer à l&#039;agrégateur.
          </p>
         </dd>
        
        
         <dt><code class="parameter">values</code></dt>
         <dd>
          <p class="para">
           Arguments supplémentaires à passer à l&#039;agrégateur.
          </p>
         </dd>
        
       </dl>
       La valeur retournée de cette fonction sera utilisée comme argument
       <code class="parameter">context</code> lors du prochain appel d&#039;une fonction
       d&#039;étape ou finale.
      </p>
     </dd>
    
    
     <dt><code class="parameter">finalCallback</code></dt>
     <dd>
      <p class="para">
       Fonction de rappel pour agréger les &quot;étapes&quot; de données de chaque ligne.
       Une fois que toutes les lignes ont été traitées, la fonction sera appelée,
       prendra les données du contexte d&#039;agrégation et retournera le résultat.
       La fonction de rappel doit retourner un type compris par SQLite
       (c.-à-d. un <a href="language.types.intro.php" class="link">type scalaire</a>).
      </p>
      <p class="para">
       Cette fonction doit être définie comme :
       <div class="methodsynopsis dc-description">
        <span class="methodname"><span class="replaceable">fini</span></span>(<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$context</code></span>, <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$rownumber</code></span>): <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span></div>

       <dl>
        
         <dt><code class="parameter">context</code></dt>
         <dd>
          <p class="para">
           Contient la valeur de retour du tout dernier appel à la fonction step.
          </p>
         </dd>
        
        
         <dt><code class="parameter">rownumber</code></dt>
         <dd>
          <p class="para">
           Toujours <code class="literal">0</code>.
          </p>
         </dd>
        
       </dl>
       La valeur de retour de cette fonction sera utilisée comme valeur de retour pour
       l&#039;agrégation.
      </p>
     </dd>
    
    
     <dt><code class="parameter">argCount</code></dt>
     <dd>
      <p class="para">
       Le nombre d&#039;arguments pris par la fonction d&#039;agrégation SQL.
       Si ce nombre est négatif, alors la fonction d&#039;agrégation SQL
       pourra prendre un nombre non défini d&#039;arguments.
      </p>
     </dd>
    
   </dl>
  </p>

 </div>


 <div class="refsect1 returnvalues" id="refsect1-sqlite3.createaggregate-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   Retourne <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> si la création de l&#039;agrégat a réussi,  ou <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si une erreur survient.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-sqlite3.createaggregate-examples">
  <h3 class="title">Exemples</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Exemple #1 Exemple d&#039;une fonction d&#039;agrégation avec max_length</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$data </span><span style="color: #007700">= array(<br />   </span><span style="color: #DD0000">'one'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'two'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'three'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'four'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'five'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'six'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'seven'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'eight'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'nine'</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">'ten'</span><span style="color: #007700">,<br />   );<br /></span><span style="color: #0000BB">$db </span><span style="color: #007700">= new </span><span style="color: #0000BB">SQLite3</span><span style="color: #007700">(</span><span style="color: #DD0000">':memory:'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exec</span><span style="color: #007700">(</span><span style="color: #DD0000">"CREATE TABLE strings(a)"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$insert </span><span style="color: #007700">= </span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prepare</span><span style="color: #007700">(</span><span style="color: #DD0000">'INSERT INTO strings VALUES (?)'</span><span style="color: #007700">);<br />foreach (</span><span style="color: #0000BB">$data </span><span style="color: #007700">as </span><span style="color: #0000BB">$str</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$insert</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bindValue</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">$str</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$insert</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">();<br />}<br /></span><span style="color: #0000BB">$insert </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">max_len_step</span><span style="color: #007700">(</span><span style="color: #0000BB">$context</span><span style="color: #007700">, </span><span style="color: #0000BB">$rownumber</span><span style="color: #007700">, </span><span style="color: #0000BB">$string</span><span style="color: #007700">) <br />{<br />    if (</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$string</span><span style="color: #007700">) &gt; </span><span style="color: #0000BB">$context</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$context </span><span style="color: #007700">= </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$string</span><span style="color: #007700">);<br />    }<br />    return </span><span style="color: #0000BB">$context</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">max_len_finalize</span><span style="color: #007700">(</span><span style="color: #0000BB">$context</span><span style="color: #007700">, </span><span style="color: #0000BB">$rownumber</span><span style="color: #007700">) <br />{<br />    return </span><span style="color: #0000BB">$context </span><span style="color: #007700">=== </span><span style="color: #0000BB">null </span><span style="color: #007700">? </span><span style="color: #0000BB">0 </span><span style="color: #007700">: </span><span style="color: #0000BB">$context</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">createAggregate</span><span style="color: #007700">(</span><span style="color: #DD0000">'max_len'</span><span style="color: #007700">, </span><span style="color: #DD0000">'max_len_step'</span><span style="color: #007700">, </span><span style="color: #DD0000">'max_len_finalize'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$db</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">querySingle</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT max_len(a) from strings'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">int(5)</pre>
</div>
    </div>
   </div>
  </p>
  <p class="para">
   Dans cet exemple, on crée une fonction agrégative qui va calculer la
   longueur de la plus grande chaîne de caractères dans une des colonnes de la
   table. Pour chaque ligne, la fonction <code class="literal">max_len_step</code> est
   appelée et le paramètre <code class="literal">$context</code> est passé. Le
   paramètre de contexte est comme n&#039;importe quelle autre variable PHP et
   doit être fixé pour contenir un tableau ou même, un objet. Dans cet exemple,
   nous l&#039;utilisons pour contenir la taille maximale que nous avons vu jusqu&#039;à
   présent ; si le paramètre <code class="literal">$string</code> a une grandeur plus
   importante que celle courante, on met à jour le contexte pour contenir cette
   nouvelle taille maximale.
  </p>
  <p class="para">
   Une fois que toutes les lignes ont été traitées, SQLite appelle la fonction
   <code class="literal">max_len_finalize</code> pour déterminer le résultat agrégatif.
   Ici, nous pourrions effectuer des calculs basés sur les données trouvées
   dans <code class="literal">$context</code>. Dans notre exemple simple, nous avons
   calculé le résultat comme si la requête progressait, alors que nous avons
   simplement besoin de retourner la valeur de contexte.
  </p>
  <div class="tip"><strong class="tip">Astuce</strong>
   <p class="para">
    Il n&#039;est PAS recommandé d&#039;enregistrer une copie des valeurs dans le contexte
    pour finalement les traiter. Dans ce cas, SQLite utiliserait beaucoup trop
    de mémoire pour traiter la requête - imaginez la quantité de mémoire nécessaire
    si un million de lignes étaient enregistrées en mémoire, sachant que chaque ligne
    contient une chaîne de caractères (32 octets par chaîne).
   </p>
  </div>
  <div class="tip"><strong class="tip">Astuce</strong>
   <p class="para">
    Il est possible d&#039;utiliser <span class="methodname"><strong>SQLite3::createAggregate()</strong></span> pour surcharger les
    fonctions natives de SQLite.
   </p>
  </div>
 </div>


</div><?php manual_footer($setup); ?>