【发布时间】:2011-08-11 20:35:38
【问题描述】:
我有一个函数可以检索代表商店在特定日期的销售报告的单行数据。我正在使用类似的方法来检索同一类和应用程序中的数据,并且从未遇到过这个问题。我的函数(和 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 时,它返回一行 - 所有劳动力值都为空。但是,我在 Toad for MySQL 中没有看到此结果,它正确执行查询的 LEFT JOIN 和 JOIN 版本并返回整行。
所以新的问题是,为什么我的 JOIN 在我的 PHP PDO 代码中不起作用,但它们在 Toad 中运行 SQL 时使用相同的参数处理相同的数据?
【问题讨论】:
-
乍一看……你的
$date值是什么样的?它是否正确格式化为 mysqlyyyy-mm-dd字符串?还是 PHP 时间戳? -
已解决 我愚蠢地在我的生产服务器上而不是在我的开发服务器上运行我的 Toad 查询。生产服务器有更多数据。所以,原始问题的答案是我应该使用 LEFT JOIN 而不是 JOIN。
-
PEBKAC 再次出击...有人应该采取措施消除该问题中的中间人...
-
Kyle,如果你已经解决了这个问题,我相信你应该自己回答这个问题并选择它作为答案(因为它让人们一眼就知道问题已经解决了)恭喜你自己解决了问题,而不仅仅是在此处发布后放弃。 =]