PDO和案例陈述



在我正在构建的应用程序中,我需要检查用户是否在其个人资料上填写了某些字段,如果没有,请执行操作。

为了找出字段是否填写,我写了以下内容:

$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。由于用户将用户 ID 作为主键,因此每个用户 ID 不应有多个,因此返回计数 1 或 0,我可以将其用作真/假。

这奏效了,但我有兴趣看看我是否可以 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。

当给定用户 ID 并直接通过 SSMS 执行(通过复制查询并将 :userID 替换为实际用户 ID)时,第一个和第二个查询都有效。但是,在通过应用程序运行时,只有第一个查询有效。第二个查询失败,并显示以下错误:

'SQLSTATE[IMSSP]:尝试绑定参数编号 0。SQL Server 最多支持 2100 个参数。

根据堆栈跟踪,当PDO尝试执行()时会引发异常。导致此错误的第二条语句呢?

为什么需要一个嵌套的案例语句?如果计数大于零,则希望返回 1 和 0,否则返回 0。试试这个

$sql = "SELECT CASE WHEN count(*) > 0 THEN 1 
        ELSE 0 END AS userComplete FROM Users 
        WHERE userID = ':userID' 
        AND userField1 IS NOT NULL
        AND userField2 IS NOT NULL";

最新更新