I've hit one more bump in the road of migrating from the old mysql_*()
functions to the new PDO class:
I have a the following table:
CREATE TABLE `test` (
`Id` tinyint(4) unsigned zerofill NOT NULL,
`UserName` varchar(4) NOT NULL,
`TestDecimal` decimal(6,0) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Note the zerofill'ed Id
and TestDecimal
fields.
If I run the following code, using the old mysql_*()
functions:
$SqlQuery = "SELECT * FROM test";
$Sql_Result = mysql_query($SqlQuery);
var_dump(mysql_fetch_array($Sql_Result));
I get the following output, with the correctly zerofilled Id
column:
array (size=6)
0 => string '0001' (length=4)
'Id' => string '0001' (length=4)
1 => string 'alex' (length=4)
'UserName' => string 'alex' (length=4)
2 => string '000002' (length=6)
'TestDecimal' => string '000002' (length=6)
However, if I do the same using PDO, like so:
$SqlQuery = "SELECT * FROM test";
$SqlResult = $MysqlPDO->prepare($SqlQuery);
$SqlResult->execute();
var_dump($SqlResult->fetch(PDO::FETCH_BOTH));
I get this output, with the incorrectly non-zerofilled Id
column:
array (size=6)
'Id' => int 1
0 => int 1
'UserName' => string 'alex' (length=4)
1 => string 'alex' (length=4)
'TestDecimal' => string '000002' (length=6)
2 => string '000002' (length=6)
It seems like the PDO class is looking at the column type and returning a matching variable type (integer in this case) in PHP.
After some searching I found out about the PDO::ATTR_STRINGIFY_FETCHES
attribute which can be set to force all MYSQL results to be return as strings, while this seems to work (I get a string instead of an int), it still doesn't return the leading zeros:
array (size=6)
'Id' => string '1' (length=1)
0 => string '1' (length=1)
'UserName' => string 'alex' (length=4)
1 => string 'alex' (length=4)
'TestDecimal' => string '000002' (length=6)
2 => string '000002' (length=6)
It seems to work correctly with the decimal(6,0) zerofill
field, but not with the tinyint(4) zerofill
field...
Is there any way to make this work, or will I have to go over my codebase and find out what breaks with this change (I already identified a couple of things which don't work anymore...)?
$ResultType
(infetch($ResultType)
)? – Bequeath$ResultType = PDO::FETCH_BOTH;
, I copy/pasted the code from a custom function I created and forgot to edit this out, thanks for noticing, I don't think it makes any difference though... I'll modify the question – Borzoicreate table
query? – Titty0001
and1
equals in type and content (===
). – DithioniteId
field zerofilled in both outputs? – Borzoiphp.ini
andmy.cnf
files? Thanks! – Borzoiid
. only difference i have found so far in my code:var_dump($SqlResult->fetchAll());
– MonsoonMySQL 5.1.73
,PHP 5.3.3-7+squeeze19
– Monsoonvar_dump((new mysqli('localhost', $db_username, $db_password, $db_name))->query($SqlQuery)->fetch_all());
? – Titty