#27083 [Fbk->Opn]: binding blobs to procedure params corrupts them
| From: | ceco at noxis dot net | Date: | Wed, 04 Feb 2004 10:37:26 +0000 |
| Subject: | #27083 [Fbk->Opn]: binding blobs to procedure params corrupts them | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-54382@lists.php.net to get a copy of this message | ||
ID: 27083
User updated by: ceco at noxis dot net
Reported By: ceco at noxis dot net
-Status: Feedback
+Status: Open
Bug Type: OCI8 related
Operating System: windows 2000 server
PHP Version: 4.3.4
Assigned To: tony2001
New Comment:
ok i'll leave it that way, but just a suggestion for the new version
isn't it strange to make method WriteTemporary to accept second param,
which explicitly tells the object, which type of instance it is?
can't it be done when binding it (OCIBindByName) to something to change
the type of object so it knows what it is bound to (blob,clob or
whatever),
or when created to tell it the type OCINewDescriptor with the last
param
Previous Comments:
------------------------------------------------------------------------
[2004-02-04 03:55:49] tony2001@php.net
In php 4.3.x method writeTemporary() doesn't accept second parameter,
which exists only in php5 branch.
This parameter should be used to tell method wich type of Lob you're
trying to write.
Thus, in php4.3.x writeTemporary always tries to create CLOB, and
you're using it to write BLOB.
The example in docs should be changed, I'm working on new docs atm.
------------------------------------------------------------------------
[2004-01-29 11:46:35] tony2001@php.net
ok, I'll take a look at it soon.
------------------------------------------------------------------------
[2004-01-29 11:16:59] ceco at noxis dot net
in examle 2 on
http://www.php.net/manual/en/function.ocinewdescriptor.php
it is used exactly like that, only it is clob
I cannot use php 5, I made workaround converting blob to hex, sending
it as clob and then reconverting it to binary ;-))
a little strange and cpu intensive but works and since it is not very
often used I'll have to leave it that way
------------------------------------------------------------------------
[2004-01-29 09:21:23] tony2001@php.net
Don't use writeTemporary, it's not intended for writing persistent
LOB's.
You should use save() or you can upgrade to PHP5 and use $lob->write()
method.
------------------------------------------------------------------------
[2004-01-29 06:29:33] ceco at noxis dot net
Description:
------------
first of all I should say that it may be documentation problem, because
didn't find good documentation of the LOB object
i have a oracle procedure, which accepts BLOB
(see the code below)
it inputs the data in the blob but when i extract (with the oracle
tools or with other php script) it is corrupted it is exactly 2 times
larger
when everything is changed to clob (of course the data is text not
jpg), this function work ok
also it is workig for me if I use insert into (the_blob) values
(empty_blob()) returning the_blob into :the_blob
and then bind $lob and use $lob->save
but i don't want to have this
I think $lob->WriteTemporary mangles the data somehow and corrupts it
Reproduce code:
---------------
include_once 'config/environment.inc.php';
$fd = fopen('Sample.jpg', 'r');
$data = fread($fd, filesize('Sample.jpg'));
fclose($fd);
$conn = ocilogon($CFG_DB['username'], $CFG_DB['password'],
$CFG_DB['db']);
$lob = OCINewDescriptor($conn, OCI_D_LOB);
$stmt = OCIParse($conn,"begin TEST_PROC(:the_blob); end;");
OCIBindByName($stmt, ':the_blob', &$lob, -1, OCI_B_BLOB);
$lob->WriteTemporary($data);
OCIExecute($stmt, OCI_DEFAULT);
$lob->close();
$lob->free();
OCICommit($conn);
create procedure TEST_PROC(the_blob blob) is
begin
insert into test_table values (the_blob);
end;
create table test_table (the_blob blob);
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=27083&edit=1