我有一個函數可以檢索表示特定日期的商店的銷售報告的單行數據。我使用類似的方法來檢索整個相同類和應用程序中的數據,並且從未遇到過這個問題。我的函數(和fetch())返回false,而execute()返回true。爲什麼我的JOIN失敗?
當我運行從SQL編輯器蟾蜍相同的查詢,我得到的數據行早在預料。
爲什麼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);
}
UPDATE
看來,勞動JOIN的是失敗的某些原因。當我使用LEFT JOIN時,它返回一行 - 所有人工值都爲空。但是,我沒有在Toad for MySQL中看到這樣的結果,它會正確執行查詢的LEFT JOIN和JOIN版本並返回完整的行。
因此,新的問題是,爲什麼我不能加入我的PHP代碼PDO工作,但他們正在運行在蟾蜍SQL當工作在相同的數據,使用相同的參數?
(可能是)相關:[如何從PDO擠出錯誤消息?](http://stackoverflow.com/q/3726505) –
初看起來......你的'$ date'值是什麼樣的?它是否被格式化爲mysql'yyyy-mm-dd'字符串?或者它是一個PHP時間戳? –
**已解決** 我在生產服務器上而不是在我的開發服務器上愚蠢地運行我的Toad查詢。生產服務器有更多的數據。 因此,原來問題的答案是我應該使用LEFT JOIN而不是JOIN。 –