Bug #54023 [NEW]: PDO prepared statements using SQLite can't bind non-text values in expressions
| From: | sl9 at gmx dot net | Date: | Tue, 15 Feb 2011 10:46:57 +0000 |
| Subject: | Bug #54023 [NEW]: PDO prepared statements using SQLite can't bind non-text values in expressions | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-158784@lists.php.net to get a copy of this message | ||
From:
Operating system: Linux i386
PHP version: 5.3SVN-2011-02-15 (SVN)
Package: PDO related
Bug Type: Bug
Bug description:PDO prepared statements using SQLite can't bind non-text values in expressions
Description:
------------
This report is an addition to / repost of the bug reported in #45259 from
2008. I replied on that one a few weeks ago but nobody seemed to take
notice.
This bug seems to also have been reported in bug #53475 (2010).
It concerns: When using PDO with the SQLite backend and prepared SQL
statements, it appears to be impossible to bind anything but a text or NULL
value to a parameter.
As a remark I would like to mention, binded values other than string and
NULL types are cast to a string automatically.
The bug is explained quite well in bug #45259. And I've added a patch only
for the 5.3 branch as that has support for the PHP_PARAM_ZVAL type (which
5.2 lacks apparently). The current patch will not easily be backported to
5.2, I think.
I've tested the patch below with the svn commit I could grab today
(308350). It includes a couple of test cases which should cover the bug
quite well.
Test script:
---------------
$dbase = new PDO('sqlite::memory:');
$stmt = $dbase->prepare('SELECT 1=? AS result');
$stmt->execute(array(1));
echo '(INT == BOUNDINT) = ', ($stmt->fetchColumn() == 1 ? 'true' :
'false'), PHP_EOL;
$stmt = $dbase->prepare('SELECT "1"=? AS result');
$stmt->execute(array(1));
echo '(STRING == BOUNDINT) = ', ($stmt->fetchColumn() == 1 ? 'true' :
'false'), PHP_EOL;
Expected result:
----------------
(INT == BOUNDINT) = true
(STRING == BOUNDINT) = false
Actual result:
--------------
(INT == BOUNDINT) = false
(STRING == BOUNDINT) = true
--
Edit bug report at http://bugs.php.net/bug.php?id=54023&edit=1
--
Try a snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=54023&r=trysnapshot52
Try a snapshot (PHP 5.3): http://bugs.php.net/fix.php?id=54023&r=trysnapshot53
Try a snapshot (trunk): http://bugs.php.net/fix.php?id=54023&r=trysnapshottrunk
Fixed in SVN: http://bugs.php.net/fix.php?id=54023&r=fixed
Fixed in SVN and need be documented: http://bugs.php.net/fix.php?id=54023&r=needdocs
Fixed in release: http://bugs.php.net/fix.php?id=54023&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=54023&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=54023&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=54023&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=54023&r=support
Expected behavior: http://bugs.php.net/fix.php?id=54023&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=54023&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=54023&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=54023&r=globals
PHP 4 support discontinued: http://bugs.php.net/fix.php?id=54023&r=php4
Daylight Savings: http://bugs.php.net/fix.php?id=54023&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=54023&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=54023&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=54023&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=54023&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=54023&r=mysqlcfg