在我构建的应用程序中,我需要检查用户是否填写了其个人资料中的某些字段,如果没有,请执行操作。
为了确定字段是否填写,我写了以下内容:
$sql = "SELECT count(*) AS userComplete FROM Users
WHERE userID = :userID
AND userField1 IS NOT NULL
AND userField2 IS NOT NULL";
$stmt = $this->_db->prepare($sql);
$stmt->bindValue(':userID', $this->_userID, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchColumn(0); //Returning a single column
$this->_user_profile_complete = $result;
查询返回单个列userComplete。由于Users将userID作为主键,因此每个userID永远不应超过一个,因此返回1或0的计数,我可以将其用作true / false。
这很有用,但我很想知道我是否可以100%确定我只会得到1或0.所以我这样修改了我的查询:
$sql = "SELECT CASE WHEN count(*) > 0 THEN 1
ELSE CASE WHEN count(*) = 0 THEN 0
ELSE 0 END END AS userComplete FROM Users
WHERE userID = ':userID'
AND userField1 IS NOT NULL
AND userField2 IS NOT NULL";
使用CASE语句将计数与预期值进行比较,我只返回1或0。
当给定userID并直接通过SSMS执行时(通过复制查询,并将userID替换为实际的userID),第一个和第二个查询都有效。但是,在应用程序中运行时,只有第一个查询有效。第二个查询失败,并显示以下错误:
' SQLSTATE [IMSSP]:尝试绑定参数编号0. SQL Server最多支持2100个参数。'
根据堆栈跟踪,当PDO尝试执行()时抛出异常。第二个语句导致此错误怎么办?
答案 0 :(得分:2)
为什么需要嵌套的case语句?如果计数大于零,则要返回1,否则返回0。试试这个
fab