我有一个函数来检索表示特定日期商店的销售报告的单行数据。我正在使用类似的方法在整个相同的类和应用程序中检索数据,并且从未遇到过这个问题。我的函数(和fetch())返回false,而execute()返回true。
当我从SQL编辑器在TOAD中运行相同的查询时,我按预期收到一行数据。
为什么fetch()失败了?注意:我也尝试了fetchAll(),它返回一个空集。我也尝试过不使用绑定参数,但这也不起作用。
以下是代码:
public function getFullReport($store_id, $date)
{
$pdo = $this->application->database()->PDO();
$user_id = $this->application->session()->user_id();
$query = <<<SQL
SELECT sales_reports.*,
labor2.hours AS labor_am,
labor3.hours AS labor_wa,
labor4.hours AS labor_associate,
labor5.hours AS labor_kitchen,
labor6.hours AS labor_training
FROM sales_reports
JOIN labor_reports AS labor2
ON sales_reports.store_id = labor2.store_id
AND sales_reports.date = labor2.date
AND labor2.labor_type_id = 2
JOIN labor_reports AS labor3
ON sales_reports.store_id = labor3.store_id
AND sales_reports.date = labor3.date
AND labor3.labor_type_id = 3
JOIN labor_reports AS labor4
ON sales_reports.store_id = labor4.store_id
AND sales_reports.date = labor4.date
AND labor4.labor_type_id = 4
JOIN labor_reports AS labor5
ON sales_reports.store_id = labor5.store_id
AND sales_reports.date = labor5.date
AND labor5.labor_type_id = 5
JOIN labor_reports AS labor6
ON sales_reports.store_id = labor6.store_id
AND sales_reports.date = labor6.date
AND labor6.labor_type_id = 6
JOIN user_store_permissions
ON sales_reports.store_id = user_store_permissions.store_id
WHERE sales_reports.store_id = :store_id
AND sales_reports.date = :date
AND user_store_permissions.user_id = :user_id
LIMIT 1
SQL;
$statement = $pdo->prepare($query);
$statement->bindParam(':store_id', $store_id);
$statement->bindParam(':date', $date);
$statement->bindParam(':user_id', $user_id);
$statement->execute();
return $statement->fetch(PDO::FETCH_ASSOC);
}
更新
由于某种原因,劳动力JOIN似乎失败了。当我使用LEFT JOIN时,它返回一行 - 所有的劳动值都为null。但是,我没有在Toad for MySQL中看到这个结果,它正确执行查询的LEFT JOIN和JOIN版本并返回整行。
所以新的问题是,为什么我的JOIN不能在我的PHP PDO代码中工作,但他们正在处理相同的数据,在Toad中运行SQL时使用相同的参数?
答案 0 :(得分:0)
看起来它可能与限制语句有关。我有一个相同的问题,使用PDO和一个非常简单的连接如下。
select e.id,e.name,c.id2
from espempdata e, espempclasses c
where e.empClass=c.id2 limit 50
它以limit语句失败,并在没有它的情况下传递。从命令行运行它。怪异。
答案 1 :(得分:-1)
对不起 - 我很久以前就解决了这个问题而忘记回答我自己的问题,因为Relequestual建议。
我认为问题在于我在远程MySQL服务器上运行Toad SQL查询,而PHP PDO语句是在我的本地MySQL服务器上运行的。当你长时间盯着屏幕时,这是一个愚蠢的典型头像!