В приложении, которое я создаю, мне нужно проверить, заполнил ли пользователь определенные поля в своем профиле, а если нет, выполните действие.Инструкции 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. Поскольку пользователи имеют идентификатор пользователя в качестве первичного ключа, никогда не должно быть больше одного из каждого идентификатора пользователя, таким образом возвращая счет 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";
Использование саза для сравнения рассчитывать до ожидаемых значений, я возвращаю только 1 или 0.
Когда задан идентификатор пользователя и выполняется непосредственно через SSMS (путем копирования запроса и замены: userID с фактическим идентификатором пользователя), работают как первый, так и второй запросы. Однако при запуске приложения работает только первый запрос. Второй запрос выдает следующее сообщение об ошибке:
'SQLSTATE[IMSSP]: Tried to bind parameter number 0. SQL Server supports a maximum of 2100 parameters.'
По трассировке стека, то исключение, когда PDO пытается выполнить(). Как насчет второго утверждения вызывает эту ошибку?
Может быть, 3-я строка имеет «КОНЕЦ КОНЕЦ». Я не слишком разбираюсь в делах sql, но это кажется странным с точки зрения проверки работоспособности. – Joshua
Нет необходимости в случае выбора. Ваш первый запрос отлично подходит и будет превосходить второй. – ryantxr
@ryantxr Полезно знать! Это было больше интереса, чем что-либо еще, - я видел другой способ сделать это, и мне было любопытно, будет ли это работать, и смутить, когда этого не произойдет. –