index Документация Скрипты Шрифты Значки Полезные ссылки Форум
  О создании своего сайта
  Каскадные стили CSS
  Краткое описание html
  Html МЕТА тэги
  Документация по FLASH
  3D Studio MAX
  DreamWeaver FAQ
  Интерфейс CGI
  Руководство PHP
  PHP/FI 2.0
  Руководство Perl 5
  Perl FAQ
  Базы данных
  Описание SQL
  Доступ к БД

Рейтинг@Mail.ru be number one


 Руководство по РНР 3.0 - Функции работы с Informix

Драйверы 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 , то концевые пробелы будут удаляться автоматически.


ifx_connect
ifx_connect -- открытие соединения с сервером Informix
Описание

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");


ifx_pconnect
ifx_pconnect -- открыть устойчивое соединение с Informix
Описание

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() .


ifx_close
ifx_close -- закрыть соединение с Informix

ifx_query

ifx_query -- послать запрос Informix
Описание

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);


ifx_prepare
ifx_prepare -- подготовка SQL-выражения к выполнению
Описание

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() .


ifx_do
ifx_do -- выполняет предварительно подготовленное SQL-выражение

ifx_error
ifx_error -- возвратить код ошибки последнего вызова Informix

ifx_errormsg
ifx_errormsg -- возвратить сообщение об ошибке последнего вызова Informix

ifx_affected_rows
ifx_affected_rows -- получить число рядов, обработанных запросом
Описание

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");
}



ifx_fetch_row
ifx_fetch_row -- получить ряд как перечислимый массив
Описание

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);

ifx_htmltbl_result
ifx_htmltbl_result -- форматировать все ряды запроса в таблицу HTML
Описание

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);

ifx_fieldtypes
ifx_fieldtypes -- список полей Informix SQL
Описание

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);
}
ifx_fieldproperties
ifx_fieldproperties -- список свойств полей SQL
Описание

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);
}

ifx_num_fields
ifx_num_fields -- возвратить число полей в запросе
Описание

int ifx_num_fields(int result_id);

Возвращает число колонок в запросе для result_id или FALSEпо ошибке.

После подготовки или выполнения запроса, этот вызов дает вам количество колонок в запросе.


ifx_num_rows
ifx_num_rows -- подсчет рядов, уже выбранных по запросу

ifx_free_result
ifx_free_result -- освободить ресурсы запроса
Описание

int ifx_free_result(int result_id);

Освобождает ресурсы, занятые запросом с идентификатором результата result_id. Возвращает FALSE при ошибке.


ifx_create_char
ifx_create_char -- создание симывольного объекта
Описание

int ifx_create_char(string param);

Создает символьный объект. param должен иметь символьное содердимое.


ifx_free_char
ifx_free_char -- удалить символьный объект
Описание

int ifx_free_char(int bid);

Удаляет символьны объеккт для аолученного идентификатора символьногго объекта bid. Возвращает FALSE при ошибке, в противном случае - TRUE.


ifx_update_char
ifx_update_char -- обновить содержимое символьного объекта
Описание

int ifx_update_char(int bid, string content);

Обновляет содержимое символьного объекта с идентификатором bid. content - строка с новыми данными. Возвращает FALSE при ошибке, в противном случае - TRUE.


ifx_get_char
ifx_get_char -- прочесть содержимое символьного объекта
Описание

int ifx_get_char(int bid);

Возвращает содержание символьного объекта с идентификатором bid.


ifx_create_blob
ifx_create_blob -- создать объект BLOB
Описание

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-объекта.


ifx_copy_blob
ifx_copy_blob -- дублирование полученного объекта BLOB
Описание

int ifx_copy_blob(int bid);

Дублирует полученный BLOB-объект. bid - идентификатор дублируемого объекта

Возвращает FALSE при ошибке, в противном случае - новый идентификатор BLOB-объекта.


ifx_free_blob
ifx_free_blob -- удалить BLOB-объект
Описание

