PDO和CASE声明

时间:2016-03-11 04:55:52

标签: php sql-server pdo case

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

为了确定字段是否填写,我写了以下内容:

$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尝试执行()时抛出异常。第二个语句导致此错误怎么办?

1 个答案:

答案 0 :(得分:2)

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

fab