Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 70 · После первых запросов Firebird

Firebird в PHP: установка, действующие настройки и константы без угадывания

От совместимого расширения до настоящего SELECT: действующая конфигурация, временные форматы дат, именованные флаги и полный указатель функций Firebird.

От программы PHP до прочитанного товара

Вам нужен сайт или фоновый импорт, который читает Firebird. Сначала соберём совместимую цепочку: PHP выполняет код; расширение interbase добавляет функции ibase_*; клиентская библиотека передаёт обращения; движок Firebird открывает базу и исполняет SQL. Доступность каждого следующего звена проверяется отдельно. В конце этой главы вы увидите товар Cable с остатком 3, сравните запуск с модулем и без него и получите две формы одной даты доставки.

Один запрос, четыре разных компонента
  1. example.php → исполняющий PHP (версия, SAPI, TS/NTS)
  2. interbase → функции ibase_connect / ibase_query
  3. fbclient → клиентские библиотеки и выбранный транспорт
  4. Firebird → собственная учебная .fdb → SELECT TITLE,QTY
  5. Cable / 3 → PHP-массив → видимый HTML-отчёт

Аналогия — рабочее место, переходник и нужный прибор: наличие переходника не доказывает, что вы подключились к правильному прибору. Здесь она объясняет границы проверки, а не внутреннее устройство протокола или памяти базы. Для сетевого подключения сервер может находиться на другом компьютере; в нашей лаборатории движок embedded работает локально. Это два способа размещения, а не два разных SQL-языка.

Проверяемый слойЧто получитьЧего это ещё не доказывает
PHPВерсия, SAPI, разрядность, TS/NTSЧто загружено interbase или настроен сайт.
PHP-расширениеextension_loaded, function_exists, phpversionЧто найден fbclient и открывается нужная база.
Клиент/движокЗависимости доступны; Services API сообщает версиюЧто нужная таблица и её данные существуют.
Прикладной SQLОграниченный SELECT вернул Cable и 3Что проверены все таблицы, производительность и резервная копия.

Проверенный комплект этой главы: PHP 8.2.35 NTS x64, FirebirdSQL interbase 3.0.1, Firebird 5.0.4 embedded SuperClassic. Это закреплённые версии для воспроизведения, не перечень последних выпусков. До PHP 7.4 расширение входило в исходный PHP; с PHP 7.4 его вынесли из основной поставки в PECL. Поддерживаемый исходник находится у FirebirdSQL. Поэтому старая строка «PHP 5 / PHP 7» на странице функции не означает, что современный PHP загрузит её без отдельного модуля.

Для первого знакомства с переменными и вызовом функций откройте переменные и функции. Непосредственно соединение и SELECT разобраны в первых запросах Firebird. Здесь мы объясняем, как сделать эти функции доступными и как прочитать действующие настройки, а не требуем угадывать их по ошибке.

Установка: версии, зависимости, Windows и Unix

Начните с того PHP, который будет выполнять задачу. В Windows могут одновременно существовать PHP из веб-сборки, отдельная консоль и путь планировщика. Вызов php по PATH может выбрать другой файл. В лаборатории README задаёт абсолютный $phpExe и отдельную папку компонентов, не меняя глобальную конфигурацию компьютера.

"C:\Tools\php82-firebird\php.exe" -v
"C:\Tools\php82-firebird\php.exe" --ini
"C:\Tools\php82-firebird\php.exe" -m

Это шаблоны команд для командной строки Windows: замените путь своим. -v показывает версию PHP, --ini — выбранные файлы конфигурации, -m — модули именно этого запуска. В PowerShell для пути в кавычках используйте оператор вызова &: & $phpExe --ini. Эти команды не создают базу. Для сайта проверяют тот же набор сведений внутри закрытого диагностического обработчика его SAPI, после чего обработчик удаляют; не оставляют phpinfo открытым посетителям.

ШагЧто сделатьПроверяемый итог
Windows: выбрать расширениеИспользовать сборку под тот же PHP major.minor, архитектуру x86/x64, TS/NTS, ABI/компилятор. Пакет из другой ветки PHP нельзя исправить переименованием DLL.Загрузчик принимает совместимый php_interbase.dll.
Windows: зависимостиКлиентские DLL Firebird должны быть доступны процессу. Официальная историческая инструкция упоминает fbclient.dll и совместимое имя gds32.dll; gds32 относится к старой совместимости, а не к обязательному второму независимому серверу.Нет startup-ошибки о недостающей DLL.
Windows: подключить модульРазместить модуль в выбранном extension_dir и указать extension=interbase либо точный путь DLL для контролируемого запуска. В README используется -n -d extension=… .extension_loaded("interbase") возвращает true.
Linux/Unix: подготовить сборкуНужны клиент Firebird, заголовки разработки и инструменты сборки расширения для конкретного PHP: phpize, подходящий php-config и компилятор.Расширение собрано для нужного ABI, а не для соседнего PHP.
Linux/Unix: подключить .soУстановить interbase.so в каталог модулей выбранного PHP и включить его в конфигурации требуемого SAPI.CLI/веб-процесс действительно видит interbase.
ПерезапускПосле изменения серверного php.ini перезапустить/перезагрузить соответствующие PHP workers или веб-службу по её процедуре. Новый CLI читает настройки при старте.Проверка относится к новым процессам с новой конфигурацией.
SQL-проверкаПодключиться к отдельной учебной базе и выбрать конкретную строку.Название Cable и остаток 3, а не только слово loaded.

Исторический способ сборки встроенного расширения: configure с --with-interbase[=DIR], при отсутствии DIR использовался /usr. Для отдельного поддерживаемого исходника выполняют phpize, ./configure с нужным --with-php-config и --with-interbase, затем make и установку модуля. Точные пути и пакеты разработки зависят от дистрибутива. Команды из старой заметки для PHP 7.4 нельзя механически переносить на любой PHP 8.x. Актуальная общая страница PHP об установке расширений указывает переход экосистемы от PECL к PIE; наличие архивного PECL-пакета 3.0.1 здесь — способ воспроизведения, не обещание поддержки любого нового установщика для этого модуля.

В нашей лаборатории fbclient и embedded-движок берутся из отдельного Firebird 5.0.4; Providers=Engine13 и ServerMode=SuperClassic относятся только к нему. База создаётся из приложенного синтетического backup под новым именем fb159_*. Настройка сервера пользователя, security database и служба Windows не меняются. Для реального сетевого сервера потребуются его адрес, согласованный charset, права и учётная запись; пустой пароль локальной embedded-лаборатории не является образцом сетевой авторизации.

Если модуль не загрузился, сначала изучают startup stderr и выбранный ini, затем зависимости/совместимость. Если ibase_connect уже существует, но сервер отклоняет кодировку или пароль, загрузка функции состоялась: это другой этап. Подробная пара реальных запусков находится в диагностике без расширения и с расширением.