int ifx_free_blob(int bid);

Удаляет объект BLOB сидентификатором bid. Возвращает FALSE при ошибек и TRUE в противном случае.


ifx_get_blob
ifx_get_blob -- прочитать содержимое BLOB
Описание

int ifx_get_blob(int bid);

Возвращает содержимое объекта BLOB с идентификатором bid.


ifx_update_blob
ifx_update_blob -- обновить содержимое объекта BLOB
Описание

ifx_update_blob(int bid, string content);

Обновляет содержимое объекта BLOB c идентификатором bid. content - строка с новыми данными. Возвращает FALSE при ошибке и TRUE в противном случае.


ifx_blobinfile_mode
ifx_blobinfile_mode -- установка умолчаний для BLOB для всех запросов select
Описание

void ifx_blobinfile_mode(int mode);

Устанавливает для BLOB режимы по умолчанию для всех запросов select. Режим "0" означает сохранение Byte-BLOB в памяти, а режим "1" - сохранение в файл.


ifx_textasvarchar
ifx_textasvarchar -- установка умолчаний для текстового режима
Описание

void ifx_textasvarchar(int mode);

Устанавливает умолчания для текстового режима для всех запрососв типа select. Режим "0" - возвращается идентификатор BLOB, а при режиме "1" - возвратится varchar с текстовым содержанием.


ifx_byteasvarchar
ifx_byteasvarchar -- установка умолчаний для байтового режима
Описание

void ifx_byteasvarchar(int mode);

Устанавливает умолчани для байтового режима для всх запросов select. Режим "0" - возвращается идентификатор BLOB, а при режиме "1" - возвратится varchar с текстовым содержанием.


ifx_nullformat
ifx_nullformat -- установка возвращаеого по умолчанию значения при выборке ряда
Описание

void ifx_nullformat(int mode);

Устанавливает возвращаемое по умолчанию значение при выборке ряда для полей созначением NULL. При mode=0 вощвращается пустая строка, при mode=1 - NULL.


ifxus_create_slob
ifxus_create_slob -- создать объект slob и открыть его
Описание

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 в противном случае.


ifx_free_slob
ifx_free_slob -- удалить объект slob
Описание

int ifxus_free_slob(int bid);

Удаляет объект slob с идентификатором bid. Возвращает FALSE приошибке и TRUE в противном случае.


ifxus_close_slob
ifxus_close_slob -- удалить объект slob
Описание

int ifxus_close_slob(int bid);

Удаляет объект slob с идентификатором bid. Возвращает FALSE приошибке и TRUE в противном случае.


ifxus_open_slob
ifxus_open_slob -- открыть объект slob
Описание

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 в противном случае.


ifxus_tell_slob
ifxus_tell_slob -- возвратить текущий файл или позицию поиска
Описание

int ifxus_tell_slob(long bid);

Возвращает текущий файл или позицию поиска для открытього объекта slob, bid должен быть действующим идентификатором slob. Возвращает FALSE при ошибке, в противном случае - позицию поиска.


ifxus_seek_slob
ifxus_seek_slob -- установить текущий файл или позицию поиска
Описание

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 при ошибке, в противном случае - позицию поиска.


ifxus_read_slob
ifxus_read_slob -- читать байты в объект slob
Описание

int ifxus_read_slob(long bid, long nbytes);

Читает байты в объект slob. bid - существующий идентификатор slob и nbytes - количество байт, которое надо прочесть. Возвращает FALSE при ошибке и строку в протвном случае.


ifxus_write_slob
ifxus_write_slob -- записать строку в объект slob
Описание

int ifxus_write_slob(long bid, string content);

Записывает строку в объект slob. bid - существующий идентификатор slob и content - содержание записи. Возвращает FALSE при ошибке или число записанных байт в противном случае.



Содержание







Смотрите http://greensms.ru стоимость смс услуг. . триптих картины купить . Смотрите на сайте обойный клей цена.
Hosted by uCoz