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