Все десять настроек interbase и их область действия

php.ini — файл исходных настроек процесса; действующее значение может отличаться от записи в другом файле или от значения после ini_set. INI_SYSTEM означает настройку на системном/серверном уровне, а не изменение произвольным ini_set в скрипте. INI_ALL допускает изменение во время выполнения, если оно не запрещено конфигурацией более высокого уровня. Точные используемые файлы показывают php_ini_loaded_file и php_ini_scanned_files: false означает отсутствие соответствующего файла, а не ошибку SQL.

ДирективаБазовое значениеГде меняетсяЗачем и какие границы
ibase.allow_persistent1INI_SYSTEMРазрешение постоянных соединений. Если выключено, pconnect в этом драйвере переходит на обычный способ подключения. Не означает, что любое соединение станет постоянным.
ibase.max_persistent-1INI_SYSTEMЗадуманный максимум постоянных соединений одного процесса; -1 означает отсутствие этого ограничения. Для 3.0.1 есть отдельная оговорка ниже. Это не размер общего пула всех PHP-процессов.
ibase.max_links-1INI_SYSTEMЗадуманный предел всех соединений процесса, включая постоянные. -1 снимает ограничение расширения, но не ограничения ОС/сервера. Не увеличивайте предел вместо закрытия ненужных ресурсов.
ibase.default_dbNULLINI_SYSTEMБаза по умолчанию, когда аргумент database отсутствует. Для переносимого приложения понятнее явно задать нужную базу. Упоминание SQL safe mode на исторической странице не создаёт такой режим в PHP 8.2.
ibase.default_userNULLINI_ALLПользователь по умолчанию, если он не передан подключению. Это не самостоятельная система авторизации сайта.
ibase.default_passwordNULLINI_ALLПароль по умолчанию. Не выводите эту строку в диагностический HTML/JSON и не храните реальные пароли в скачиваемом примере.
ibase.default_charsetNULLINI_ALLКодировка соединения по умолчанию. Нужен идентификатор Firebird, например UTF8, а не произвольная HTML-метка UTF-8. Явный charset в connect делает контракт видимым.
ibase.timestampformat%Y-%m-%d %H:%M:%SINI_ALLСтроковое представление SQL TIMESTAMP: дата и время. Директивы относятся к strftime. Ввод параметров дополнительно зависит от ветки сборки драйвера.
ibase.dateformat%Y-%m-%dINI_ALLПредставление SQL DATE: календарная дата. Не добавляет время или часовой пояс к типу базы.
ibase.timeformat%H:%M:%SINI_ALLПредставление SQL TIME: время суток. Если убрать %S из вывода, сохранённые секунды от этого не исчезнут.

NULL в таблице означает отсутствие заданного значения по умолчанию, а не строку "NULL" для пароля или имени файла. Явные аргументы соединения удобны, когда приложению важно однозначно выбрать базу и charset. Не выводите весь ini_get_all без отбора: default_password и служебные пути не предназначены для общего доступа.

$settings = ini_get_all("interbase");
if (!is_array($settings)) { throw new RuntimeException("Настройки расширения недоступны"); }
$format = $settings["ibase.dateformat"];
echo $format["global_value"], " → ", $format["local_value"];

global_value — исходное значение этого процесса, local_value — действующее в текущем выполнении; access описывает разрешённый уровень изменения. Не сравнивайте их с настройками другого SAPI. Практический отчёт доставки сохраняет предыдущие значения, проверяет возврат ini_set и восстанавливает всё через finally.

Для max_persistent есть важное отличие намерения документации от исходника именно 3.0.1: выражение присваивания при проверке ограничения получает логический результат сравнения с -1. Поэтому нельзя обучать эту сборку как безошибочную реализацию любого заданного числового лимита. Числовые лимиты не испытывались в данном пакете. Подробности границ, ключа повторного использования и жизненного цикла находятся в главе постоянных соединений. Ограничение не превращает множество workers в один общий пул.

Три форматирующие директивы используют шаблоны C strftime. На возврате DATE/TIME/TIMESTAMP это подтверждено работающим примером. В исходнике входные строки имеют разные ветви при наличии HAVE_STRPTIME; без неё драйвер может передать строку на разбор Firebird. Поэтому оформление для человека и контракт ввода в SQL нужно разделять. Не подставляйте отформатированную дату конкатенацией в запрос.

Как запустить самостоятельные примеры

В каждом ZIP есть example.php, lab.php, README и синтетический шаблон базы с исходным seed.sql. Один запуск создаёт одну собственную базу, сохраняет result.html/result.json, закрывает подключения и удаляет только зарегистрированные учебные файлы. В шаблоне Cable/3 и Clamp/0. f159* — открытый вспомогательный код лаборатории: создание базы, немедленная диагностика, ограниченное чтение и проверяемое завершение. Он не является частью расширения PHP.

Для сравнения расширений добавлены process-lab.php и capability-child.php; перед запуском укажите PHPMAN_FIREBIRD_EXTENSION из README. Эти два процесса не соединяются с базой. Все программы рассчитаны на закреплённый изолированный комплект, не на ваши рабочие базы. Короткие фрагменты показывают один шаг; самостоятельный полный файл содержит все проверки и освобождение ресурсов.

Паспорт приложения: какой PHP действительно прочитал товар

После переноса сайта появляется ошибка подключения. Сначала выясним, какой именно PHP запустил программу, какое расширение он загрузил и какой движок ответил. Затем прочитаем название Cable и остаток 3: наличие модуля само по себе ещё не доказывает, что SQL работает.

Путь данных
  1. PHP_VERSION/PHP_SAPI → версия и способ запуска
  2. phpversion(interbase) → версия PHP-модуля
  3. Services API → версия выбранного движка
  4. Собственная база → WHERE ID=1 → Cable, 3
  5. Отчёт сохраняет сведения; соединение и учебная база освобождаются

Минимальный шаг

echo PHP_VERSION, "\n";
echo PHP_SAPI, "\n";
echo extension_loaded("interbase") ? "interbase загружен" : "interbase отсутствует";

PHP_VERSION — строка версии выполняющегося интерпретатора. PHP_SAPI показывает его интерфейс: здесь cli, на сайте возможны другие значения. extension_loaded проверяет модуль, а phpversion("interbase") — его версию. Это разные вопросы. Полная программа создаёт из шаблона две синтетические строки, передаёт ID параметром и получает только нужные TITLE/QTY.

Видимый результат

