【问题标题】:first value in associative query result array is wrong关联查询结果数组中的第一个值是错误的
【发布时间】: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.idR.id

标签: php mysql pdo fetch associative-array


【解决方案1】:

id 键是指查询中 R.id 的值。您需要为查询中的字段名称设置别名,以便它们都是唯一的。

例如:

SELECT A.id AS A_id, .... ,R.id AS R_id ....

然后,您的 assoc 数组将具有 A_idR_id 作为具有适当值的键。

【讨论】:

  • 谢谢,我会尝试更改我的查询,如果可行,请接受您的回答。
猜你喜欢
  • 1970-01-01
  • 2015-03-16
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2013-06-21
相关资源
最近更新 更多