PHP 8.4.2 Released!

SQLite3::createFunction

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

SQLite3::createFunctionEnregistre une fonction PHP à utiliser comme fonction scalaire SQL

Description

public SQLite3::createFunction(
    string $name,
    callable $callback,
    int $argCount = -1,
    int $flags = 0
): bool

Enregistre une fonction PHP ou une fonction utilisateur à utiliser comme fonction scalaire SQL, pour utilisation dans les requête SQL.

Liste de paramètres

name

Nom de la fonction SQL à créer ou à redéfinir.

callback

Le nom de la fonction PHP ou la fonction utilisateur à appliquer comme callback, définissant le comportement de la fonction SQL.

Cette fonction doit être définit comme :

callback(mixed $value, mixed ...$values): mixed
value

Le premier argument à passer à la fonction SQL.

values

Arguments supplémentaires à passer à la fonction SQL.

argCount

Nombre d'arguments que la fonction SQL prend. Si ce paramètre est -1, la fonction SQL peut prendre n'importe quel nombre d'arguments.

flags

Une conjonction d'opérations de bits d'indicateurs. Actuellement, seul SQLITE3_DETERMINISTIC est pris en charge, ce qui spécifie que la fonction retourne toujours le même résultat étant donné les mêmes entrées dans une seule instruction SQL.

Valeurs de retour

Retourne true si la fonction a été créée avec succès, false si une erreur survient.

Historique

Version Description
7.1.4 Le paramètre flags a été ajouté.

Exemples

Exemple #1 Exemple avec SQLite3::createFunction()

<?php
function my_udf_md5($string) {
return
hash('md5', $string);
}

$db = new SQLite3('mysqlitedb.db');
$db->createFunction('my_udf_md5', 'my_udf_md5');

var_dump($db->querySingle('SELECT my_udf_md5("test")'));
?>

Résultat de l'exemple ci-dessus est similaire à :

string(32) "098f6bcd4621d373cade4e832627b4f6"

add a note

User Contributed Notes 2 notes

up
9
koalay at gmail dot com
14 years ago
Since regular expression is not supported by default SQLite, we can create a user function to do the job.

<?php

$db
= new SQLite3("database.sqlit3", 0666);

// create a function named "preg_match"
// with the php core function "preg_match"
if ($db->createFunction("preg_match", "preg_match", 2) === FALSE)
exit(
"Failed creating function\n");

// this query will then works as expected
$result = $db->query("SELECT * FROM table1 WHERE
preg_match('/^(apple|orange)$/', variable1)"
);

?>
up
-1
bohwaz
12 years ago
In PHP 5.4 there will be a createCollation method to use your custom collation method, to be able to sort datasets using unicode, like this:

<?php
setlocale
(LC_COLLATE, 'fr_FR.UTF-8');
$db->createCollation('PHP_COLLATE', 'strcoll');

$db->query('SELECT * FROM my_table ORDER BY name COLLATE PHP_COLLATE;');
?>

But until this cool feature becomes available, you'll have to do some tricks, like this for french:

<?php
function sqlite3_to_ascii($str, $charset = 'UTF-8')
{
// Don't process empty strings
if (!trim($str))
return
$str;

// We only process non-ascii strings
if (preg_match('!^[[:ascii:]]+$!', $str))
return
$str;

$str = htmlentities($str, ENT_NOQUOTES, $charset);

$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
$str = preg_replace('#&[^;]+;#', '', $str);

return
$str;
}

$db->createFunction('to_ascii', 'sqlite3_to_ascii', 1);
$res = $db->query('SELECT * FROM test ORDER BY to_ascii(text);');
?>

This will convert non-ascii characters to ascii ones before collation. In fact this won't work with non-latin languages, but for latin-languages it's better than nothing.

Please note that this will slow down about 1.8 times the query (tested on a 10.000 rows table).
To Top