НаблюдениеРезультат
Версия PHP8.2.35
Способ запускаcli
Разрядность PHP64
Thread Safeнет
Версия расширения3.0.1
Версия подключённого движкаWI-V5.0.4.1812 Firebird 5.0
Название товараCable
Остаток3
Паспорт приложения: какой PHP действительно прочитал товарСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/lab.php';
$owned=[];$removed=[];$db=$service=null;
try {
    $config=f159Config();$service=f159Service();$runtime=f159Runtime($service);

    $database=f159CreateDatabase($service,$owned,'passport');
    $db=f159Connect($database);
    $product=f159Read($db,'SELECT TITLE AS "title",QTY AS "qty" FROM LAB_ITEMS WHERE ID=?',[1])[0];
    $phpInfo=['php'=>PHP_VERSION,'sapi'=>PHP_SAPI,'bits'=>PHP_INT_SIZE*8,
        'thread_safe'=>(bool)PHP_ZTS,'extension'=>phpversion('interbase'),
        'function_exists'=>function_exists('ibase_connect')];
    f159Close($db);
    $rows=[['Версия PHP',$phpInfo['php']],['Способ запуска',$phpInfo['sapi']],['Разрядность PHP',$phpInfo['bits']],
        ['Thread Safe',$phpInfo['thread_safe']],['Версия расширения',$phpInfo['extension']],
        ['Версия подключённого движка',$runtime['server_version']],['Название товара',$product['title']],['Остаток',$product['qty']]];
    $checks=['php_profile'=>$phpInfo['php']==='8.2.35' && $phpInfo['sapi']==='cli' && $phpInfo['bits']===64 && $phpInfo['thread_safe']===false,
        'extension_loaded'=>$phpInfo['extension']==='3.0.1' && $phpInfo['function_exists'],
        'server_observed'=>str_contains($runtime['server_version'],'V5.0.4.'),
        'actual_query'=>$product===['title'=>'Cable','qty'=>3],'closed'=>$db===null];
    $observations=['php'=>$phpInfo,'server'=>$runtime['server_version'],'selected'=>$product,
        'query'=>'SELECT TITLE,QTY FROM LAB_ITEMS WHERE ID=?','parameter'=>1,
        'client_library_version_not_inferred_from_php_extension'=>true,'web_sapi_not_tested_by_cli'=>true];

} finally {
    if(is_resource($db)){f159Close($db);}
    if(is_resource($service)){f159Detach($service);}
    $removed=f159Cleanup($owned);
}

f159Report('fb159-runtime-passport','Паспорт приложения: какой PHP действительно прочитал товар',$rows,$checks,$observations,$runtime,$owned,$removed);
Ожидаемый результат
Версия PHP — 8.2.35
Способ запуска — cli
Разрядность PHP — 64
Thread Safe — нет
Версия расширения — 3.0.1
Версия подключённого движка — WI-V5.0.4.1812 Firebird 5.0
Название товара — Cable
Остаток — 3

Самостоятельная программа с README, одной собственной учебной базой и реальным SQL. После запуска откройте result.html; данные и наблюдения также записаны в result.json.

HTML-результат · JSON с наблюдениями.

Ошибки и границы применения

Версии PHP, расширения interbase, клиентской библиотеки fbclient и движка Firebird нельзя подменять друг другом. Номер ODS относится к формату файла базы. Строка server_version в этой лаборатории — ответ локального embedded-движка; на удалённом сервере это будет версия выбранного сервера. PHP_INT_SIZE*8 характеризует целые числа данного PHP и в этом профиле соответствует 64-битной сборке. CLI-проверка не подтверждает настройку Apache/FPM. Не публикуйте полный phpinfo с путями и окружением.

После перехода на PHP 7.4 прежние вызовы ibase_connect/ibase_query исчезли, хотя код приложения сохранился. Реальный вопрос на Stack Overflow. Наш разбор разделяет версию PHP, отдельно устанавливаемое расширение и версию движка. Неподтверждённые утверждения из ответов о жёстком соответствии версии PHP и ODS не перенесены в руководство.

Попробуйте изменить условие

Планировщик показывает cli с interbase 3.0.1, а страница сайта сообщает undefined function ibase_connect. Какой слой нужно проверить следующим?

Разбор решения

PHP-процесс сайта: его версию, SAPI, загруженный ini и наличие расширения. Работающий CLI не доказывает, что веб-процесс использует тот же бинарный файл и конфигурацию.

Одна программа PHP: сравнить запуск без расширения и с расширением

В планировщике скрипт не находит ibase_connect, хотя в другой консоли всё работает. Проверим одну и ту же программу PHP дважды: -n исключает настройки ini, а во втором запуске -d явно подключает нужный модуль. Получится наглядная разница «функции нет → функция есть» без намеренного фатального вызова отсутствующей функции.

Путь данных
  1. PHP_BINARY → один и тот же исполняемый файл
  2. Дочерний запуск -n → extension_loaded=false
  3. Дочерний запуск -n -d extension=… → extension_loaded=true
  4. Сравнить SHA256 бинарного файла и версии
  5. Родитель → настоящая отдельная база → Cable, 3

Минимальный шаг

if (!function_exists("ibase_connect")) {
    echo "Этот PHP не загрузил interbase";
} else {
    echo "Функция подключения доступна";
}

function_exists проверяет наличие функции до её вызова. Полный пример не меняет php.ini и не устанавливает DLL: proc_open запускает уже настроенный комплект с разными параметрами. Дочерние процессы только сообщают возможности PHP; SQL выполняется родителем отдельно. Полные команды и пути сохраняются в локальных proof-файлах, в публичном отчёте — только результаты сравнения.

Видимый результат

НаблюдениеРезультат
Один и тот же php.exeда
Без расширения: ibase_connect доступнанет
С расширением: ibase_connect доступнада
Версия подключённого расширения3.0.1
Оба запуска исключили php.iniда
SQL родительского процесса прочиталCable
Остаток3
Одна программа PHP: сравнить запуск без расширения и с расширениемСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/lab.php';
$owned=[];$removed=[];$db=$service=null;
try {
    $config=f159Config();$service=f159Service();$runtime=f159Runtime($service);

    require __DIR__.'/process-lab.php';
    $without=f159Capability(false);
    $with=f159Capability(true);
    $database=f159CreateDatabase($service,$owned,'extension');
    $db=f159Connect($database);
    $product=f159Read($db,'SELECT TITLE AS "title",QTY AS "qty" FROM LAB_ITEMS WHERE ID=?',[1])[0];
    f159Close($db);
    $sameBinary=$without['binary_sha256']===$with['binary_sha256'];
    $rows=[['Один и тот же php.exe',$sameBinary],['Без расширения: ibase_connect доступна',$without['connect_available']],
        ['С расширением: ibase_connect доступна',$with['connect_available']],['Версия подключённого расширения',$with['extension_version']],
        ['Оба запуска исключили php.ini',!$without['ini_loaded'] && !$with['ini_loaded']],
        ['SQL родительского процесса прочитал',$product['title']],['Остаток',$product['qty']]];
    $checks=['same_php_binary'=>$sameBinary && $without['php']===$with['php'],
        'missing_extension_explained'=>$without['extension_loaded']===false && $without['connect_available']===false && $without['extension_version']===null,
        'explicit_extension_loaded'=>$with['extension_loaded']===true && $with['connect_available']===true && $with['extension_version']==='3.0.1',
        'ini_isolated'=>!$without['ini_loaded'] && !$with['ini_loaded'] && !$without['ini_scanned'] && !$with['ini_scanned'],
        'two_distinct_processes'=>$without['pid']!==$with['pid'],
        'parent_query_works'=>$product===['title'=>'Cable','qty'=>3],'parent_closed'=>$db===null];
    $observations=['capability_children'=>[$without,$with],'child_database_connections'=>0,
        'selected'=>$product,'actual_php_binary_same'=>$sameBinary,
        'private_process_proofs'=>['capability-without-process.json','capability-with-process.json']];

} finally {
    if(is_resource($db)){f159Close($db);}
    if(is_resource($service)){f159Detach($service);}
    $removed=f159Cleanup($owned);
}

