Вывод картинок из полей-BLOBов.

fly4x4

Guest
Вывод картинок из полей-BLOBов.

Прошу помощи, кто пользовался ими под Oracle или MySQL.
Помогите кто чем может, кто в чём разбирается.

Вопросов несколько.
1. Вывести картинку из БД на РНР-страничку.
2. Ввести картинку в БД с помощью multipart formdata, или как-нибудь ещё.
3. Без РНР из командной строки при помощи SqlPlus. JPEG-файл текущей директрии ввести/вывести в поле БД.

Буду рад увидеть и примеры использования, и ссылки на толковую литературу.
 

tony2001

TeaM PHPClub
>1. Вывести картинку из БД на РНР-страничку.

1. простой
1.1) запросом SELECT и дальше oci_fetch_*() с флагом OCI_RETURN_LOBS

2. сложный
2.1) создать дескриптор блоба
2.2) прибиндить его к statement
2.3) выполнить statement, которая вернет уже настоящий дескриптор
2.4) прочесть содержимое блоба - $lob->read(..)

>2. Ввести картинку в БД с помощью multipart formdata, или как-нибудь ещё.

аналогично выводу - либо через простой INSERT, либо через процедуру + $lob->write()

>3. Без РНР из командной строки при помощи SqlPlus. JPEG-файл текущей директрии ввести/вывести в поле БД.

см. 1.1

>Буду рад увидеть и примеры использования, и ссылки на толковую литературу.

[m]oci8[/m] - см. примеры и код в user notes.
 

fly4x4

Guest
tony2001
Спасибо! Буду разбираться.

Сам нарыл пункты 1, 2 для MySQL
http://php.spb.ru/php/image.html

-~{}~ 22.02.05 15:43:

Так. Разбираюсь.

Пробую через PHP загрузить в базу просто при помощи INSERT. Перед этим читаю файл в переменную.
$f=fopen("/tmp/1","rb");
$upload=fread($f,filesize("/tmp/1"));
$cmdstr = "insert into photo (id, blob) values (1, '$upload')";
$parsed = ociparse($db_conn, $cmdstr); // Тут ругается "quoted string not properly terminated" либо просто говрит, что идентификатор слишком длинный
ociexecute($parsed); //А тут "supplied argument is not a valid OCI8-Statement resource"

Ладно. Разбираемся с "lob". Делаем так.
$sql = "insert into photo (id, blob) values (1, :blob)";
$stmt = OCIParse($db_conn, $sql);
$clob = OCINewDescriptor($db_conn, OCI_D_LOB);
OCIBindByName($stmt, ":blob", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT); //Тут говорит "OCIStmtExecute: ORA-00932: inconsistent datatypes"
$clob->save("some text"); // А тут "OCILobWrite: OCI_INVALID_HANDLE"

Подскажите, чего делаю не так. Никогда не пользовался БЛОБами. Да к тому же я программист Си, а не PHP.
 

CMHungry

Guest
Автор оригинала: fly4x4
Ладно. Разбираемся с "lob". Делаем так.
$sql = "insert into photo (id, blob) values (1, :blob)";
$stmt = OCIParse($db_conn, $sql);
$clob = OCINewDescriptor($db_conn, OCI_D_LOB);
OCIBindByName($stmt, ":blob", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT); //Тут говорит "OCIStmtExecute: ORA-00932: inconsistent datatypes"
$clob->save("some text"); // А тут "OCILobWrite: OCI_INVALID_HANDLE"

Подскажите, чего делаю не так. Никогда не пользовался БЛОБами. Да к тому же я программист Си, а не PHP.
Возьми ADODB (adodb.sf.net) и пользуйся ей. Не в обиду tony, но работа с LOB, на мой взгляд, сделана весьма оригинальным методом. Правда, это и oci сам по-себе накладывает ограничения.
 

tony2001

TeaM PHPClub
CMHungry
а что именно?
(собственно, работа с LOB ничем не отличается от работы с другими полями, кроме того, что у него больше возможностей).
 

CMHungry

Guest
Выделение дескрипторов, как минимум. Проще было бы как со всеми.
 

tony2001

TeaM PHPClub
CMHungry
не пойми меня неправильно - не совсем понимаю о чем ты =)
приведи примеры, объясни чуть понятней, плз.
тема для меня интересна, т.к. есть еще PDO_OCI.
 

CMHungry

Guest
Ок. Я хочу сохранить в таблицу LOB. Что я должен сделать на ext/oci8?
Я думаю, ты код представляешь. empty_clob() в sql, ocinewdescriptor и прочая в php

а хочется - insert into table(a, b, lob) values:)a, :b, :lob)
и просто биндинг на лету
execute($sql, $params)

Но вот тут, например, не зная схемы базы, не сделаешь автомат - oci8 (библиотека С, не PHPext) не даст, насколько я понимаю.

есть
declare a clob; begin :a := lobinout:)b); end;
хочется просто прибиндить переменные и все, без ocinewdescriptor и load/save

Еще хочется прозрачных коллекций и прозрачных объектов (ну, более-менее прозрачных, я понимаю, что название named type как-то надо задавать все-таки)
Это мы с тобой уже обсуждали, правда.
 

tony2001

TeaM PHPClub
а, понял.
да, это некие..гмм..странности самой OCI.
индийские программисты выбрали самый сложный путь и (как оказалось) уже и сами не знают что теперь с этим добром делать.
такого там много.
к сожалению.
 

CMHungry

Guest
вот именно
В ADODB я решал проблему как раз прозрачного использования LOB-параметров в вызове хранимок. Вроде как получилось, удалось обойтись без OCINewDescriptor для кода, который использует ADODB. Только указывать тип надо.

Хотел сделать еще коллекции прозрачные, но не вышло - оракл 8 у меня коллекции не понял в oci8.
 

CMHungry

Guest
PDO_OCI, кстати, смотреть уже можно или еще не стоит? Он функциональность ext/oci8 уже имеет?
 

CMHungry

Guest
Вот смотря сюда
http://ru.php.net/manual/en/function.pdostatement-bindparam.php
http://ru.php.net/manual/en/function.pdostatement-bindcolumn.php

мне думается, что можно сделать тут работу с LOB без OCINewDescriptor в рамках кода, который будет работать с PDO

И не только LOB
 
Сверху