Bug #44639 [Com]: PDO quotes integers in prepared statement

From: Date: Wed, 05 Dec 2012 04:02:03 +0000
Subject: Bug #44639 [Com]: PDO quotes integers in prepared statement
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-175122@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=44639&edit=1

 ID:                 44639
 Comment by:         alek0585 at mail dot ru
 Reported by:        jgauld at blueyonder dot co dot uk
 Summary:            PDO quotes integers in prepared statement
 Status:             Open
 Type:               Bug
 Package:            PDO related
 Operating System:   *
 PHP Version:        5.*
 Block user comment: N
 Private report:     N

 New Comment:

Yeah! Try this $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); and you can 
use that!
foreach($data as $key => $value) {
            $stmt->bindParam( ":".$key, $value, (is_int($value) ? PDO::PARAM_INT : 
PDO::PARAM_STR));
        }
but you should be careful with types of vars


Previous Comments:
------------------------------------------------------------------------
[2012-03-12 10:15:44] alvaro at demogracia dot com

This only happens on emulated parameter binding, i.e. when PDO::ATTR_EMULATE_PREPARES is TRUE.

------------------------------------------------------------------------
[2012-02-25 06:28:34] preludeinz at gmail dot com

Please fix! I can't do my course's lab exercise (without introducing a SQL 
injection vulnerability) without this feature.

------------------------------------------------------------------------
[2012-01-13 19:50:40] engin at e-php dot net

It's really sad seeing this aged bug is not gonna fixed.

------------------------------------------------------------------------
[2011-12-13 22:33:36] stephen-d at rogers dot com

I am surprised that something this simple has been unfixed for so long.

I wasted 8 hours trying to figure out "my" mistake. Thinking that it was a PDO bug was
inconceivable.

I finally turned on MySQL logging and saw that the numeric argument was being enclosed in quotes. I
posted to a web site for help and a kind person sent me this link.

For others struggling with this, the work-around is to type caste all numeric values that will
passed to PBO.

------------------------------------------------------------------------
[2011-04-27 20:24:08] riksoft at gmail dot com

Php-cli V. 5.3.1: 

I see that if no PDO::PARAM_* is used PDO use variable type.
E.g.
$sth->bindValue(6, $checksum, PDO::PARAM_INT);
or
$sth->bindValue(6, $checksum);
correctly treat the value $checksum (CRC32 int) as a number

>>>> BUT <<<<

there is a problem with unsigned integer: according to
http://it.php.net/manual/en/pdo.constants.php
there isn't any useful costant for larger numeric value.

Real case: The only way to store a crc32 value among different DBs and platforms (32/64 bit) is
converting CRC32 to unsigned int this way sprintf("%u",crc32). But PDO::PARAM_INT is not
able to handle values larger than 2147483647.
Solution: security of inputs by floatval() (at least when bindvalue dont write as a string which is
not my case).

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


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

    https://bugs.php.net/bug.php?id=44639


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


Thread (25 messages)

« previous php.bugs (#175122) next »