f159Report('fb159-extension-diagnosis','Одна программа PHP: сравнить запуск без расширения и с расширением',$rows,$checks,$observations,$runtime,$owned,$removed);
Ожидаемый результат
Один и тот же php.exe — да
Без расширения: ibase_connect доступна — нет
С расширением: ibase_connect доступна — да
Версия подключённого расширения — 3.0.1
Оба запуска исключили php.ini — да
SQL родительского процесса прочитал — Cable
Остаток — 3

Самостоятельная программа с README, одной собственной учебной базой и реальным SQL. После запуска откройте result.html; данные и наблюдения также записаны в result.json.

HTML-результат · JSON с наблюдениями.

Ошибки и границы применения

Для загрузки DLL нужны совпадающие PHP minor, ABI, разрядность, TS/NTS и доступные зависимости fbclient. Передайте PHPMAN_FIREBIRD_EXTENSION, как описано в README. Восемь секунд — технический предел маленькой проверки, а не таймаут SQL. Ошибку загрузчика надо читать в stderr; отсутствие функции нельзя исправить паролем БД. CLI с -n не читает php.ini и дополнительный ini-каталог, но наследует обычное окружение процесса. Эти два запуска не имитируют Apache или FPM.

Фоновая задача перестала видеть ibase_connect; изменение некоторого php.ini не объяснило, что читает PHP планировщика. Реальный вопрос на Stack Overflow. Оригинальный пример запускает один бинарный PHP в двух явно различающихся конфигурациях и показывает возможности каждого. Затем отдельный реальный SELECT проверяет следующий слой.

Попробуйте изменить условие

Оба запуска используют один SHA256 php.exe, но только второй видит ibase_connect. Следует ли переустанавливать базу?

Разбор решения

Нет: выявлена разница загрузки расширения. Закрепите корректную конфигурацию для нужного PHP-процесса, затем отдельно проверяйте подключение и SQL. Рабочий файл базы здесь не причина отсутствующей функции.

Формат даты доставки: увидеть изменение и вернуть исходные настройки

Для накладной нужна дата 29.02.2024, а другой потребитель ожидает 2024-02-29. На одной строке товара покажем, как настройки расширения меняют строковое представление SQL DATE, TIME и TIMESTAMP. Сохранение и восстановление настроек отделяет временное оформление отчёта от поведения остальной программы.

Путь данных
  1. SQL DATE 2024-02-29 → стандартный fetch → 2024-02-29
  2. ini_set(dateformat, %d.%m.%Y) → следующий fetch → 29.02.2024
  3. timeformat %H:%M → 13:14 вместо 13:14:15
  4. finally → вернуть три предыдущие строки формата
  5. Тот же SELECT → исходные значения представления

Минимальный шаг

$before = ini_get("ibase.dateformat");
$old = ini_set("ibase.dateformat", "%d.%m.%Y");
if ($old === false) { throw new RuntimeException("Формат недоступен для изменения"); }
try {
    echo ini_get("ibase.dateformat"); // %d.%m.%Y
} finally {
    ini_set("ibase.dateformat", $before);
}

ini_get читает действующее значение. ini_set возвращает предыдущую строку либо false, поэтому нужна строгая проверка === false: пустая предыдущая строка допустима. %d означает день, %m месяц, %Y четырёхзначный год, %H часы, %M минуты, %S секунды. Это шаблоны нативного strftime, а не форматы PHP date() с d.m.Y. В полном примере SQL CAST создаёт значения трёх разных типов; таблица показывает их фактическое преобразование расширением.

Видимый результат

НаблюдениеРезультат
ТоварCable
Дата до изменения2024-02-29
Дата для накладной29.02.2024
Время до изменения13:14:15
Время для накладной13:14
Полная отметка29.02.2024 13:14:15
Дата после восстановления2024-02-29
Настройки восстановленыда
Формат даты доставки: увидеть изменение и вернуть исходные настройкиСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/lab.php';
$owned=[];$removed=[];$db=$service=null;
try {
    $config=f159Config();$service=f159Service();$runtime=f159Runtime($service);

    $database=f159CreateDatabase($service,$owned,'formats');
    $db=f159Connect($database);
    $sql="SELECT TITLE AS \"title\",CAST('2024-02-29' AS DATE) AS \"day\","
        ."CAST('13:14:15' AS TIME) AS \"time\",CAST('2024-02-29 13:14:15' AS TIMESTAMP) AS \"stamp\" "
        .'FROM LAB_ITEMS WHERE ID=1';
    $wanted=['ibase.dateformat'=>'%d.%m.%Y','ibase.timeformat'=>'%H:%M',
        'ibase.timestampformat'=>'%d.%m.%Y %H:%M:%S'];
    $saved=[];$returns=[];
    foreach($wanted as $key=>$value){$saved[$key]=ini_get($key);}
    $before=f159Read($db,$sql)[0];
    try{
        foreach($wanted as $key=>$value){
            $previous=ini_set($key,$value);
            if($previous===false)throw new RuntimeException('Этот процесс не разрешил изменение формата.');
            $returns[$key]=$previous;
        }
        $during=f159Read($db,$sql)[0];
    }finally{
        foreach($saved as $key=>$value){
            if(ini_set($key,$value)===false)throw new RuntimeException('Исходный формат не восстановлен.');
        }
    }
    $after=f159Read($db,$sql)[0];
    $restored=true;foreach($saved as $key=>$value){$restored=$restored && ini_get($key)===$value;}
    f159Close($db);
    $rows=[['Товар',$before['title']],['Дата до изменения',$before['day']],['Дата для накладной',$during['day']],
        ['Время до изменения',$before['time']],['Время для накладной',$during['time']],['Полная отметка',$during['stamp']],
        ['Дата после восстановления',$after['day']],['Настройки восстановлены',$restored]];
    $checks=['default_formats'=>$before===['title'=>'Cable','day'=>'2024-02-29','time'=>'13:14:15','stamp'=>'2024-02-29 13:14:15'],
        'custom_formats'=>$during===['title'=>'Cable','day'=>'29.02.2024','time'=>'13:14','stamp'=>'29.02.2024 13:14:15'],
        'old_values_returned'=>$returns===$saved,'original_settings_restored'=>$restored,
        'same_sql_after_restore'=>$after===$before,'closed'=>$db===null];
    $observations=['before'=>$before,'during'=>$during,'after'=>$after,'original_ini'=>$saved,
        'requested_ini'=>$wanted,'ini_set_returns'=>$returns,'stored_values_not_modified'=>true,
        'scope'=>'текущий процесс выполнения, не редактирование php.ini'];

} finally {
    if(is_resource($db)){f159Close($db);}
    if(is_resource($service)){f159Detach($service);}
    $removed=f159Cleanup($owned);
}

