从数据库中检索到错误的数据

时间:2012-10-30 22:57:30

标签: php mysql database

所以,我想检索列表元素的顺序。订单由用户设置,并存储在下表中。因为我还想检索列表元素的名称和描述,我需要组合两个表(见下文)。

然而,实际检索的是一个包含16个元素的数组(应该是4个因为它现在只存在4个元素)。数组太长了,无法在此发布,但如果您有兴趣,我会把它放在phpFiddle to be found here中。

好吧,我确实试图找到错误的东西(可能一如既往的容易),但没有运气。

非常感谢您的时间和帮助!

listModel.php:

public function GetOrderedElements($userId, $listId) {

// $userId = 46
// $listId = 1

        $query = "SELECT le.listElemId, le.listElemName, le.listElemDesc, lo.listElemOrderPlace
                    FROM listElement AS le
                    INNER JOIN listElemOrder AS lo
                    ON le.listId = lo.listId
                    WHERE lo.userId = ?
                    AND lo.listId = ?
                    ORDER BY listElemId";

        $stmt = $this->m_db->Prepare($query);

        $stmt->bind_param("ii", $userId, $listId);

        $listElements = $this->m_db->GetOrderedElements($stmt);

        return $listElements;       
    }

database.php中:

public function GetOrderedElements(\mysqli_stmt $stmt) {

        if ($stmt === FALSE) {
                throw new \Exception($this->mysqli->error);
        }

        if ($stmt->execute() == FALSE) {
                throw new \Exception($this->mysqli->error);
        }

        if ($stmt->bind_result($listElemId, $listElemName, $listElemDesc, $listElemOrderPlace) == FALSE) {
            throw new \Exception($this->mysqli->error);
        }

        $listElements = array();

        while ($stmt->fetch()) {
            $listElements[] = array('listElemId' => $listElemId,
                                 'listElemName' => $listElemName,
                                 'listElemDesc' => $listElemDesc,
                                 'listElemOrderPlace' => $listElemOrderPlace);
        }

        var_dump($listElements);

        $stmt->Close();

        return $listElements;
    }
来自数据库的

listElemOrder

listElemOrderId | listId | listElemId | userId | listElemOrderPlace
      1              1          1          46           1
      4              1          2          46           4
      2              1          3          46           2
      3              1          4          46           3

listElement

listElemId | listElemName | listId | listElemDesc | listElemOrderPlace
      1          Elem A         1         Derp             NULL
      2          Elem B         1         Herp             NULL
      3          Elem C         1         Lorum            NULL
      4          Elem D         1         Ipsum            NULL

注意: listElement 中的'listElemOrderPlace'是元素的最终顺序(所有用户的平均值),不能与具有相同名称的元素混合使用在另一个表中,这只是列表元素的特定用户的顺序(在这种情况下这是有趣的)。

1 个答案:

答案 0 :(得分:1)

您忘了将listElemId添加到加入条件中:

FROM listElement AS le
INNER JOIN listElemOrder AS lo
ON le.listId = lo.listId
AND le.listElemId = lo.listElemId  -- add this criterion

由于列在两个表中的名称相同,因此您可以缩写为:

FROM listElement AS le
INNER JOIN listElemOrder AS lo
USING (listId, listElemId)

第二种形式还有一个优点,即在实际上没有歧义的情况下避免出现“模糊列”错误。