ID:               41135
 Updated by:       [EMAIL PROTECTED]
 Reported By:      rich at corephp dot co dot uk
 Status:           Assigned
 Bug Type:         PDO related
 Operating System: Windows XP SP2
 PHP Version:      5.2.1
 Assigned To:      wez
 New Comment:

What does the following script output for you?

$db->exec('CREATE TABLE test (data blob)');

$stmt = $db->prepare("INSERT INTO test VALUES ( ? )");
$stmt->bindParam(1, $name);
$name = "\x00a\x00";
var_dump($stmt->execute(), $stmt->rowCount());

$stmt = $db->prepare("select * from test");
var_dump($stmt->execute());
foreach ($stmt->fetchAll() as $row) {
    echo bin2hex($row[0]), "\n";
}




Previous Comments:
------------------------------------------------------------------------

[2007-04-20 18:04:33] Jared dot Williams1 at ntlworld dot com

I believe it crops the data to the first \0 byte. 

The ugly workaround is not to use bound parameters ... 

$pic_data = 'X'.$db->quote(bin2hex($pic_data));

$stmt = $db->prepare('INSERT INTO Test (name, data) VALUES
(?,'.$pic_data.')');
$stmt->bindParam(1, $name, PDO::PARAM_STR, 60);
$stmt->execute();

------------------------------------------------------------------------

[2007-04-18 17:11:47] rich at corephp dot co dot uk

The one that comes in php-5.2.1-Win32.zip (ext/php_pdo_sqlite.dll -
274,496 bytes). Please note that both the PDO SQLite AND the SQLite
(php_sqlite.dll) extensions are loaded.

------------------------------------------------------------------------

[2007-04-18 16:55:34] [EMAIL PROTECTED]

Can you clarify if you're using the sqlite that comes with PHP or if
you pulled it out of a separate PECL download?

------------------------------------------------------------------------

[2007-04-18 16:46:46] rich at corephp dot co dot uk

Description:
------------
There appears to be an issue inserting binary data from a file into a
SQLite BLOB field via PDO SQLite in that the data is never fully
transferred.

The SQLite database consisted of 1 table with 3 columns:

id - integer - primary
filename - varchar(50)
data - blob

The PHP code tried to insert an image file into the BLOB field. The
code does not error in any way, nothing appears in the PHP error log, no
warnings are produced, but the data is never fully transmitted to the
SQLite database.

The ID is created properly, the filename is correct, but the data field
contains only the first 21 bytes worth of the image and nothing more.

Various different image files have been tested. The SQLite database
itself is valid, and works perfectly with BLOB fields when inserted from
the command-line. The web server is Apache 2.2.4 The SQLite database,
from phpinfo:

PDO Driver for SQLite 3.x       enabled
PECL Module version     1.0.1 $Id: pdo_sqlite.c,v 1.10.2.6.2.1 2007/01/01
09:36:05 sebastian Exp $
SQLite Library  3.3.7undefined



Reproduce code:
---------------
$filename = 'D:/sandbox.dev/public_html/test.gif';

try
{
    $db = new PDO('sqlite:D:/sandbox.dev/public_html/test.db');
}
catch (PDOException $error)
{
    echo "Error! :" . $error->getMessage();
}

$name = 'test.gif';

$stmt = $db->prepare('INSERT INTO DataTest (filename, data) VALUES
(?,?)');
$stmt->execute(array($name, file_get_contents($filename)));


Expected result:
----------------
The SQLite database 'test.db' should be updated to contain the full
contents of test.gif in the BLOB field.

Actual result:
--------------
The image data is truncated after the first 21 bytes. When viewed in
Hexadecimal mode you can see that the GIF89a header was passed across,
along with the first 5 bytes of actual picture data, but after that it
is cut off. Insert a PNG file instead of a GIF and you get the PNG data
header, plus a few bytes worth of image, and again it cuts off. No
matter what type of file you insert into the BLOB, only the first 21
bytes make it.


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=41135&edit=1

Reply via email to