php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #47832 Garbled associative array indices
Submitted: 2009-03-29 20:17 UTC Modified: 2009-03-30 17:50 UTC
From: r dot borschel at gmx dot net Assigned: mysql (profile)
Status: Not a bug Package: PDO related
PHP Version: 5.3CVS-2009-03-29 (snap) OS: OS X 10.5.6
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: r dot borschel at gmx dot net
New email:
PHP Version: OS:

 

 [2009-03-29 20:17 UTC] r dot borschel at gmx dot net
Description:
------------
Associative array indices are getting garbled when usind pdo_mysql when mysql & pdo_mysql were compiled against libmysql. Compiling against mysqlnd fixes the issue.

Reproduce code:
---------------
#
# SQL
#

CREATE TABLE IF NOT EXISTS `cms_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `doctrinetests`.`cms_users` (
`id` ,
`status` ,
`username` ,
`name`
) VALUES (NULL , 'developer', 'romanb', 'Roman');

#
# PHP
#
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "xxx", "xxx");

$stmt = $pdo->prepare("SELECT c0.id AS c0__id, c0.status AS c0__status, c0.username AS c0__username, c0.name AS c0__name FROM cms_users c0");

$stmt->execute();

while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    var_dump($data);
}

Expected result:
----------------
array(6) {
  ["c0__id"]=>  string(2) "16"
  ["c0__status"]=>  string(9) "developer"
  ["c0__username"]=>  string(6) "romanb"
  ["c0__name"]=>  string(5) "Roman"
}  

Actual result:
--------------
array(6) {
  ["c0__id"]=>  string(2) "16"
  ["status"]=>  string(9) "developer"
  ["c0"]=>  string(6) "romanb"
  ["cms_users"]=>  string(5) "Roman"
}  

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-03-29 20:19 UTC] r dot borschel at gmx dot net
The INSERT statement should of course read:

INSERT INTO `testdb`.`cms_users` (
`id` ,
`status` ,
`username` ,
`name`
) VALUES (NULL , 'developer', 'romanb', 'Roman');
 [2009-03-30 11:44 UTC] johannes@php.net
Which MySQL server and client library versions are you using? - I tested using 5.1.31 worked for me:

$ sapi/cli/php --ri pdo_mysql

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => 5.1.31

$ sapi/cli/php bug47832.php
array(4) {
  ["c0__id"]=>
  string(1) "1"
  ["c0__status"]=>
  string(9) "developer"
  ["c0__username"]=>
  string(6) "romanb"
  ["c0__name"]=>
  string(5) "Roman"
}

 [2009-03-30 12:35 UTC] r dot borschel at gmx dot net
$ sapi/cli/php --ri pdo_mysql

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => 5.0.38

Thats a bit strange, isnt it? My configure looks like this:

'./configure' \
...
'--with-mysql=/usr/local/mysql-5.1.32-osx10.5-x86' \
'--with-pdo-mysql=/usr/local/mysql-5.1.32-osx10.5-x86' \
...
 
That version mismatch may be the problem? Am I doing something obviously wrong?

Thanks for your help.
 [2009-03-30 14:27 UTC] johannes@php.net
hm, interesting mixup, can you try doing

ldd sapi/cli/php | grep mysql

to see which libmysql is being loaded?
 [2009-03-30 14:35 UTC] johannes@php.net
don't have a mac at hand, if ldd doesn't work try "otool -L" ("which is part of the developer tools")
 [2009-03-30 15:55 UTC] r dot borschel at gmx dot net
That's interesting. Here is the output:

$ otool -L sapi/cli/php | grep mysql
	/sw/lib/mysql/libmysqlclient.15.dylib (compatibility version 16.0.0, current version 16.0.0)

So the libmysql getting loaded is from Fink (/sw is the root directory of Fink). Clearly this is not what I wanted. Here is my complete configure listing:

'./configure' \
'--prefix=/usr/local/php-5.3' \
'--with-apxs2=/usr/local/apache2.2.9/bin/apxs' \
'--enable-exif' \
'--with-gd' \
'--with-jpeg-dir=/sw' \
'--with-png-dir=/sw' \
'--enable-mbstring' \
'--with-mcrypt=/sw' \
'--with-mhash=/sw' \
'--with-iconv' \
'--with-mysql=/usr/local/mysql-5.1.32-osx10.5-x86' \
'--with-pdo-mysql=/usr/local/mysql-5.1.32-osx10.5-x86' \
'--with-pdo-pgsql=/usr/local/pgsql' \
'--with-pgsql=/usr/local/pgsql/' \
'--with-curl=/sw' \
'--with-zlib-dir=/sw' \
'--enable-soap' \
'--enable-sqlite-utf8' \
'--enable-zip' \

As you can see I'm using Fink libraries for some of the dependencies but clearly not for mysql. It seems, however, that the Fink libmysql is chosen anyway for whatever reason (/sw paths are prepended to the $PATH so maybe that has something to do with it)

It's good to see that this issue is rather caused by a "version mess" on my side even though the resulting behavior is a bit scary because it does not indicate any errors, just garbled results.

Thanks for helping me resolve this issue. As far as I am concerned this does not seem like a PHP-related issue and I guess unpredictable behavior is supposed to be expected when using incompatible versions.

Feel free to close this issue if you think it does not deserve any further attention.
 [2009-03-30 17:50 UTC] johannes@php.net
You might try setting the DYLD_LIBRARY_PATH environment variable to have the path to mysql first when starting PHP.

What happens is that PHP asks the system's dynamic loader to load libmysqlclient, the dynamic loader has a list of directories to choose from and looks for one after another for that file and loads it. See the dyld(1) and elated manpages for details on that.

Setting to bogus as this is more an issue from the system than PHP.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Apr 23 06:01:30 2024 UTC