2016-03-11 2 views
-1

В приложении, которое я создаю, мне нужно проверить, заполнил ли пользователь определенные поля в своем профиле, а если нет, выполните действие.Инструкции 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 пытается выполнить(). Как насчет второго утверждения вызывает эту ошибку?

+0

Может быть, 3-я строка имеет «КОНЕЦ КОНЕЦ». Я не слишком разбираюсь в делах sql, но это кажется странным с точки зрения проверки работоспособности. – Joshua

+0

Нет необходимости в случае выбора. Ваш первый запрос отлично подходит и будет превосходить второй. – ryantxr

+0

@ryantxr Полезно знать! Это было больше интереса, чем что-либо еще, - я видел другой способ сделать это, и мне было любопытно, будет ли это работать, и смутить, когда этого не произойдет. –

ответ

2

Зачем вам нужен вложенный аргумент case? Если счетчик больше нуля, вы хотите вернуть один и ноль в противном случае. Попробуйте это

$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"; 
+0

Это хорошее улучшение, но я боюсь, что это ошибка. –

+0

@DamienH, какая ошибка? –

+0

@FelixPamittan Ошибка, указанная в конце моего вопроса «SQLSTATE [IMSSP]: пыталась связать номер параметра 0. SQL Server поддерживает максимум 2100 параметров». –

Смежные вопросы