我正在尝试为报告构建查询。报表会有几个字段可以过滤,其中一个是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 为和 1 为空)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中所示
对于将来遇到类似问题的任何人,以下操作将失败:
因为 bindParam 在您调用它时实际上并没有绑定它,它只是绑定了一个链接,
$v
因此它始终是循环的最后一项。为了克服这个问题,您需要按如下方式通过引用传递参数:注意 foreach 中的
&
before$v
,使其按预期工作。