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

Дерево руководства
Глава 70 · После первых запросов Firebird
Firebird в PHP: установка, действующие настройки и константы без угадывания
От совместимого расширения до настоящего SELECT: действующая конфигурация, временные форматы дат, именованные флаги и полный указатель функций Firebird.
От программы PHP до прочитанного товара
Вам нужен сайт или фоновый импорт, который читает Firebird. Сначала соберём совместимую цепочку: PHP выполняет код; расширение interbase добавляет функции ibase_*; клиентская библиотека передаёт обращения; движок Firebird открывает базу и исполняет SQL. Доступность каждого следующего звена проверяется отдельно. В конце этой главы вы увидите товар Cable с остатком 3, сравните запуск с модулем и без него и получите две формы одной даты доставки.
- example.php → исполняющий PHP (версия, SAPI, TS/NTS)
- interbase → функции ibase_connect / ibase_query
- fbclient → клиентские библиотеки и выбранный транспорт
- Firebird → собственная учебная .fdb → SELECT TITLE,QTY
- 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_persistent | 1 | INI_SYSTEM | Разрешение постоянных соединений. Если выключено, pconnect в этом драйвере переходит на обычный способ подключения. Не означает, что любое соединение станет постоянным. |
| ibase.max_persistent | -1 | INI_SYSTEM | Задуманный максимум постоянных соединений одного процесса; -1 означает отсутствие этого ограничения. Для 3.0.1 есть отдельная оговорка ниже. Это не размер общего пула всех PHP-процессов. |
| ibase.max_links | -1 | INI_SYSTEM | Задуманный предел всех соединений процесса, включая постоянные. -1 снимает ограничение расширения, но не ограничения ОС/сервера. Не увеличивайте предел вместо закрытия ненужных ресурсов. |
| ibase.default_db | NULL | INI_SYSTEM | База по умолчанию, когда аргумент database отсутствует. Для переносимого приложения понятнее явно задать нужную базу. Упоминание SQL safe mode на исторической странице не создаёт такой режим в PHP 8.2. |
| ibase.default_user | NULL | INI_ALL | Пользователь по умолчанию, если он не передан подключению. Это не самостоятельная система авторизации сайта. |
| ibase.default_password | NULL | INI_ALL | Пароль по умолчанию. Не выводите эту строку в диагностический HTML/JSON и не храните реальные пароли в скачиваемом примере. |
| ibase.default_charset | NULL | INI_ALL | Кодировка соединения по умолчанию. Нужен идентификатор Firebird, например UTF8, а не произвольная HTML-метка UTF-8. Явный charset в connect делает контракт видимым. |
| ibase.timestampformat | %Y-%m-%d %H:%M:%S | INI_ALL | Строковое представление SQL TIMESTAMP: дата и время. Директивы относятся к strftime. Ввод параметров дополнительно зависит от ветки сборки драйвера. |
| ibase.dateformat | %Y-%m-%d | INI_ALL | Представление SQL DATE: календарная дата. Не добавляет время или часовой пояс к типу базы. |
| ibase.timeformat | %H:%M:%S | INI_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 работает.
- PHP_VERSION/PHP_SAPI → версия и способ запуска
- phpversion(interbase) → версия PHP-модуля
- Services API → версия выбранного движка
- Собственная база → WHERE ID=1 → Cable, 3
- Отчёт сохраняет сведения; соединение и учебная база освобождаются
Минимальный шаг
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.
Видимый результат
| Наблюдение | Результат |
|---|---|
| Версия PHP | 8.2.35 |
| Способ запуска | cli |
| Разрядность PHP | 64 |
| Thread Safe | нет |
| Версия расширения | 3.0.1 |
| Версия подключённого движка | WI-V5.0.4.1812 Firebird 5.0 |
| Название товара | Cable |
| Остаток | 3 |
<?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 явно подключает нужный модуль. Получится наглядная разница «функции нет → функция есть» без намеренного фатального вызова отсутствующей функции.
- PHP_BINARY → один и тот же исполняемый файл
- Дочерний запуск -n → extension_loaded=false
- Дочерний запуск -n -d extension=… → extension_loaded=true
- Сравнить SHA256 бинарного файла и версии
- Родитель → настоящая отдельная база → 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
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. Сохранение и восстановление настроек отделяет временное оформление отчёта от поведения остальной программы.
- SQL DATE 2024-02-29 → стандартный fetch → 2024-02-29
- ini_set(dateformat, %d.%m.%Y) → следующий fetch → 29.02.2024
- timeformat %H:%M → 13:14 вместо 13:14:15
- finally → вернуть три предыдущие строки формата
- Тот же 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. Имена констант позволяют понять назначение каждого аргумента без расшифровки чисел.
- IBASE_READ | COMMITTED | REC_VERSION | NOWAIT → параметры транзакции
- WHERE QTY>0 ORDER BY ID ROWS 1 → Cable, 3
- CAST короткого текста AS BLOB → значение SQL-типа BLOB
- fetch_assoc(..., IBASE_FETCH_BLOBS) → строка memo159
- 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 в обслуживании базы.
- ibase_trans(READ | COMMITTED | REC_VERSION | NOWAIT, $db) → режим транзакции
- ibase_fetch_assoc($result, FETCH_BLOBS) → способ чтения полей
- 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_CONSISTENCY | SNAPSHOT TABLE STABILITY: более строгая согласованность с ограничениями конкурирующего изменения таблиц. Не обычный флаг ускорения SELECT. |
| IBASE_CONCURRENCY | SNAPSHOT: чтение согласованного снимка; последующие чужие commit не становятся автоматически видимыми в этом снимке. |
| IBASE_COMMITTED | READ 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_connect | fbird_connect | Открыть обычное соединение |
| ibase_pconnect | fbird_pconnect | Повторно использовать соединение в процессе |
| ibase_close | fbird_close | Завершить обычное подключение |
| ibase_drop_db | fbird_drop_db | Удалить только явно выбранную учебную базу |
Запрос, параметры и подготовленный оператор
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_query | fbird_query | Выполнить SQL с параметрами |
| ibase_prepare | fbird_prepare | Подготовить SQL |
| ibase_execute | fbird_execute | Выполнить подготовленный запрос |
| ibase_num_params | fbird_num_params | Узнать число параметров |
| ibase_param_info | fbird_param_info | Получить описатель параметра |
| ibase_free_query | fbird_free_query | Освободить подготовленный оператор |
Результат и его поля
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_fetch_assoc | fbird_fetch_assoc | Строка как словарь полей |
| ibase_fetch_row | fbird_fetch_row | Строка как список значений |
| ibase_fetch_object | fbird_fetch_object | Строка как объект |
| ibase_num_fields | fbird_num_fields | Число полей результата |
| ibase_field_info | fbird_field_info | Описатель поля |
| ibase_free_result | fbird_free_result | Освободить результат |
| ibase_name_result | fbird_name_result | Назвать курсор для связанного обновления |
Транзакции и генератор
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_trans | fbird_trans | Начать транзакцию с явным режимом |
| ibase_commit | fbird_commit | Подтвердить изменения |
| ibase_rollback | fbird_rollback | Отменить незавершённые изменения |
| ibase_commit_ret | fbird_commit_ret | Подтвердить с сохранением контекста транзакции |
| ibase_rollback_ret | fbird_rollback_ret | Отменить с сохранением контекста транзакции |
| ibase_gen_id | fbird_gen_id | Получить значение генератора; пропуски допустимы |
Ошибки и число изменённых строк
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_affected_rows | fbird_affected_rows | Число затронутых строк последнего запроса |
| ibase_errcode | fbird_errcode | Немедленно сохранить код ошибки |
| ibase_errmsg | fbird_errmsg | Немедленно сохранить сообщение |
Запись и чтение BLOB
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_blob_create | fbird_blob_create | Создать открытый BLOB |
| ibase_blob_add | fbird_blob_add | Добавить данные |
| ibase_blob_close | fbird_blob_close | Закрыть BLOB-ресурс |
| ibase_blob_import | fbird_blob_import | Загрузить данные файла |
| ibase_blob_cancel | fbird_blob_cancel | Отменить незавершённое создание |
| ibase_blob_info | fbird_blob_info | Узнать длину и свойства |
| ibase_blob_open | fbird_blob_open | Открыть сохранённый BLOB |
| ibase_blob_get | fbird_blob_get | Прочитать порцию байтов |
| ibase_blob_echo | fbird_blob_echo | Вывести содержимое в ответ |
Сервисные сведения, backup и обслуживание
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_service_attach | fbird_service_attach | Подключиться к менеджеру сервиса |
| ibase_service_detach | fbird_service_detach | Освободить сервисное подключение |
| ibase_server_info | fbird_server_info | Узнать сведения экземпляра |
| ibase_db_info | fbird_db_info | Получить статистический отчёт базы |
| ibase_backup | fbird_backup | Начать резервное копирование |
| ibase_restore | fbird_restore | Восстановить в новый файл |
| ibase_maintain_db | fbird_maintain_db | Выполнить согласованное обслуживание |
События базы
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_set_event_handler | fbird_set_event_handler | Зарегистрировать обработчик |
| ibase_free_event_handler | fbird_free_event_handler | Снять обработчик |
| ibase_wait_event | fbird_wait_event | Дождаться уведомления о событии |
Управление пользователями сервера — отдельная административная область
| Основное имя / карточка | Совместимый alias | Когда нужен |
|---|---|---|
| ibase_add_user — официальный контракт; практическая глава ещё не добавлена | fbird_add_user | Создать пользователя в системе безопасности |
| ibase_modify_user — официальный контракт; практическая глава ещё не добавлена | fbird_modify_user | Изменить сведения пользователя |
| ibase_delete_user — официальный контракт; практическая глава ещё не добавлена | fbird_delete_user | Удалить пользователя |
Не начинайте с административного API, если нужна карточка товара: connect → параметризованный query/prepare → fetch нужных полей → завершение ресурсов решают обычную задачу. Services API применяют для сведений экземпляра, backup и обслуживания. Пользователи сервера, роли и пользователи вашего сайта — разные сущности; наличие функции add_user не означает, что её следует вызывать из публичной формы регистрации.
Следующий шаг: обслуживать базу с проверяемым результатом
Теперь можно указать конкретный PHP, отличить незагруженный модуль от ошибки соединения, прочитать нужные поля и объяснить действующие настройки. Дальше — обслуживание собственной базы: sweep, ограничения validation и обратимые свойства. Если задача прикладная, переходите к подготовленным запросам и целостным изменениям в транзакции.
Этот раздел сохраняет установку, настройки, константы и полный указатель как справочную основу. Указатель не означает, что каждый административный сценарий уже реализован: операции пользователей отмечены отдельно. Пакет не меняет рабочие настройки PHP или Firebird на сервере читателя.
Источники и обсуждения
- PHP Manual: Installing/Configuring
- PHP Manual: Installation
- PHP Manual: Runtime Configuration
- PHP Manual: Predefined Constants
- PHP Manual: Firebird/InterBase Functions
- PHP Manual: установка расширений Windows
- PHP Manual: ini_get_all
- PHP Manual: ini_set
- FirebirdSQL 3.0.1: установка отдельного расширения
- FirebirdSQL 3.0.1: INI, константы и aliases
- FirebirdSQL 3.0.1: преобразование типов результата
- FirebirdSQL 3.0.1: сервисные константы
- Firebird 5: управление транзакциями
- Firebird: опции резервной копии и восстановления
- Firebird: опции обслуживания
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


