【问题标题】:Zend db PDO not returning resultZend db PDO 不返回结果
【发布时间】:2013-01-28 02:34:48
【问题描述】:

我遇到以下问题:

$sql = "SELECT e.*, c.name city_name, u.*, IF(l.item IS NULL, 0, 1) as iLike, DATE_FORMAT(e.date, '%h:%i') hour, DATE_FORMAT(e.date, '%d/%c/%Y') day,  DATE_FORMAT(e.date, '%c') month
FROM `events` e
LEFT OUTER JOIN `like` l ON l.item = e.uuid AND l.user = :user
            LEFT OUTER JOIN city c ON c.city = e.city
            LEFT OUTER JOIN user u ON u.user = e.user
            WHERE
             e.deleted = 0
            AND DATE(e.date) >= CURDATE()
            AND e.user = :user
            ORDER by e.date ASC
            ";
    $select = $eventsModel->getAdapter();
    $select->setFetchMode(Zend_Db::FETCH_ASSOC);
    $prepare = $select->query($sql, array('user'=>$this->user_id));

如果我将 :user 硬编码到查询中,此代码将返回结果。示例:

$sql = "SELECT e.*, c.name city_name, u.*, IF(l.item IS NULL, 0, 1) as iLike, DATE_FORMAT(e.date, '%h:%i') hour, DATE_FORMAT(e.date, '%d/%c/%Y') day,  DATE_FORMAT(e.date, '%c') month
            FROM `events` e
            LEFT OUTER JOIN `like` l ON l.item = e.uuid AND l.user = 23
            LEFT OUTER JOIN city c ON c.city = e.city
            LEFT OUTER JOIN user u ON u.user = e.user
            WHERE
             e.deleted = 0
            AND DATE(e.date) >= CURDATE()
            AND e.user = 23
            ORDER by e.date ASC
            ";
    $select = $eventsModel->getAdapter();
    $select->setFetchMode(Zend_Db::FETCH_ASSOC);
    $prepare = $select->query($sql);

这只是在我们将代码移动到新服务器时才开始发生的, 新操作系统是 Debian 6、squeze、mysql 5.5、PHP 5.3.21。

谢谢,

【问题讨论】:

    标签: php mysql zend-framework pdo


    【解决方案1】:

    ?代替:user,用$this->user_id代替array('user'=>$this->user_id)

    另外,JOIN语句中不能绑定数据,所以l.user = e.user

    $sql = "SELECT e.*, c.name city_name, u.*, IF(l.item IS NULL, 0, 1) as iLike, DATE_FORMAT(e.date, '%h:%i') hour, DATE_FORMAT(e.date, '%d/%c/%Y') day,  DATE_FORMAT(e.date, '%c') month
                FROM `events` e
                LEFT OUTER JOIN `like` l ON l.item = e.uuid AND l.user = e.user
                LEFT OUTER JOIN city c ON c.city = e.city
                LEFT OUTER JOIN user u ON u.user = e.user
                WHERE
                 e.deleted = 0
                AND DATE(e.date) >= CURDATE()
                AND e.user = ?
                ORDER by e.date ASC
                ";
        $select = $eventsModel->getAdapter();
        $select->setFetchMode(Zend_Db::FETCH_ASSOC);
        $prepare = $select->query($sql, array($this->user_id));
    

    【讨论】:

    • 不幸的是,这是不可行的,应该重写整个代码库以适应这种变化。我们知道这是可行的。
    • 另外,另一个有趣的事情是,如果我们只使用 :user 一次,而不是在 mysql 查询中使用 2 次,则查询有效。
    • 哦,我没有注意到用户被使用了两次,你需要在你的参数数组中声明2个元素:array('user'=>$this->user_id,'l.user'=>$this->user_id),或者array($this->user_id, $this->user_id)
    • 一般来说,我可以通过以正确的方式修改查询来解决问题,l.user = e.user。但是这个问题也开始出现在我们不使用相同代码的其他地方。我们想知道发生了什么变化。或者一般问题是什么,为什么以前有效,现在无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2013-09-27
    • 2012-11-21
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多