【发布时间】:2014-10-07 08:49:44
【问题描述】:
这真的很奇怪……如果 pdo fetch 模式是 assoc,它会返回错误的 id 列值。如果 mode 是两者,它返回错误的 'id' 值,但 [0] 很好。 表结构
mysql> describe itemweap;
+---------------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-----------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| userID | int(11) | NO | | NULL | |
| Tier | int(1) | NO | | NULL | |
| damage | int(7) unsigned | NO | | NULL | |
| MaxUpgrades | int(2) | NO | | NULL | |
| CurrentUpgradeLevel | int(2) | NO | | NULL | |
| heroID | int(1) unsigned | NO | | NULL | |
| status | int(1) unsigned | NO | | NULL | |
| hash | char(32) | NO | PRI | NULL | |
+---------------------+-----------------+------+-----+---------+-------+
代码
function performSingleQuery($DBH, $query,$data) {
$STH = $DBH->prepare($query);
if (!isset($STH))
echo "STH NOT SET<br />";
else if ($STH) {
try {
if (isset($data))
$STH->execute($data);
else $STH->execute();
if ($STH->errorCode()[2] == 0) {
return $STH->fetchAll();
}
else return null;
}
catch (PODexception $e) {
echo $e->errorInfo;
return null;
}
}
return null;
}
function performQueryAndGenerateTable($isSearchSpecific, $query, $exNTAR, $DBH,
$isProfile, $tableName, $title, $mode) {
$rows = performSingleQuery($DBH, $query, null);
print_r($rows); //checking values here
...
}
查询示例:
SELECT A.id, A.userID, A.tier, A.damage, A.maxupgrades, A.heroID, A.CurrentUpgradeLevel, c.herohealth, d.heropower , e.herospellcastrate, f.heromovementspeed, g.herooffabpow, h.herodefabpow, i.itemweapeledmg, j.itemaddproj, k.defencehealth, L.defencepower, M.defencerange, N.defencespeed, O.itemweaprangedaltdmg, R.id, S.notes
from itemweap A
left join herohealth C on (C.id = A.id)
left join heropower D on (D.id = A.id)
left join herospellcastrate E on (E.id = A.id)
left join heromovementspeed F on (F.id = A.id)
left join herooffabpow G on (G.id = A.id)
left join herodefabpow H on (H.id = A.id)
left join itemweapeledmg I on (I.id = A.id)
left join itemaddproj J on (J.id = A.id)
left join defencehealth K on (K.id = A.id)
left join defencepower L on (L.id = A.id)
left join defencerange M on (M.id = A.id)
left join defencespeed N on (N.id = A.id)
left join itemweaprangedaltdmg O on (O.id = A.id)
left join users R on (R.id = A.userID)
left join notes S on (S.id = A.id) WHERE A.userID = 4 AND A.status = 1;
此查询结果来自 mysql 控制台 http://i.imgur.com/hywrvC3.jpg(非常宽的图片) id 列在这里很好。 print_r 输出
Array ( [0] => Array ( [id] => 4 [userID] => 4 [tier] => 2 [damage] => 2 [maxupgrades] => 5 [heroID] => 3 [CurrentUpgradeLevel] => 5 [herohealth] => [heropower] => [herospellcastrate] => [heromovementspeed] => [herooffabpow] => [herodefabpow] => [itemweapeledmg] => 33 [itemaddproj] => [defencehealth] => [defencepower] => 55 [defencerange] => [defencespeed] => [itemweaprangedaltdmg] => [notes] => sdasdawdasdasda )
[1] => Array ( [id] => 4 [userID] => 4 [tier] => 2 [damage] => 155 [maxupgrades] => 5 [heroID] => 3 [CurrentUpgradeLevel] => 5 [herohealth] => [heropower] => [herospellcastrate] => [heromovementspeed] => [herooffabpow] => [herodefabpow] => [itemweapeledmg] => 55 [itemaddproj] => [defencehealth] => [defencepower] => 5 [defencerange] => [defencespeed] => [itemweaprangedaltdmg] => [notes] => )
[2] => Array ( [id] => 4 [userID] => 4 [tier] => 2 [damage] => 1200 [maxupgrades] => 3 [heroID] => 4 [CurrentUpgradeLevel] => 3 [herohealth] => 12 [heropower] => [herospellcastrate] => [heromovementspeed] => [herooffabpow] => [herodefabpow] => [itemweapeledmg] => 259 [itemaddproj] => 4 [defencehealth] => [defencepower] => [defencerange] => [defencespeed] => [itemweaprangedaltdmg] => 16 [notes] => ) )
Id 值在每一行都被破坏。 但是如果我将 fetch 模式更改为两者,print_r 会给我
Array ( [0] => Array ( [id] => 4 [0] => 90 [userID] => 4 [1] => 4 [tier] => 2 [2] => 2 [damage] => 2 [3] => 2 [maxupgrades] => 5 [4] => 5 [heroID] => 3 [5] => 3 [CurrentUpgradeLevel] => 5 [6] => 5 [herohealth] => [7] => [heropower] => [8] => [herospellcastrate] => [9] => [heromovementspeed] => [10] => [herooffabpow] => [11] => [herodefabpow] => [12] => [itemweapeledmg] => 33 [13] => 33 [itemaddproj] => [14] => [defencehealth] => [15] => [defencepower] => 55 [16] => 55 [defencerange] => [17] => [defencespeed] => [18] => [itemweaprangedaltdmg] => [19] => [20] => 4 [notes] => sdasdawdasdasda [21] => sdasdawdasdasda )
[1] => Array ( [id] => 4 [0] => 91 [userID] => 4 [1] => 4 [tier] => 2 [2] => 2 [damage] => 155 [3] => 155 [maxupgrades] => 5 [4] => 5 [heroID] => 3 [5] => 3 [CurrentUpgradeLevel] => 5 [6] => 5 [herohealth] => [7] => [heropower] => [8] => [herospellcastrate] => [9] => [heromovementspeed] => [10] => [herooffabpow] => [11] => [herodefabpow] => [12] => [itemweapeledmg] => 55 [13] => 55 [itemaddproj] => [14] => [defencehealth] => [15] => [defencepower] => 5 [16] => 5 [defencerange] => [17] => [defencespeed] => [18] => [itemweaprangedaltdmg] => [19] => [20] => 4 [notes] => )
[2] => Array ( [id] => 4 [0] => 83 [userID] => 4 [1] => 4 [tier] => 2 [2] => 2 [damage] => 1200 [3] => 1200 [maxupgrades] => 3 [4] => 3 [heroID] => 4 [5] => 4 [CurrentUpgradeLevel] => 3 [6] => 3 [herohealth] => 12 [7] => 12 [heropower] => [8] => [herospellcastrate] => [9] => [heromovementspeed] => [10] => [herooffabpow] => [11] => [herodefabpow] => [12] => [itemweapeledmg] => 259 [13] => 259 [itemaddproj] => 4 [14] => 4 [defencehealth] => [15] => [defencepower] => [16] => [defencerange] => [17] => [defencespeed] => [18] => [itemweaprangedaltdmg] => 16 [19] => 16 [20] => 4 [notes] => [21] => ) )
关联部分又错了,但索引部分没问题。如何让 fetch_assoc 返回正确的值?
【问题讨论】:
-
怎么回事?如果您只考虑关联键,则数组看起来相同。如果你得到“错误”的值,那么你的查询做错了。更改获取模式不会改变结果。它只是改变了你从 fetch 调用中得到的东西。
-
id 值为 4,但如果我从 mysql 控制台运行此查询,它的 90,91 和 83(在屏幕截图上)
-
您的 SELECT 中有 2 列将在输出数组中命名为“id”,
A.id和R.id。
标签: php mysql pdo fetch associative-array