ID:               45259
 Updated by:       [email protected]
 Reported By:      ahp at byu dot edu
-Status:           Open
+Status:           Feedback
 Bug Type:         PDO related
 Operating System: Ubuntu 8.04
 PHP Version:      5.2.6
 New Comment:

Please try using this CVS snapshot:

  http://snaps.php.net/php5.2-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/




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

[2008-06-13 13:37:12] ahp at byu dot edu

After testing with the above-linked 5.3CVS version, the program works
as expected, so it appears that in the latest development version there
is a way to properly bind non-string variables.

Ideally, I'd like to be able to replace the explicit binding with the
more convenient hash-binding; that is, replace:
    $q->bindValue(':value', 2, PDO::PARAM_INT);
    $q->execute();
with:
    $q->execute(Array(':value'=>2));

However, when I try this with the latest snapshot, the program again
erroneously prints '3'.  Would it be possible for the variable type to
be deduced from the PHP variable subtype when the type isn't explicitly
specified?

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

[2008-06-13 12:59:57] [email protected]

Please try using this CVS snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows (zip):
 
  http://snaps.php.net/win32/php5.3-win32-latest.zip

For Windows (installer):

  http://snaps.php.net/win32/php5.3-win32-installer-latest.msi

5.3 now binds booleans and integers as the appropriate type, can you
try again with the CVS version.

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

[2008-06-13 12:44:46] ahp at byu dot edu

Description:
------------
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.

The example program prints '3', even though 2 is less than 3.  In fact,
it will always print "3" no matter what value is bound to the ':value'
parameter (with the exception of Null).

Although SQLite's type affinity system can automatically convert values
compared directly against a table column that has a type affinity, the
inability to bind non-string-typed values presents a problem with values
used in expressions, comparing against columns (especially computed
columns) in views and unions, and comparisons against columns that do
not have a type affinity.

My specific problem occurred when trying to filter for an ID value
against a key column through a view.  The only workaround I found on the
web is to not use bound parameters and prepared statements, but rather
construct the SQL string afresh.

Reproduce code:
---------------
#!/usr/bin/php
<script language="php">
$db=new PDO("sqlite:temp.db");
$q=$db->prepare("SELECT min(3, :value) AS result;");
$q->bindValue(':value', 2, PDO::PARAM_INT);
$q->execute();
$row=$q->fetch();
print $row['result']."\n";  // Always prints '3'
</script>



Expected result:
----------------
The program should print '2' since min(3, 2) is 2.

Actual result:
--------------
The program prints:
3


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


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

Reply via email to