f159Report('fb159-effective-ini','Формат даты доставки: увидеть изменение и вернуть исходные настройки',$rows,$checks,$observations,$runtime,$owned,$removed);
Ожидаемый результат
Товар — Cable
Дата до изменения — 2024-02-29
Дата для накладной — 29.02.2024
Время до изменения — 13:14:15
Время для накладной — 13:14
Полная отметка — 29.02.2024 13:14:15
Дата после восстановления — 2024-02-29
Настройки восстановлены — да

Самостоятельная программа с README, одной собственной учебной базой и реальным SQL. После запуска откройте result.html; данные и наблюдения также записаны в result.json.

HTML-результат · JSON с наблюдениями.

Ошибки и границы применения

ini_set не переписывает php.ini и не изменяет хранимые даты. Эти три настройки INI_ALL можно менять во время выполнения; INI_SYSTEM этим способом не настраивается. Выбор формата влияет на последующие fetch в текущем выполнении, поэтому для обычного сайта часто удобнее сохранять стандартный формат и отдельно оформлять поле средствами DateTimeImmutable. В исходнике 3.0.1 разбор входных строк зависит от HAVE_STRPTIME; нельзя заключать, что любой формат вывода автоматически станет универсальным форматом входных параметров на Windows. Показан вывод фиксированных SQL-значений без часового пояса, а не преобразование часовых поясов.

Функция подключения уже существует, но сервер отклоняет имя кодировки; явный charset в вызове отсутствует. Реальный вопрос на Stack Overflow. Нужно исследовать действующий default_charset и поддерживаемые имена Firebird. HTML-кодировка, загрузка DLL и кодировка соединения не одно и то же. Пример не копирует чужие реквизиты подключения из вопроса.

Попробуйте изменить условие

Почему после печати накладной надо восстановить формат, если значения в базе не менялись?

Разбор решения

Изменилось представление следующих результатов в PHP. Другой участок программы может разбирать стандартный YYYY-MM-DD; finally возвращает прежний контракт даже при исключении в подготовке отчёта.

Режим чтения и содержимое примечания: разные константы для разных действий

Нужен маленький складской отчёт: один товар в наличии и короткое текстовое примечание. У транзакции зададим режим только чтения, а у fetch — получение содержимого BLOB. На экране будет memo159, а не служебный идентификатор BLOB. Имена констант позволяют понять назначение каждого аргумента без расшифровки чисел.

Путь данных
  1. IBASE_READ | COMMITTED | REC_VERSION | NOWAIT → параметры транзакции
  2. WHERE QTY>0 ORDER BY ID ROWS 1 → Cable, 3
  3. CAST короткого текста AS BLOB → значение SQL-типа BLOB
  4. fetch_assoc(..., IBASE_FETCH_BLOBS) → строка memo159
  5. free_result → commit чтения → close → удалить собственную базу

Минимальный шаг

$flags = IBASE_READ | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT;
$transaction = ibase_trans($flags, $db);
// Для отдельного шага чтения уже полученного результата:
$row = ibase_fetch_assoc($result, IBASE_FETCH_BLOBS);

Константа — именованное неизменяемое значение, которое расширение предоставляет после загрузки. Оператор | объединяет совместимые битовые флаги. READ задаёт чтение, COMMITTED — уровень изоляции, REC_VERSION — политику версий для такого чтения, NOWAIT — отказ без ожидания при конфликте. FETCH_BLOBS относится к преобразованию результата fetch, а не к изоляции. Короткий фрагмент требует уже открытых $db/$result; полный файл показывает их создание и завершение.

Видимый результат

НаблюдениеРезультат
Назначение транзакциитолько чтение
Товар в наличииCable
Остаток3
Текст примечанияmemo159
Получено содержимое BLOBда
Транзакция завершенада
Соединение освобожденода
Режим чтения и содержимое примечания: разные константы для разных действийСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/lab.php';
$owned=[];$removed=[];$db=$service=null;
try {
    $config=f159Config();$service=f159Service();$runtime=f159Runtime($service);

    $database=f159CreateDatabase($service,$owned,'flags');
    $db=f159Connect($database);
    $transaction=null;$result=null;
    $flags=IBASE_READ | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT;
    $call=f159Capture(static fn()=>ibase_trans($flags,$db));
    if(!is_resource($call['value'])||$call['warning'])f159Failure('Транзакция чтения не начата',$call);
    $transaction=$call['value'];unset($call);
    try{
        $sql='SELECT TITLE AS "title",QTY AS "qty",CAST(\'memo159\' AS BLOB SUB_TYPE TEXT) AS "note" '
            .'FROM LAB_ITEMS WHERE QTY>0 ORDER BY ID ROWS 1';
        $result=f159Query($transaction,$sql);
        $call=f159Capture(static fn()=>ibase_fetch_assoc($result,IBASE_FETCH_BLOBS));
        if(!is_array($call['value'])||$call['warning'])f159Failure('Строка отчёта не прочитана',$call);
        $product=$call['value'];unset($call);
        if(ibase_free_result($result)!==true)f159Failure('Результат не освобождён');$result=null;
        $committed=ibase_commit($transaction);$transaction=null;
        if($committed!==true)f159Failure('Транзакция чтения не завершена');
    }finally{
        if(is_resource($result)){ibase_free_result($result);$result=null;}
        if(is_resource($transaction)){ibase_rollback($transaction);$transaction=null;}
    }
    f159Close($db);
    $rows=[['Назначение транзакции','только чтение'],['Товар в наличии',$product['title']],['Остаток',$product['qty']],
        ['Текст примечания',$product['note']],['Получено содержимое BLOB',$product['note']==='memo159'],
        ['Транзакция завершена',$committed],['Соединение освобождено',$db===null]];
    $checks=['named_transaction_flags'=>$flags===(IBASE_READ | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT),
        'bounded_selection'=>$product['title']==='Cable' && $product['qty']===3,
        'blob_content_read'=>$product['note']==='memo159','read_transaction_finished'=>$committed===true && $transaction===null,
        'result_released'=>$result===null,'closed'=>$db===null];
    $observations=['transaction_flags'=>['IBASE_READ','IBASE_COMMITTED','IBASE_REC_VERSION','IBASE_NOWAIT'],
        'fetch_flags'=>['IBASE_FETCH_BLOBS'],'selected'=>$product,
        'query'=>'SELECT TITLE,QTY,CAST(\'memo159\' AS BLOB SUB_TYPE TEXT) AS note FROM LAB_ITEMS WHERE QTY>0 ORDER BY ID ROWS 1',
        'concurrent_conflicts_not_simulated'=>true,'large_blobs_not_loaded'=>true];

} finally {
    if(is_resource($db)){f159Close($db);}
    if(is_resource($service)){f159Detach($service);}
    $removed=f159Cleanup($owned);
}

