使用带有oracle数据库后端的PHP使用ADOdb库上传图像

时间:2011-04-02 00:48:49

标签: php sql oracle prepared-statement adodb

读取图像的代码行是

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

我从oracle获得的错误消息是

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 个答案:

答案 0 :(得分:2)

在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(),然后更新它。

答案 1 :(得分:0)

编辑:这不是正确的答案,请参阅其他答案。

听起来像是认为$ regular,$ thumb等都很长。

根据PHP Oracle FAQ,插入blob的代码应如下所示:

$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。

答案 2 :(得分:0)

根据Glens的回答,使用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);