|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2003-07-31 05:26 UTC] sm at grand-prix dot ru
Description:
------------
In some cases mysql_fetch_array returns numbered array element, but does'nt returns it's named copy.
This script was tested as a part of vbulletin's code.
Bug: in the first case $user[userid] is empty, but $user[0] contains correct data. For other user - 2'nd case - all is OK. Behavior depends from data, returned by mysql.
Reproduce code:
---------------
$query_string = "SELECT *,FROM_UNIXTIME(joindate) AS joindate,FROM_UNIXTIME(lastvisit) AS lastvisit,FROM_UNIXTIME(lastactivity) AS lastactivity,FROM_UNIXTIME(lastpost) AS lastpost,
avatar.avatarpath,NOT ISNULL(customavatar.avatardata) AS hascustomavatar
FROM user
LEFT JOIN avatar ON avatar.avatarid=user.avatarid
LEFT JOIN customavatar ON customavatar.userid=user.userid
WHERE user.userid=412";
$res = mysql_query($query_string,$link_id);
$user = mysql_fetch_array($res);
print_r($user);
$query_string = "SELECT *,FROM_UNIXTIME(joindate) AS joindate,FROM_UNIXTIME(lastvisit) AS lastvisit,FROM_UNIXTIME(lastactivity) AS lastactivity,FROM_UNIXTIME(lastpost) AS lastpost,
avatar.avatarpath,NOT ISNULL(customavatar.avatardata) AS hascustomavatar
FROM user
LEFT JOIN avatar ON avatar.avatarid=user.avatarid
LEFT JOIN customavatar ON customavatar.userid=user.userid
WHERE user.userid=287";
$res = mysql_query($query_string,$link_id);
$user = mysql_fetch_array($res);
print_r($user);
Expected result:
----------------
Array (
[0] => 412
[userid] => 412
[1] => 6
[usergroupid] => 6
[2] => SM_1
[username] => SM_1
.......
Array (
[0] => 287
[userid] => 287
[1] => 6
[usergroupid] => 6
[2] => SM
[username] => SM
.......
Actual result:
--------------
Array (
[0] => 412
[userid] =>
[1] => 6
[usergroupid] => 6
[2] => SM_1
[username] => SM_1
.......
Array (
[0] => 287
[userid] => 287
[1] => 6
[usergroupid] => 6
[2] => SM
[username] => SM
.......
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 28 10:00:01 2025 UTC |
As i mean, bug occurs when both tables (main and left joined) contains columns with equal names and left-joined table does'nt contain needed row. In the such case named array elements with names, equal to such column names are cleared. Here is test script : ------------------------------------------------------------ <?php error_reporting(7); $srv = "mysql.server.ru"; $usr = "username"; $pwd = "password"; $db = "database"; $link_id=mysql_connect($srv,$usr,$pwd); if (!$link_id) { echo "Can't connect to mysql server<br>"; exit; } if (!mysql_select_db($db, $link_id)) { echo "Can't connect to mysql server<br>"; exit; } if ($action == "create_bases") { $query = "CREATE TABLE test1table ( userid int(10) unsigned DEFAULT '0' NOT NULL auto_increment, usergroupid smallint(5) unsigned DEFAULT '0' NOT NULL, username varchar(50) NOT NULL, password varchar(50) NOT NULL, PRIMARY KEY(userid) )"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } $query = "CREATE TABLE test2table ( userid int(10) unsigned DEFAULT '0' NOT NULL, field1 char(250) NOT NULL, field2 char(250) NOT NULL, field3 char(250) NOT NULL, field4 char(250) NOT NULL, PRIMARY KEY (userid) )"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } $query = "INSERT INTO test1table VALUES (1,6,'user1','password1')"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } $query = "INSERT INTO test1table VALUES (2,6,'user2','password2')"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } $query = "INSERT INTO test2table VALUES (1,'dummy1','dummy2','dummy3','dummy4')"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } echo "<br>tables created and initialized<br>"; exit; } $query = "SELECT * FROM test1table LEFT JOIN test2table ON test2table.userid=test1table.userid WHERE test1table.userid=1"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } $array = mysql_fetch_array($query_id); print_r($array); echo "<br><br>"; mysql_free_result($query_id); $query = "SELECT * FROM test1table LEFT JOIN test2table ON test2table.userid=test1table.userid WHERE test1table.userid=2"; $query_id = mysql_query($query,$link_id); if (!$query_id) { echo "invalid SQL:<br>$query<br>"; exit; } $array = mysql_fetch_array($query_id); print_r($array); echo "<br><br>"; mysql_free_result($query_id); ?>