f159Report('fb159-symbolic-flags','Режим чтения и содержимое примечания: разные константы для разных действий',$rows,$checks,$observations,$runtime,$owned,$removed);
Ожидаемый результат
Назначение транзакции — только чтение
Товар в наличии — Cable
Остаток — 3
Текст примечания — memo159
Получено содержимое BLOB — да
Транзакция завершена — да
Соединение освобождено — да

Самостоятельная программа с README, одной собственной учебной базой и реальным SQL. После запуска откройте result.html; данные и наблюдения также записаны в result.json.

HTML-результат · JSON с наблюдениями.

Ошибки и границы применения

Этот пример не создаёт конкурентный конфликт и не измеряет ожидание. Современный сервер может уточнять READ COMMITTED настройкой ReadConsistency — сверяйте его документацию. FETCH_BLOBS переносит весь BLOB в PHP: для больших вложений нужен порционный ibase_blob_get из главы чтения BLOB. SQL ARRAY — отдельный тип базы, а не массив строк PHP; для него есть FETCH_ARRAYS. IBASE_UNIXTIME не используется здесь: на закреплённой Windows-сборке нативный mktime учитывает окружение C-библиотеки, а TIME без даты дал -1 в подготовке. date_default_timezone_set("UTC") этого не исправило; не объявляйте любое полученное число корректной UTC-меткой.

Попробуйте изменить условие

Примечание выросло до 500 МБ. Достаточно ли оставить FETCH_BLOBS и ограничить запрос ROWS 1?

Разбор решения

Нет. ROWS 1 ограничит число строк, но одна строка всё ещё содержит большой BLOB. Получите его идентификатор без FETCH_BLOBS и читайте частями через ibase_blob_open/ibase_blob_get, проверяя размер и результат записи.

Все семейства IBASE_*: флаги, действия и значения

Имена IBASE_* доступны после загрузки расширения. Часть из них — совместимые битовые флаги, часть — отдельный код действия, часть — значение параметра выбранного действия. Совпадение чисел в разных семействах не делает имена взаимозаменяемыми. Например, READ относится к ibase_trans, FETCH_BLOBS к fetch, а PRP_AM_READONLY передают как значение действия PRP_ACCESS_MODE в обслуживании базы.

Три разных договора
  1. ibase_trans(READ | COMMITTED | REC_VERSION | NOWAIT, $db) → режим транзакции
  2. ibase_fetch_assoc($result, FETCH_BLOBS) → способ чтения полей
  3. ibase_maintain_db($service, $dbPath, PRP_ACCESS_MODE, PRP_AM_READONLY) → свойство базы

В закреплённом runtime обнаружено 66 имён IBASE_*. Ниже сохранены все семейства официального списка и дополнительно отмеченное исходником IBASE_CREATE. Наличие имени не доказывает поддержку соответствующей операции любым современным Firebird/InterBase: часть административных опций историческая. Таблицы объясняют назначение; конкретный набор аргументов и результаты раскрываются по ссылке на соответствующую главу.

Транзакция: доступ, изоляция и ожидание

КонстантаНазначение и границы
IBASE_DEFAULTНастройки транзакции по умолчанию. Manual описывает типичное WRITE | CONCURRENCY | WAIT; для важной политики задавайте нужные имена явно.
IBASE_READТранзакция только для чтения. Это режим транзакции, а не перевод файла базы в read-only.
IBASE_WRITEТранзакция допускает изменения при наличии прав; противоположность READ.
IBASE_CONSISTENCYSNAPSHOT TABLE STABILITY: более строгая согласованность с ограничениями конкурирующего изменения таблиц. Не обычный флаг ускорения SELECT.
IBASE_CONCURRENCYSNAPSHOT: чтение согласованного снимка; последующие чужие commit не становятся автоматически видимыми в этом снимке.
IBASE_COMMITTEDREAD COMMITTED: чтение подтверждённых версий. Политику версий задают следующими флагами; у современных серверов учитывайте ReadConsistency.
IBASE_REC_VERSIONВариант READ COMMITTED, допускающий чтение подходящей подтверждённой версии при незавершённом изменении другой транзакцией.
IBASE_REC_NO_VERSIONВариант READ COMMITTED без такого обхода через предыдущую версию: поведение конфликта зависит также от WAIT/NOWAIT.
IBASE_WAITОжидать разрешения конфликта блокировки. Не обещает бесконечный успех и не задаёт HTTP-таймаут.
IBASE_NOWAITПри соответствующем конфликте вернуть отказ без ожидания; обработка ошибки остаётся обязанностью программы.

Перейти к практике этого семейства.

Чтение значений и исторические имена

КонстантаНазначение и границы
IBASE_FETCH_BLOBSПолучить содержимое BLOB непосредственно в fetch, а не его идентификатор. Подходит для ограниченных небольших данных.
IBASE_TEXTСовместимый старый синоним FETCH_BLOBS; в исходнике 3.0.1 помечен deprecated для обратной совместимости.
IBASE_FETCH_ARRAYSРазвернуть SQL ARRAY в PHP-массив. Без флага возвращается идентификатор SQL ARRAY; Manual допускает его передачу в INSERT и не предоставляет отдельный API работы с таким ID.
IBASE_UNIXTIMEВместо строк даты/времени вернуть числовую временную метку. До 1970 и для TIME без даты возможны платформенные проблемы; наблюдение Windows описано ниже.
IBASE_CREATEДополнительное экспортируемое имя закреплённого драйвера со значением 0. Не функция создания базы и не замена CREATE DATABASE/восстановлению. На общей странице констант PHP оно отдельно не объясняется.

