ID: 41135 Comment by: chx1975 at gmail dot com 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:
I just ran Wez's test code and got 006100 so it seems I am unable to reproduce this bug. PECL Module version => 1.0.1 $Id: pdo_sqlite.c,v 1.10.2.6.2.2 2007/03/23 14:30:00 wez Exp $ SQLite library => 3.4.2 Previous Comments: ------------------------------------------------------------------------ [2008-01-22 17:21:34] maciej dot pijanka at gmail dot com on linux, with php 5.2.5 and postgresql 8.2.5, problem is replicable ie after last example table gets empty '' values not NULLs. I wrote more detailed testcase. -- file.php -- <?php try { $db = new PDO('pgsql:dbname=template1;user=postgres','postgres'); } catch (PDOException $error) { echo "Error! :" . $error->getMessage(); exit; } $binarydata = "abcdefg\x00a\x00\x01\x02"; $db->exec('CREATE TABLE test (data bytea, comment varchar(64), len integer)'); $stmt = $db->prepare("INSERT INTO test VALUES ( :data, :comment, :len )"); # test 1, just binary data, will fail $comment = 'Just pass binary data as bindValue'; $stmt->bindValue('data', $binarydata); $stmt->bindValue('comment', $comment); $stmt->bindValue('len', strlen($binarydata)); var_dump($stmt->execute(), $stmt->rowCount(), $comment); print "--\n"; # pass as bindParam $comment = 'Just pass binary data as bindParam'; $stmt->bindParam('data', &$binarydata); $stmt->bindValue('comment', $comment); $stmt->bindValue('len', strlen($binarydata)); var_dump($stmt->execute(), $stmt->rowCount(), $comment); print "--\n"; # encoded by pg_escape_bytea, wrong too $comment = 'encoded by pg_escape_bytea'; $stmt->bindValue('data', pg_escape_bytea($binarydata)); $stmt->bindValue('comment', $comment); $stmt->bindValue('len', strlen($binarydata)); var_dump($stmt->execute(), $stmt->rowCount(), $comment); print "--\n"; # pass something that give correct result $comment = 'this one produces best result so far'; $stmt->bindValue('data', str_replace("\\\\","\\",pg_escape_bytea($binarydata)),PDO::PARAM_STR); $stmt->bindValue('comment', $comment); $stmt->bindValue('len', strlen($binarydata)); var_dump($stmt->execute(), $stmt->rowCount(), $comment); print "--\n"; echo "---- NOW FETCH ----\nExecute returned: "; $stmt = $db->prepare("select * from test"); var_dump($stmt->execute()); # with or without that its still wrong #$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES,true); print "\nFetching and comparing data\n"; # with fetchall resources don't work too while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $buffer = ''; #var_dump($row); if(is_resource($row['data'])) { $buffer = stream_get_contents($row['data']); } else $buffer = $row['data']; print "Test `".$row['comment']."' StrCmp:"; print "".(strcmp($binarydata,$buffer) == 0 )?"equal":"fail"; print " length stored in db: ". $row['len'] . ", returned data len: ".strlen($buffer)."\n"; echo bin2hex($buffer)."\n"; } $db->exec('DROP TABLE test'); ?> == end of file === and output for me looks like (only rows with results) Fetching and comparing data Test `Just pass binary data as bindValue' StrCmp:fail length stored in db: 12, returned data len: 7 61626364656667 Test `Just pass binary data as bindParam' StrCmp:fail length stored in db: 12, returned data len: 7 61626364656667 Test `encoded by pg_escape_bytea' StrCmp:fail length stored in db: 12, returned data len: 24 616263646566675c303030615c3030305c3030315c303032 Test `this one produces best result so far' StrCmp:equal length stored in db: 12, returned data len: 12 616263646566670061000102 ------------------------------------------------------------------------ [2007-04-21 03:28:18] [EMAIL PROTECTED] 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"; } ------------------------------------------------------------------------ [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? ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/41135 -- Edit this bug report at http://bugs.php.net/?id=41135&edit=1