Загрузка изображений с помощью php с базой данных oracle с использованием библиотеки ADOdb - PullRequest
0 голосов
/ 02 апреля 2011

Строки кода, который читает изображения:

$regular = fread(fopen('tmp/tmp3.jpg', "r"), filesize('tmp/tmp3.jpg'));
$thumb= fread(fopen('tmp/tmp2.jpg', "r"), filesize('tmp/tmp2.jpg'));
$pure = fread(fopen('tmp/tmp.jpg', "r"), filesize('tmp/tmp.jpg'));

Это мой код, который должен вставить изображение в базу данных.

$q = "INSERT INTO pacs_images VALUES (:record_id, :image_id, :thumb, :regular, :pure)";//debug
$statement = $conn -> Prepare($q);
$rs = $conn -> Execute($statement, array('record_id' => $fileNumber, 'image_id' => $imageNumber,
                    'thumb' => $thumb, 'regular' => $regular, 'pure' => $pure));

Сообщение об ошибке, которое я получаюот оракула

ORA-01461: can bind a LONG value only for insert into a LONG column

Я знаю, что схема таблицы

 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 RECORD_ID                 NOT NULL NUMBER(38)
 IMAGE_ID                  NOT NULL NUMBER(38)
 THUMBNAIL                      BLOB
 REGULAR_SIZE                       BLOB
 FULL_SIZE                      BLOB

Я не знаю, что здесь не так, я почти уверен, что схема базы данныхПравильно установите, и $ fileNumber и $ imageNumber являются целыми числами, и я повторил их и убедился, что они печатают правильные числа, в данном случае 1001. Я также использую драйвер oci8 для подключения к oracle.Кто-нибудь может увидеть, что не так с этим кодом?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2011

Нашел реальный способ сделать это в ADOdb

UpdateBlob($table,$column,$val,$where)

Allows you to store a blob (in $val) into $table into $column in a row at $where. 
Usage:

# for oracle 
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())'); 
$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1'); 

Итак, вам нужно добавить empty_blob (), а затем обновить его.

0 голосов
/ 12 июля 2018

Согласно ответу Гленса, с Oracle 12c вы можете сделать это быстрее / автоматически с помощью автоматической последовательности.

$conn->Execute('INSERT INTO blobtable (OBJEKT_ID, blobcol) VALUES (111, empty_blob())'); 
$conn->Execute('SELECT blobtable_SEQ1.CURRVAL FROM DUAL'); // Sequence name, can find it in the SQL Developer
$aresult = $result->_array;
$curID = $aresult[0]['CURRVAL'];
$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id='.$curID); 
0 голосов
/ 02 апреля 2011

РЕДАКТИРОВАТЬ: Это не правильный ответ, см. Другой ответ.

Звучит так, будто думает, что $ регулярно, $ thumb и т. Д. Длинные.

Согласно PHP Oracle FAQ код для вставки большого двоичного объекта должен выглядеть так:

$lob = oci_new_descriptor($conn, OCI_D_LOB);
$stid = oci_parse($conn, 'INSERT INTO BTAB (BLOBID, BLOBDATA) '
.'VALUES(:MYBLOBID, EMPTY_BLOB()) RETURNING BLOBDATA INTO :BLOBDATA');
oci_bind_by_name($stid, ':MYBLOBID', $myblobid);
oci_bind_by_name($stid, ':BLOBDATA', $lob, -1, OCI_B_BLOB);
oci_execute($stid, OCI_DEFAULT);

Полагаю, вам нужно установить OCI_B_BLOB для этого конкретного имени.

...