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