Драйверы Informix для Online (ODS) 7.x, SE 7.x и Universal Server (IUS) 9.x выполнены в "functions/ifx.ec" и "functions/php3_ifx.h". В данный момент написание поддержки ODS 7.2 в известной степени завершено, с полной поддержкой BLOB. Поддержка IUS 9.1 завершена частично: новые типы данных уже есть, но поддержка SLOBS все еще в стадии разработки.
Замечания по конфигурации:
Перед тем, как вы запустите скрипт "configure", убедитесь, что переменная "INFORMIXDIR" установлена.
Конфигурационный скрипт автоопределяет библиотеки и включаемые (include) директории, если вы запустите "configure --with_informix=yes". Вы можете переопределить эти директории, специфицировав переменные окружения "IFX_LIBDIR", "IFX_LIBS" и "IFX_INCDIR". Скрипт также патается автоопределить версию сервера Informix. Он установит переменную условного завершения "HAVE_IFX_IUS", если у вас Informix версии >= 9.00.
Несколько замечаний по использованию BLOB:
Текущая версия (18 Сентября 1998) полностью поддерживает select/insert/update для BLOB.
BLOBы в общем случае адрексуются целочисленными идентификаторами BLOB. Запрос Select возвращает "blob id" для каждой колонки BYTE и TEXT. Вы можете получить содержание путем "string_var = ifx_get_blob($blob_id);" если была выбрана передача BLOBов в память ("ifx_blobinfile(0);"). Если вы предпочитаете получать содержимое колонки BLOB в файл, используйте "ifx_blobinfile(1);", и "ifx_get_blob($blob_id);" возвратит вам имя файла. Для получения содержания используйте стандартные операции файлового ввода/вывода
Для запросов insert/update вам неоходимо создать "blob id's" своими силами, используя "ifx_create_blob(..);". Затем включите идентификатор BLOB в массив и замените колонку BLOB знаком вопроса (?) в строке запроса. Для updates/inserts вы определяете содержание BLOB, используя ifx_update_blob(...).
Поведение колонок BLOB может быт изменено конфигурационными переменными, которые можно устанавлиавать и во время выполнения:
конфигурационная переменная : ifx.textasvarchar
конфигурационная переменная : ifx.byteasvarchar
функция времени выполнения :
ifx_textasvarchar(0) : использовать идентификатор BLOB для запросов select для колонок TEXT.
ifx_byteasvarchar(0) : использовать идентификатор BLOB для запросов select для колонок BYTE.
ifx_textasvarchar(1) : возвращать колонку TEXT так, как будто это VARCHAR, без использования идентификатора BLOB для запросов select.
ifx_byteasvarchar(1) : возвращать колонку BYTE так, как будто это VARCHAR, без использования идентификатора BLOB для запросов select.
Конфигурационная переменная : ifx.blobinfile
функция времени выполнения :
ifx_blobinfile_mode(0) : возвращать колонку BYTE в память, идентификатор BLOB позволяет получить содержание.
ifx_blobinfile_mode(1) : возвращать колонку BBYTE в файл, по идентификатору BLOB - имя файла
Если вы устанавливаете ifx_text/byteasvarchar в 1, то можете использовать колонки TEXT и BYTE в запросах select как обычные (но довольно длинные) поля VARCHAR. С тех пор, как все строки в PHP3 "счетные", это напоминает "бинарную безопасность". Возвращаемые данные могут содержать все, что угодно, вы отвечаете за содержимое.
Если вы устанавливаете ifx_blobinfile в 1, используйте имя файла, возвращаемое ifx_get_blob(..) для получения бинарного содержания. Заметим, что в этом случае ВЫ ОТВЕТСТВЕННЫ ЗА УДАЛЕНИЕ ВРЕМЕННЫХ ФАЙЛОВ, СОЗДАННЫХ INFORMIX при выборке ряда. Каждый новый выбранный ряд создает новые временные файлы для каждой колонки типа BYTE.
Местоположение временных файлов указывается в переменной окружения "blobdir", по умолчанию - "." (текущая директория). Что-то вроде putenv(blobdir="tmpblob"); облегчит удаление случайно оставленных временных файлов (имена всех таких файлов начинаются с "blb").
Автоудаление пробелов для данных "char" (SQLCHAR и SQLNCHAR):
Может быть устанвлено в конфигурационной переменной :
ifx.charasvarchar : если установлена в 1 , то концевые пробелы будут удаляться автоматически.
int ifx_connect
(string [database], string [userid], string [password]);
При успешном завершении возвращает идентификатор соединения, при ошибке - false.
ifx_connect() устанавливает соединение к серверу Informix. Все аргументы опциональны и при их отсутствии берутся установки по умолчанию, из файла php3.ini: хост - ifx.default_host (если не определено, то библиотеки Informix используют переменную окружения $INFORMIXSERVER), пользователь - ifx.default_user, пароль - ifx.default_password (может быть не определен).
В случае повтороного вызова функции ifx_connect() с теми же параметрами, новое соединение установлено не будет, а возвратится идентификатор уже установленного соединения.pened link
Ссылка к серверу будет уничтожена, как только завершится выполнение скрипта, если только она не будет закрыта раньше вызовом ifx_close().
Смотри также ifx_pconnect(), и ifx_close().
Примет 1. Соединение с базой данных Informix $conn_id = ifx_pconnect (mydb@ol_srv1, "imyself", "mypassword"); |
int ifx_pconnect
(string [database], string [userid], string [password]);
Возвращает идентификатор реальной устойчивой ссылки к Informix при успешном завершении и false при ошибке.
ifx_pconnect() работает очень похоже с ifx_connect(), но с двумя основными отличиями.
Эта функция ведет себя точно так же, как ifx_connect(), когда PHP не запкщено как модуль Апача. Во-первых, при соединении функция перво-наперво пытается найти устойчивую ссылку, которая была открыта ранее к тому же хосту с теми же параметрами (пользователь, пароль). Если поиски увенчались успехом, будет возвращен идентификатор ранее установленного соединения.
Во-вторых, соеденение с SQL-сервером не закроется по окончании выполнения скрипта. Вместо этого, ссылка останется открытой для дальнейшего использования (ifx_close() не закроет ссылку, установленную CLASS="FUNCTION">ifx_pconnect()).
Ссылкт такого типа обычно называют устойчивыми (persistent).
Смотри также: ifx_connect().
int ifx_close
(int [link_identifier]);
Всегда возвращает true
ifx_close() закрывает ссылку к базе данных Informix, которая ассоциируется со специальным идентификатором ссылки. Если идентификатор ссылки не указан, предполагается последнее установленное соединение.
Заметим, что данная функция не ринадлежит к разряду широко используемых, поскольку неустойчивые соединения автоматически закрываются после окончания выполнения скрипта.
ifx_close() не закрое устойчивое соединение, сгенерированное ifx_pconnect().
Смотри также: ifx_connect(), и ifx_pconnect().
Пример 1. закрытие соединения с Informix $conn_id = ifx_connect (mydb@ol_srv, "itsme", "mypassword"); ... несколько запросов и др. ... ifx_close($conn_id); |
int ifx_query
(string query, int [link_identifier], int [cursor_type], mixed [blobidarray]);
Возвращает определенный идентификатор результата Informix при успешном выполнении и false при ошибке.
Целочисленный "result_id" используется другими функциями для выборки результата запроса. Устанавливайте "affected_rows" для выборки, используя функцию ifx_affected_rows().
ifx_query() посылает запрос к текущей активной базе данных на сервере, который указан в link_identifier. Если идентификатор ссылки не специфицирован, подразумевается последнее открытое соединение. Если до этого не было установлено никакое соединение, функция пытается установить ссылку (как при вызове функции ifx_connect()), и использовать ее.
Выполняется query на соединении conn_id. Для запросов типа Select курсор объявлен и открыт. опциональный параметр cursor_type позволяет вам сделать курсор "scroll" и/или "hold". Это маска и может принимать одно из значаний IFX_SCROLL, IFX_HOLD, или обы вместе. Не-select запросы "выполняются немедленно".
Для любого типа запроса количество (предполагаемое или действительное) обрабатываемых рыдов сохраняется для выборки в ifx_affected_rows().
Если у вас есть колонки BLOB (BYTE или TEXT) в запросе update, вы может добавить параметрblobidarray, содержащий соответствующие идентификаторы BLOB; тогда следует заменить эти колонки на знак вопроса (?) в тексте запроса.
Если содержание колонки TEXT/BYTE позволяет, то вы можете также использовать "ifx_textasvarchar(1)" и "ifx_byteasvarchar(1)". Это позволит вам обращаться с колонками TEXT/BYTE так же, как с обычными (но довольно длинными) колонками VARCHAR в запросах select, и нет необходимости морочиться с идентификаторами BLOB.
С ifx_textasvarchar(0) или ifx_byteasvarchar(0) (ситувация по умолчанию) запрос select возвратит колонки BLOB как идентификаторы BLOB (целые значения). Вы можете получитьзначения этих идентификаторов как стори или файлы путем использования специтальных функций для BLOB (см. ниже).
Смотри также: ifx_connect().
Пример 1. показ всех рядов таблицы "orders" как таблицы html ifx_textasvarchar(1); // использовать режим "text mode" для BLOBов $res_id = ifx_query("select * from orders", $conn_id); if (! $res_id) { printf("Can't select orders : %s\n<br>%s<br>\n", ifx_error(); ifx_errormsg(); die; } ifx_htmltbl_result($res_id, "border=\"1\"); ifx_free_result($res_id); |
Пример 2. Вставка нескольких значений в таблицу "catalog" // создание идентификаторов BLOB для колонок byte и text $textid = ifx_create_blob(0, 0, "Text column in memory"); $byteid = ifx_create_blob(1, 0, "Byte column in memory"); // сохранение идентификаторов BLOB в масиве $blobidarray[] = $textid; $blobidarray[] = $byteid; // запуск запроса $query = "insert into catalog (stock_num, manu_code, " . "cat_descr,cat_picture) values(1,'HRO',?,?)"; $res_id = ifx_query($query, $conn_id, $blobidarray); if (! $res_id) { ... ошибка ... } // освобождение идентификатора результата ifx_free_result($res_id); |
int ifx_prepare
(string query, int conn_id, int [cursor_def], mixed blobidarray);
Возвращает целое result_id для использования в ifx_do(). Устанавливает affected_rows для извлечения данных функцией ifx_affected_rows().
Подготавливает query на соединении conn_id. Для запросов типа Select курсор объявлен и открыт. опциональный параметр cursor_type позволяет вам сделать курсор "scroll" и/или "hold". Это маска и может принимать одно из значаний IFX_SCROLL, IFX_HOLD, или обы вместе. Не-select запросы "выполняются немедленно".
Для любого типа запроса количество (предполагаемое или действительное) обрабатываемых рыдов сохраняется для выборки в ifx_affected_rows().
Если у вас есть колонки BLOB (BYTE или TEXT) в запросе update, вы может добавить параметрblobidarray, содержащий соответствующие идентификаторы BLOB; тогда следует заменить эти колонки на знак вопроса (?) в тексте запроса.
Если содержание колонки TEXT/BYTE позволяет, то вы можете также использовать "ifx_textasvarchar(1)" и "ifx_byteasvarchar(1)". Это позволит вам обращаться с колонками TEXT/BYTE так же, как с обычными (но довольно длинными) колонками VARCHAR в запросах select, и нет необходимости морочиться с идентификаторами BLOB.
С ifx_textasvarchar(0) или ifx_byteasvarchar(0) (ситувация по умолчанию) запрос select возвратит колонки BLOB как идентификаторы BLOB (целые значения). Вы можете получитьзначения этих идентификаторов как стори или файлы путем использования специтальных функций для BLOB (см. ниже).
Смотри также: ifx_do().
int ifx_do
(int result_id);
Возвращает true при успешном выполнении, false при ошибке.
Выполняет предварительно подготовленный запрос или открывает курсор для него.
НЕ освобождает result_id при ошибке.
ТАкже устанавливает реальное значение ifx_affected_rows() для не-select выражений для выборки данных в ifx_affected_rows().
Смотри также: ifx_prepare().
string ifx_error
(void);
Коды оошибок The Informix (SQLSTATE & SQLCODE) имеют следующий фомат:
x [SQLSTATE = aa bbb SQLCODE=cccc]
где:
x = space : нет ошибок
E : ошибка
N : нет больше данных
W : предупреждене
? : неопределенность
Первый символ возвращет общий результата, SQLSTATE и SQLCODE описывают ошибку более детально. Обрабатывается последняя ошибка.
Просмотрите Руководство к Informix для получения описания SQLSTATE и SQLCODE.
Смотри также: ifx_errormsg()
string ifx_errormsg
(int [errorcode]);
Возвращает сообщение об ошибке Informix, ассоциируещееся с последней ошибкой, или, если установлен опциональный параметр "errorcode", сообщение, соответствующее "errorcode".
Смотри также: ifx_error()
printf("%s\n<br>", ifx_errormsg(-201));
int ifx_affected_rows
(int result_id);
result_id is a valid result id returned by ifx_query() или ifx_prepare().
Возвращает число рядов, обработанных запросом, ассоциорванным с result_id.
Для вставок, обновлений и удалений - это реальное количество (sqlerrd[2]) обработанных рядов. Для выборок - ожидаемое количество (sqlerrd[0]). Не полагайтесь на него.
Часто используется после ifx_prepare() для ограничения запроса до приемлимого уровня.
Смотри также: ifx_num_rows()
Пример 1. Обрабатываемые ряды Informix $rid = ifx_prepare ("select * from emp where name like " . $name, $connid); if (! $rid) { ... ошбка ... } $rowcount = ifx_affected_rows ($rid); if ($rowcount > 1000) { printf ("Too many rows in result set (%d)\n<br>", $rowcount); die ("Please restrict your query<br>\n"); } |
array ifx_fetch_row
(int result_id, mixed [position]);
Возвращает ассоциативный массив, соответсвующий выбранному ряду, или false, если нет больше рядов.
Колонки BLOB возвращаются как целые идентификторы BLOB для использоваиня в ifx_get_blob(), если только вы не используете ifx_textasvarchar(1) или ifx_byteasvarchar(1), в этом случае BLOBы возвратятся как строкоыве значения. При ошибке возвращается false.
result_id - это действительный идентификатор результата, возвращенный ifx_query() или ifx_prepare() (только для запросов типа select).
[position] - опциональный параметр для операций выборки только при подвижном курсоре (scroll cursor): "NEXT", "PREVIOUS", "CURRENT", "FIRST", "LAST" или номер. Если указан номер, выполняется "абсолютная" выборка ряда.
ifx_fetch_row() выбирает один ряд данных из результата, ассоциирующегося с указанным идентификатором результата. Ряд возвращается как массив. аждая колонка результата сохраняется в смещении массива, начиная со смещения 0.
Последующий вызов ifx_fetch_row() возвртит следующий ряд результата, или false, если нет больше рядов.
Пример 1. Выборка рядов Informix $rid = ifx_prepare ("select * from emp where name like " . $name, $connid, IFX_SCROLL); if (! $rid) { ... ошибка ... } $rowcount = ifx_affected_rows($rid); if ($rowcount > 1000) { printf ("Too many rows in result set (%d)\n<br>", $rowcount); die ("Please restrict your query<br>\n"); } if (! ifx_do ($rid)) { ... ошоибка ... } $row = ifx_fetch_row ($rid, "NEXT"); while (is_array($row)) { for(reset($row); $fieldname=key($row); next($row)) { $fieldvalue = $row[$fieldname]; printf ("%s = %s,", $fieldname, $fieldvalue); } printf("\n<br>"); $row = ifx_fetch_row ($rid, "NEXT"); } ifx_free_result ($rid); |
int ifx_htmltbl_result
(int result_id, string [html_table_options]);
Возвращает количество выбранных рядов или false по ощибке.
Форматирует все ряды запроса с идентификатором result_id в html-таблицу. Второй опциональный параметр - строка с тегами установок <table>
Пример 1. Результат Informix как таблица HTML $rid = ifx_prepare ("select * from emp where name like " . $name, $connid, IFX_SCROLL); if (! $rid) { ... ошибка ... } $rowcount = ifx_affected_rows ($rid); if ($rowcount > 1000) { printf ("Too many rows in result set (%d)\n<br>", $rowcount); die ("Please restrict your query<br>\n"); } if (! ifx_do($rid) { ... ошибка ... } ifx_htmltbl_result ($rid, "border=\"2\""); ifx_free_result($rid); |
array ifx_fieldtypes
(int result_id);
Возвращает асоциативный масив с именами полей как ключами и типами данных SQL как данными для запроса с result_id. При ошибке FALSE.
Пример 1. Имена полей и типы данных SQL $types = ifx_fieldtypes ($resultid); if (! isset ($types)) { ... ошибка ... } for ($i = 0; $i < count($types); $i++) { $fname = key($types); printf("%s :\t type = %s\n", $fname, $types[$fname]); next($types); } |
array ifx_fieldproperties
(int result_id);
Возвращает ассоциативный массив с именами полей как ключами и SQL свойствами полей как данными для запроса с result_id. При ошибке - FALSE.
Возвращает свойства полей Informix SQL для каждого поля в запросе как ассоциативный массив. Свойства расшифровываются как: "SQLTYPE;длина;точность;размер;ISNULLABLE" где SQLTYPE = тип Informix типа "SQLVCHAR" и т.п. и ISNULLABLE = "Y" или "N".
Пример 1. Сойства полей Informix SQL $properties = ifx_fieldtypes ($resultid); if (! isset($properties)) { ... ошибка ... } for ($i = 0; $i < count($properties); $i++) { $fname = key ($properties); printf ("%s:\t type = %s\n", $fname, $properties[$fname]); next ($properties); } |
int ifx_num_fields
(int result_id);
Возвращает число колонок в запросе для result_id или FALSEпо ошибке.
После подготовки или выполнения запроса, этот вызов дает вам количество колонок в запросе.
int ifx_num_rows
(int result_id);
Дает количество строк, выбранных до сих пор для запроса с result_id после ifx_query() или ifx_do().
int ifx_free_result
(int result_id);
Освобождает ресурсы, занятые запросом с идентификатором результата result_id. Возвращает FALSE при ошибке.
int ifx_create_char
(string param);
Создает символьный объект. param должен иметь символьное содердимое.
int ifx_free_char
(int bid);
Удаляет символьны объеккт для аолученного идентификатора символьногго объекта bid. Возвращает FALSE при ошибке, в противном случае - TRUE.
int ifx_update_char
(int bid, string content);
Обновляет содержимое символьного объекта с идентификатором bid. content - строка с новыми данными. Возвращает FALSE при ошибке, в противном случае - TRUE.
int ifx_get_char
(int bid);
Возвращает содержание символьного объекта с идентификатором bid.
int ifx_create_blob
(int type, int mode, string param);
Создает объект BLOB
type: 1 = TEXT, 0 = BYTE
mode: 0 = BLOB-объект хранится в памяти 1 = BLOB-объект хранит содержимое в файле
param: если режим = 0: указатель на содержимое если режим = 1: указатель на файл-строку
Возвращает FALSE при ошибке, в противном случае - новый идентификатор BLOB-объекта.
int ifx_copy_blob
(int bid);
Дублирует полученный BLOB-объект. bid - идентификатор дублируемого объекта
Возвращает FALSE при ошибке, в противном случае - новый идентификатор BLOB-объекта.
int ifx_free_blob
(int bid);
Удаляет объект BLOB сидентификатором bid. Возвращает FALSE при ошибек и TRUE в противном случае.
int ifx_get_blob
(int bid);
Возвращает содержимое объекта BLOB с идентификатором bid.
ifx_update_blob
(int bid, string content);
Обновляет содержимое объекта BLOB c идентификатором bid. content - строка с новыми данными. Возвращает FALSE при ошибке и TRUE в противном случае.
void ifx_blobinfile_mode
(int mode);
Устанавливает для BLOB режимы по умолчанию для всех запросов select. Режим "0" означает сохранение Byte-BLOB в памяти, а режим "1" - сохранение в файл.
void ifx_textasvarchar
(int mode);
Устанавливает умолчания для текстового режима для всех запрососв типа select. Режим "0" - возвращается идентификатор BLOB, а при режиме "1" - возвратится varchar с текстовым содержанием.
void ifx_byteasvarchar
(int mode);
Устанавливает умолчани для байтового режима для всх запросов select. Режим "0" - возвращается идентификатор BLOB, а при режиме "1" - возвратится varchar с текстовым содержанием.
void ifx_nullformat
(int mode);
Устанавливает возвращаемое по умолчанию значение при выборке ряда для полей созначением NULL. При mode=0 вощвращается пустая строка, при mode=1 - NULL.
int ifxus_create_slob
(int mode);
Создает slob-объект и открывает его. Режимы: Modes: 1 = LO_RDONLY, 2 = LO_WRONLY, 4 = LO_APPEND, 8 = LO_RDWR, 16 = LO_BUFFER, 32 = LO_NOBUFFER -> or-маска. Вы также можете использовать константы, именованные IFX_LO_RDONLY, IFX_LO_WRONLY etc. Возвращает FALSE при ошибке и новый идентификатор объекта slob в противном случае.
int ifxus_free_slob
(int bid);
Удаляет объект slob с идентификатором bid. Возвращает FALSE приошибке и TRUE в противном случае.
int ifxus_close_slob
(int bid);
Удаляет объект slob с идентификатором bid. Возвращает FALSE приошибке и TRUE в противном случае.
int ifxus_open_slob
(long bid, int mode);
Открывает объект slob. bid должен быть существующим идентификатором slob. Режимы: 1 = LO_RDONLY, 2 = LO_WRONLY, 4 = LO_APPEND, 8 = LO_RDWR, 16 = LO_BUFFER, 32 = LO_NOBUFFER -> or-маска. Возвращает FALSE при ошибке и новый идентификатор объекта slob в противном случае.
int ifxus_tell_slob
(long bid);
Возвращает текущий файл или позицию поиска для открытього объекта slob, bid должен быть действующим идентификатором slob. Возвращает FALSE при ошибке, в противном случае - позицию поиска.
int ifxus_seek_blob
(long bid, int mode, long offset);
Устанавливает текуцщий файл или позицию поиска для открытого объекта slob. bid должен быть существующим идентификатором slob. Режимы: 0 = LO_SEEK_SET, 1 = LO_SEEK_CUR, 2 = LO_SEEK_END и offset - байтовое смещение. Возвращает FALSE при ошибке, в противном случае - позицию поиска.
int ifxus_read_slob
(long bid, long nbytes);
Читает байты в объект slob. bid - существующий идентификатор slob и nbytes - количество байт, которое надо прочесть. Возвращает FALSE при ошибке и строку в протвном случае.
int ifxus_write_slob
(long bid, string content);
Записывает строку в объект slob. bid - существующий идентификатор slob и content - содержание записи. Возвращает FALSE при ошибке или число записанных байт в противном случае.
Назад | Содержание | Вперед