[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 :-(
Sorry...
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 ===
and !==
, 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:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Lastly, make sure that 2 you have not set PDO::ATTR_STRINGIFY_FETCHES 1 to true.
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
You might have mysqlnd
installed, but it doesn't 7 mean it is ready for use by the regular 6 PDO
extension (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.
@screenshot
I 2 found this (duplicate) question, decided to post 1 my thoughts here, hope its fine ;)
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.