CakeFest 2024: The Official CakePHP Conference

SQLite3::createFunction

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

SQLite3::createFunctionRegistrar una función de PHP para usarla como una función escalar de SQL

Descripción

public SQLite3::createFunction(string $name, mixed $callback, int $argument_count = -1): bool

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

Parámetros

name

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

callback

El nombre de una función de PHP o una definida por el usuario para aplicarla como una llamada de retorno, definiendo el comportamiento de la función de SQL.

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 tuvo éxito, false en case de error.

Ejemplos

Ejemplo #1 Ejemplo de SQLite3::createFunction()

<?php
function mi_fdu_md5($cadena) {
return
md5($cadena);
}

$bd = new SQLite3('mibdsqlite.db');
$bd->createFunction('mi_fdu_md5', 'mi_fdu_md5');

var_dump($db->querySingle('SELECT mi_fdu_md5("prueba")'));
?>

El resultado del ejemplo sería algo similar a:

string(32) "c893bad68927b457dbed39460e6afd62"

add a note

User Contributed Notes 2 notes

up
10
koalay at gmail dot com
13 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