Files
php-doc-ru/reference/pdo_sqlite/PDO/sqliteCreateFunction.xml
2024-08-01 11:45:35 +03:00

239 lines
8.1 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f27cfeeefc13717f86a53d7fefa0ce54f7bfaaaf Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="pdo.sqlitecreatefunction" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>PDO::sqliteCreateFunction</refname>
<refpurpose>
Регистрация пользовательской функции для использования в SQL-запросах
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>PDO::sqliteCreateFunction</methodname>
<methodparam><type>string</type><parameter>function_name</parameter></methodparam>
<methodparam><type>callable</type><parameter>callback</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>num_args</parameter><initializer>-1</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>flags</parameter><initializer>0</initializer></methodparam>
</methodsynopsis>
&warn.experimental.func;
<para>
Этот метод позволяет вам регистрировать функцию PHP как пользовательскую
функцию SQLite (User Defined Function, <acronym>UDF</acronym>), что позволит
использовать её в SQL-запросах.
</para>
<para>
UDF можно использовать в любом SQL-запросе, в котором позволяется использовать
функции, например SELECT, UPDATE, а также в триггерах.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>function_name</parameter></term>
<listitem>
<para>
Имя функции для использовании в запросах.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>callback</parameter></term>
<listitem>
<para>
Функция обратного вызова для обработки вызовов SQL-функции.
</para>
<note>
<simpara>
Функция обратного вызова должна возвращать значение понятного SQLite типа
(то есть <link linkend="language.types.intro">скалярного типа</link>).
</simpara>
</note>
<para>
Эта функция должна быть определена следующим образом:
<methodsynopsis>
<type>mixed</type><methodname><replaceable>callback</replaceable></methodname>
<methodparam><type>mixed</type><parameter>value</parameter></methodparam>
<methodparam rep="repeat"><type>mixed</type><parameter>values</parameter></methodparam>
</methodsynopsis>
<variablelist>
<varlistentry>
<term><parameter>value</parameter></term>
<listitem>
<para>
Первый аргумент передаваемый в SQL-функцию.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>values</parameter></term>
<listitem>
<para>
Последующие аргументы.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>num_args</parameter></term>
<listitem>
<para>
Количество аргументов, которое принимает функция. Если задать
равным <literal>-1</literal>, то функция будет принимать любое количество аргументов.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>flags</parameter></term>
<listitem>
<para>
Побитовая конъюнкция (ИЛИ) флагов. На данный момент поддерживается
только флаг <constant>PDO::SQLITE_DETERMINISTIC</constant>, который
определяет то, что функция всегда возвращает одинаковый результат для
одинаковых входных значений.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.1.4</entry>
<entry>
Добавлен параметр <parameter>flags</parameter>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования <function>PDO::sqliteCreateFunction</function></title>
<programlisting role="php">
<![CDATA[
<?php
function md5_and_reverse($string)
{
return strrev(hash('md5', $string));
}
$db = new PDO('sqlite:sqlitedb');
$db->sqliteCreateFunction('md5rev', 'md5_and_reverse', 1);
$rows = $db->query('SELECT md5rev(filename) FROM files')->fetchAll();
?>
]]>
</programlisting>
</example>
</para>
<para>
В примере определили функцию, которая вычисляет md5-сумму строки
и переворачивает её. Когда SQL-запрос выполнится, он вернёт значение имени файла
из столбца filename, которое преобразует функция. Данные, которые вернулись
в переменную <literal>$rows</literal>, содержат преобразованный результат.
</para>
<para>
Красота этой техники заключается в том, что программисту не требуется
перебирать результаты в цикле &foreach; после запроса данных.
</para>
<!-- not for PDO it doesn't, at least not yet
<para>
PHP registers a special function named <literal>php</literal> when the
database is first opened. The php function can be used to call any PHP
function without having to register it first.
</para>
<para>
<example>
<title>Example of using the PHP function</title>
<programlisting role="php">
<![CDATA[
<?php
$rows = $db->query("SELECT php('md5', filename) from files")->fetchAll();
?>
]]>
</programlisting>
<para>
This example will call the <function>md5</function> on each
<literal>filename</literal> column in the database and return the result
into <parameter>$rows</parameter>
</para>
</example>
</para>
-->
<tip>
<para>
Вы можете использовать <xref linkend="pdo.sqlitecreatefunction" /> и
<xref linkend="pdo.sqlitecreateaggregate" /> для переопределения
стандартных агрегирующих функций SQLite.
</para>
</tip>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><xref linkend="pdo.sqlitecreateaggregate" /></member>
<member><function>sqlite_create_function</function></member>
<member><function>sqlite_create_aggregate</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->