[ACCEPTED]-How to get numeric types from MySQL using PDO?-pdo
To answer your last question first, "yes," unfortunately 9 it's normal to receive numbers as strings. As 8 the manual quoted by Pascal says, mysqlnd 7 (PHP 5.3) will return native data types 6 from prepared statements, provided you turn 5 off the prepared statement emulation from 4 PDO.
new PDO($dsn, $user, $pass, array( PDO::ATTR_EMULATE_PREPARES => false ))
PDO::ATTR_STRINGIFY_FETCHES is unrelated 3 to MySQL.
If you look at the bright side, it's 2 good practice to use prepared statements 1 anyway, so... ;)
I don't think having "numbers" can 18 be done in PHP 5.2 :-(
In PHP 5.3, it becomes 17 possible, if I remember correctly, when 16 you are using the new (new as in PHP >= 5.3) mysqlnd (MySQL Native Driver) driver.
Well, after 15 more digging through my bookmarks I found 14 this article about mysqlnd :
PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3
It says this 13 (quote) :
Advantages of using mysqlnd for PDO
mysqlnd returns native data types 12 when using Server-side Prepared Statements, for 11 example an INT column is returned as an 10 integer variable not as a string. That 9 means fewer data conversions internally.
But 8 this is PHP 5.3 only (provided your version 7 of PHP 5.3 is compiled with mysqlnd (and not old libmysql)), and 6 seems to only be the case for prepared statements 5 :-(
A solution would be to have, on 4 the PHP-side, a mapping-system (like an ORM -- see Doctrine ; just as an example of ORM : I don't know if it does what you're asking) to convert 3 results coming from the DB to PHP datatypes...
And 2 yes, this is bad if you want to use operators 1 like
!==, which are type-sensitive...
Pascal's answer is correct. I had some trouble it making 16 it all work. Here is what you need to do.
First, make 15 sure you have mysqlnd installed and activated. Look 14 at
php --info. In the pdo_mysql section, it should 13 look like:
pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321
If instead of seeing
mysqlnd in the Client 12 API version, you see a line like...
Client API version => 5.5.29
...then 11 you don't have mysqlnd installed and going. Take 10 care of that first.
Second, PDO uses emulated 9 prepared statements by default for all MySQL connections. Ridiculous, but 8 there it is. And you will get native data 7 types only if you use real prepared statements 6 (called "server-side prepared statements" in 5 the linked blog post, which is now here). So 4 you must set PDO::ATTR_EMULATE_PREPARES 3 to false, like so:
Lastly, make sure that 2 you have not set PDO::ATTR_STRINGIFY_FETCHES 1 to true.
You might have
mysqlnd installed, but it doesn't 7 mean it is ready for use by the regular 6
(pdo_mysql), this is more often the case 5 on shared hosting, so make sure to enable 4 the
nd_pdo_mysql extension, and also to disable other 3 extension
pdo_mysql as it might create an conflict.
I 2 found this (duplicate) question, decided to post 1 my thoughts here, hope its fine ;)
More Related questions