Mysql

PDO 在 WHERE 上使用列舉返回 0 行

  • October 24, 2019

我正在嘗試為報告建構查詢。該報告將有幾個可以過濾的欄位,其中一個是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,使其按預期工作。

引用自:https://dba.stackexchange.com/questions/251832