Перейти к практике этого семейства.

Резервная копия: опции ibase_backup

КонстантаНазначение и границы
IBASE_BKP_IGNORE_CHECKSUMSИгнорировать ошибки контрольных сумм при backup. Специальная аварийная опция, не подтверждение целостности.
IBASE_BKP_IGNORE_LIMBOИгнорировать limbo-транзакции при backup. Не разрешает их причину автоматически.
IBASE_BKP_METADATA_ONLYСохранить метаданные без строк. Такой файл не является копией пользовательских данных.
IBASE_BKP_NO_GARBAGE_COLLECTНе выполнять сборку мусора в ходе backup; влияет на работу, выполняемую при копировании.
IBASE_BKP_OLD_DESCRIPTIONSИсторический формат описаний метаданных для совместимости со старыми версиями.
IBASE_BKP_NON_TRANSPORTABLEНетранспортируемый вариант backup. Не выбирайте для произвольного переноса между платформами.
IBASE_BKP_CONVERTПреобразование внешних таблиц в обычные в резервной копии. Важно понимать, какие внешние данные попадут в неё.

Перейти к практике этого семейства.

Восстановление: опции ibase_restore

КонстантаНазначение и границы
IBASE_RES_DEACTIVATE_IDXОставить индексы неактивными при восстановлении; последующая работа с ними требует отдельного решения.
IBASE_RES_NO_SHADOWНе восстанавливать определения shadow-файлов.
IBASE_RES_NO_VALIDITYПропустить ограничения validity в предусмотренном движком режиме восстановления. Это не проверка корректности строк.
IBASE_RES_ONE_AT_A_TIMEВосстанавливать с промежуточным подтверждением отдельных таблиц. При ошибке нельзя считать базу целиком готовой.
IBASE_RES_REPLACEЗаменять существующую базу. В самостоятельных уроках не применяется: восстанавливаем в новый файл.
IBASE_RES_CREATEСоздать новую базу при restore. Не комбинируйте с противоположным намерением REPLACE.
IBASE_RES_USE_ALL_SPACEИспользовать страницы без обычного резерва свободного места в восстановленной базе; это параметр хранения, не сжатие backup.

Перейти к практике этого семейства.

Свойства базы: действие и его значение

КонстантаНазначение и границы
IBASE_PRP_PAGE_BUFFERSДействие: назначить число буферов страниц. Аргумент — количество, не байты; эффект зависит от архитектуры Firebird.
IBASE_PRP_SWEEP_INTERVALДействие: назначить порог автоматического sweep. Это число транзакций в критерии движка, а не интервал секунд.
IBASE_PRP_SHUTDOWN_DBДействие выключения/ограничения доступа к базе. Нужны согласованное окно и поддерживаемая сервером политика.
IBASE_PRP_DENY_NEW_TRANSACTIONSОпция прекращения допуска новых транзакций в режиме shutdown; не флаг обычного SELECT.
IBASE_PRP_DENY_NEW_ATTACHMENTSОпция прекращения допуска новых подключений в режиме shutdown.
IBASE_PRP_RESERVE_SPACEДействие выбора политики резервирования места на страницах; значение выбирают из двух следующих имён.
IBASE_PRP_RES_USE_FULLЗначение для RESERVE_SPACE: использовать страницы без обычного резерва.
IBASE_PRP_RESЗначение для RESERVE_SPACE: сохранять резерв места.
IBASE_PRP_WRITE_MODEДействие выбора режима записи; значение WM_SYNC либо WM_ASYNC.
IBASE_PRP_WM_ASYNCЗначение асинхронного режима записи. Компромисс сохранности нельзя сводить к обещанию скорости.
IBASE_PRP_WM_SYNCЗначение синхронного режима записи (forced writes). Не заменяет резервное копирование.
IBASE_PRP_ACCESS_MODEДействие выбора read-only/read-write на уровне базы; отличается от READ у отдельной транзакции.
IBASE_PRP_AM_READONLYЗначение для ACCESS_MODE: запрет изменения базы.
IBASE_PRP_AM_READWRITEЗначение для ACCESS_MODE: база допускает запись с учётом прав и других ограничений.
IBASE_PRP_SET_SQL_DIALECTДействие назначения SQL-диалекта базы. Не преобразует автоматически все существующие типы и приложение.
IBASE_PRP_ACTIVATEАдминистративная активация shadow как базы. Это не включение PHP-расширения; доступность и точный контекст проверяются по версии сервера.
IBASE_PRP_DB_ONLINEВозврат базы в online после shutdown в поддерживаемом сервисном режиме.

Перейти к практике этого семейства.

Проверка и обслуживание: что именно запросили

КонстантаНазначение и границы
IBASE_RPR_VALIDATE_DBДействие проверки базы. Само true от maintain_db означает запуск, а не итоговый сертификат отсутствия ошибок.
IBASE_RPR_CHECK_DBОпция проверки без исправления к действию VALIDATE_DB; не самостоятельный уровень SQL-изоляции.
IBASE_RPR_FULLБолее полная проверка, включающая записи, в составе предусмотренной операции validation.
IBASE_RPR_IGNORE_CHECKSUMОпция игнорирования контрольных сумм. Не использовать для сокрытия найденных повреждений.
IBASE_RPR_KILL_SHADOWSАдминистративная операция удаления недоступных shadow-определений. Не удаление обычных строк таблицы.
IBASE_RPR_MEND_DBАварийная подготовка повреждённой базы к извлечению данных; возможна потеря проблемных записей. Работают с копией и планом восстановления.
IBASE_RPR_SWEEP_DBЗапустить sweep: обслуживание старых версий/транзакционного состояния. Не универсальная команда исправления или ускорения базы.

Перейти к практике этого семейства.

Статистика файла и таблиц: ibase_db_info

КонстантаНазначение и границы
IBASE_STS_HDR_PAGESОтчёт заголовка: ODS, размер страницы, счётчики и свойства.
IBASE_STS_DATA_PAGESСтатистика страниц данных; это не SELECT пользовательских полей.
IBASE_STS_IDX_PAGESСтатистика индексных страниц. В примере 3.0.1 передаётся дополнительным аргументом к DATA_PAGES.
IBASE_STS_SYS_RELATIONSВключение системных отношений в статистический отчёт.
IBASE_STS_DB_LOGИсторическая опция статистики database log; современные возможности и полезность зависят от сервера.

Перейти к практике этого семейства.

Сведения экземпляра: ibase_server_info

