Mysql
PDO 在 WHERE 上使用列舉返回 0 行
我正在嘗試為報告建構查詢。該報告將有幾個可以過濾的欄位,其中一個是
jobStatus
欄位,它是一個列舉。這是我的查詢
SELECT * FROM jobs j LEFT JOIN property p ON j.propertyID = p.propertyID LEFT JOIN property_buildings b ON b.buildingID = j.buildingID LEFT JOIN departments d ON j.dptID = d.dptID LEFT JOIN jobs_timeframe jt ON j.jobTimeframeID = jt.jobTimeframeID LEFT JOIN jobs_type t ON j.jobTypeID = t.jobTypeID LEFT JOIN floors f ON f.floorID = j.floor LEFT JOIN ( SELECT group_concat(a.assetNo) AS assets, ja.jobID FROM jobs_assets ja INNER JOIN assets a ON a.assetID = ja.assetID GROUP BY jobID ORDER BY assetNo ASC ) ja ON ja.jobID = j.jobID LEFT JOIN ( SELECT group_concat(o.obsNo) AS observations, oj.jobID FROM observationJobs oj INNER JOIN observation o ON o.obsID = oj.obsID GROUP BY jobID ORDER BY obsNo ASC ) jo ON jo.jobID = j.jobID WHERE j.ClientID = :clientID AND j.jobStatus = :status LIMIT :limit OFFSET :offset
這是我的綁定參數: :clientID => 14, :status => ‘Draft’, :limit => 25, :offset => 0
如果我排除它,
j.jobStatus
它工作正常並顯示 19 個結果,其中包含 jobStatus 的混合Draft
,如果我使用 PDO 包括嘗試和過濾,Finished
我得到一個成功的查詢,但有零行(應該是 14 行,1行, 3 for和 1 null)Approved``j.jobStatus``Draft``Approved``Finished
如果我不安全地將 :status 的變數放在查詢中(像這樣
WHERE j.ClientID = :clientID AND j.jobStatus = '.$status.' LIMIT :limit OFFSET :offset
),它可以正常工作並顯示 14 個預期結果。我不能為我的生活弄清楚為什麼。我唯一能想到的是它與它是一個列舉有關,但我的印像是它們被視為除實際儲存之外的所有內容的字元串。
編輯:綁定程式碼:
$stmt->bindParam(':limit', $lim, PDO::PARAM_INT); $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); $stmt->bindParam(':status', $params[':status'], PDO::PARAM_STR); $stmt->bindParam(':clientID', $params[':clientID'], PDO::PARAM_INT);
原來這是我用來綁定參數的foreach循環,如stackoverflow上的this issue中所見
對於將來遇到類似問題的任何人,以下操作將失敗:
foreach($params AS $k => $v){ $stmt->bindParam($k, $v); }
因為 bindParam 在您呼叫它時實際上並沒有綁定它,它只是綁定了一個連結,
$v
因此它始終是循環的最後一項。為了克服這個問題,您需要通過引用傳遞參數,如下所示:foreach($params AS $k => &$v){ $stmt->bindParam($k, $v); }
注意 foreach 中的
&
before$v
,使其按預期工作。