php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #41027 Executing prepared statement changes type of bound parameters to string
Submitted: 2007-04-09 14:31 UTC Modified: 2009-10-26 22:10 UTC
Votes:5
Avg. Score:4.6 ± 0.8
Reproduced:3 of 3 (100.0%)
Same Version:3 (100.0%)
Same OS:1 (33.3%)
From: martin at bangaroo dot net Assigned:
Status: Wont fix Package: PDO related
PHP Version: 5.*, 6CVS (2009-04-27) OS: Gentoo Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: martin at bangaroo dot net
New email:
PHP Version: OS:

 

 [2007-04-09 14:31 UTC] martin at bangaroo dot net
Description:
------------
Executing a prepared statement changes the type of bound parameters 
to string (Tested only with pgsql driver).

This bite me when I wanted to execute an insert statement only when 
the double value to be inserted actually changed, NULL being a 
possible value. Unfortunatly, comparing the new value with the old 
value with the !== operator didn't work, because the type-change 
made the test always evaluate to TRUE.


Reproduce code:
---------------
<?php
  $db = new PDO("pgsql:host=localhost dbname=test user=dummy");

  $db->query("CREATE TABLE test_table ( val REAL )");
  $qry = $db->prepare("INSERT INTO test_table VALUES (:val)");
  $qry->bindParam(":val",$bound_val);

  $bound_val = 5.2;
  echo "Type before execute(): ".gettype($bound_val)."\n";
  $qry->execute();
  echo "Type after execute(): ".gettype($bound_val)."\n";

  $db->query("DROP TABLE test");
?>

Expected result:
----------------
Type before execute(): double
Type after execute(): double


Actual result:
--------------
Type before execute(): double
Type after execute(): string


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-04-26 18:30 UTC] martin at bangaroo dot net
I just checked with the snapshot php5.2-200904261630.

Unfortunately the bug still exists.
 [2009-04-27 20:47 UTC] martin at bangaroo dot net
Same result with php5.3-200904271830:

Bug still present.
 [2009-09-22 17:57 UTC] sjoerd@php.net
Thank you for your bug report.

A workaround would be to use bindValue instead of bindParam.
 [2009-10-26 22:10 UTC] hradtke@php.net
This behavior is made clear from the documentation:
- bindParam() keeps a reference to the variable
- the third parameter to bindParam() is $data_type, which defaults to PDO::PARAM_STR.

Thus, when execute() is called, the variable is changed a type of $data_type.

There does not appear to be a PDO::PARAM_FLOAT or PDO::PARAM_DOUBLE.  If that is your complaint, then please open a feature request for PDO.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 27 03:01:28 2024 UTC