КонстантаНазначение и границы
IBASE_SVC_SERVER_VERSIONВерсия подключённого экземпляра Firebird/InterBase.
IBASE_SVC_IMPLEMENTATIONРеализация/платформа экземпляра.
IBASE_SVC_GET_ENVСервисный каталог установки/окружения сервера.
IBASE_SVC_GET_ENV_LOCKКаталог блокировок сервера.
IBASE_SVC_GET_ENV_MSGКаталог файла сообщений сервера.
IBASE_SVC_USER_DBPATHПуть базы безопасности пользователей.
IBASE_SVC_SVR_DB_INFOСведения о подключениях и базах в области видимости экземпляра; не сканирование всего диска.
IBASE_SVC_GET_USERSДоступные сведения пользователей при соответствующих правах; состав зависит от серверного API.

Перейти к практике этого семейства.

Не объединяйте через | взаимоисключающие READ/WRITE, WAIT/NOWAIT или все уровни изоляции. И не складывайте action/value как флаги: PRP_ACCESS_MODE выбирает действие, PRP_AM_READONLY занимает отдельный аргумент. Даже совместимые флаги должны иметь смысл для конкретной функции и версии сервера.

Платформенная граница UNIXTIME проверена отдельно при подготовке этой главы: в Windows с указанным драйвером DATE и TIMESTAMP преобразовывались нативным mktime, а TIME без даты дал -1; изменение PHP timezone на UTC не меняло окружение C-библиотеки. Официальное предупреждение о датах до 1970 также остаётся значимым. Для однозначного обмена датами выбирайте явный формат и часовой пояс в прикладном контракте, проверяя поддерживаемые SQL-типы; не считайте отсутствие PHP-исключения доказательством правильного времени.

READ COMMITTED в современных Firebird может работать с ReadConsistency; сочетания REC_VERSION/REC_NO_VERSION нужно соотносить с настройкой сервера. Эта глава не моделирует конкурентные блокировки и не обещает определённый таймаут. Базовые различия COMMIT/ROLLBACK и retaining раскрыты в транзакциях.

Полный указатель функций расширения по задачам

Справочник расширения устроен по задачам. Здесь перечислены все 48 основных имён ibase_* из официального ref.ibase и их 48 совместимых имён fbird_*. В закреплённом исходнике fbird_* зарегистрированы как aliases соответствующих ibase_*: это не ещё один драйвер с другими данными. Из уже разобранных функций ссылка ведёт к точной карточке; три операции пользователей пока ведут к официальному описанию и явно отмечены как следующая отдельная тема.

Соединения и жизненный цикл

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_connectfbird_connectОткрыть обычное соединение
ibase_pconnectfbird_pconnectПовторно использовать соединение в процессе
ibase_closefbird_closeЗавершить обычное подключение
ibase_drop_dbfbird_drop_dbУдалить только явно выбранную учебную базу

Запрос, параметры и подготовленный оператор

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_queryfbird_queryВыполнить SQL с параметрами
ibase_preparefbird_prepareПодготовить SQL
ibase_executefbird_executeВыполнить подготовленный запрос
ibase_num_paramsfbird_num_paramsУзнать число параметров
ibase_param_infofbird_param_infoПолучить описатель параметра
ibase_free_queryfbird_free_queryОсвободить подготовленный оператор

Результат и его поля

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_fetch_assocfbird_fetch_assocСтрока как словарь полей
ibase_fetch_rowfbird_fetch_rowСтрока как список значений
ibase_fetch_objectfbird_fetch_objectСтрока как объект
ibase_num_fieldsfbird_num_fieldsЧисло полей результата
ibase_field_infofbird_field_infoОписатель поля
ibase_free_resultfbird_free_resultОсвободить результат
ibase_name_resultfbird_name_resultНазвать курсор для связанного обновления

Транзакции и генератор

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_transfbird_transНачать транзакцию с явным режимом
ibase_commitfbird_commitПодтвердить изменения
ibase_rollbackfbird_rollbackОтменить незавершённые изменения
ibase_commit_retfbird_commit_retПодтвердить с сохранением контекста транзакции
ibase_rollback_retfbird_rollback_retОтменить с сохранением контекста транзакции
ibase_gen_idfbird_gen_idПолучить значение генератора; пропуски допустимы

Ошибки и число изменённых строк

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_affected_rowsfbird_affected_rowsЧисло затронутых строк последнего запроса
ibase_errcodefbird_errcodeНемедленно сохранить код ошибки
ibase_errmsgfbird_errmsgНемедленно сохранить сообщение

Запись и чтение BLOB

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_blob_createfbird_blob_createСоздать открытый BLOB
ibase_blob_addfbird_blob_addДобавить данные
ibase_blob_closefbird_blob_closeЗакрыть BLOB-ресурс
ibase_blob_importfbird_blob_importЗагрузить данные файла
ibase_blob_cancelfbird_blob_cancelОтменить незавершённое создание
ibase_blob_infofbird_blob_infoУзнать длину и свойства
ibase_blob_openfbird_blob_openОткрыть сохранённый BLOB
ibase_blob_getfbird_blob_getПрочитать порцию байтов
ibase_blob_echofbird_blob_echoВывести содержимое в ответ

Сервисные сведения, backup и обслуживание

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_service_attachfbird_service_attachПодключиться к менеджеру сервиса
ibase_service_detachfbird_service_detachОсвободить сервисное подключение
ibase_server_infofbird_server_infoУзнать сведения экземпляра
ibase_db_infofbird_db_infoПолучить статистический отчёт базы
ibase_backupfbird_backupНачать резервное копирование
ibase_restorefbird_restoreВосстановить в новый файл
ibase_maintain_dbfbird_maintain_dbВыполнить согласованное обслуживание

События базы

Основное имя / карточкаСовместимый aliasКогда нужен
ibase_set_event_handlerfbird_set_event_handlerЗарегистрировать обработчик
ibase_free_event_handlerfbird_free_event_handlerСнять обработчик
ibase_wait_eventfbird_wait_eventДождаться уведомления о событии

Управление пользователями сервера — отдельная административная область

Не начинайте с административного API, если нужна карточка товара: connect → параметризованный query/prepare → fetch нужных полей → завершение ресурсов решают обычную задачу. Services API применяют для сведений экземпляра, backup и обслуживания. Пользователи сервера, роли и пользователи вашего сайта — разные сущности; наличие функции add_user не означает, что её следует вызывать из публичной формы регистрации.

Следующий шаг: обслуживать базу с проверяемым результатом

Теперь можно указать конкретный PHP, отличить незагруженный модуль от ошибки соединения, прочитать нужные поля и объяснить действующие настройки. Дальше — обслуживание собственной базы: sweep, ограничения validation и обратимые свойства. Если задача прикладная, переходите к подготовленным запросам и целостным изменениям в транзакции.

Этот раздел сохраняет установку, настройки, константы и полный указатель как справочную основу. Указатель не означает, что каждый административный сценарий уже реализован: операции пользователей отмечены отдельно. Пакет не меняет рабочие настройки PHP или Firebird на сервере читателя.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.