проверить, когда оператор выбора PDO Fetch возвращает значение null

У меня есть следующий код:

$check = $dbh->prepare("SELECT * FROM BetaTesterList WHERE EMAIL = ?"); $check->execute(array($email)); $res = $check->fetchAll(); if (!($res['EMAIL'])){ $stmt = $dbh->prepare("INSERT INTO BetaTesterList(EMAIL) VALUES (?)"); $stmt->execute(array($email)); } else { $return['message'] = 'exists'; } 

Однако это все еще вставляет значение, хотя запись уже существует в БД. Как я могу это предотвратить?

Related of "проверить, когда оператор выбора PDO Fetch возвращает значение null"

Пара вещей здесь …

  1. PDOStatement::fetchAll() возвращает массив массивов. Чтобы проверить запись, попробуйте

     if (count($res) == 0) { // no records found } 
  2. Включите ошибки E_NOTICE . Вы бы знали, что $res['EMAIL'] является неопределенным индексом. В верхней части вашего скрипта …

     ini_set('display_errors', 'On'); error_reporting(E_ALL); 
  3. Я бы рекомендовал создать уникальное ограничение для столбца EMAIL . Таким образом, вы не сможете вставить дубликат записи. Если кто-то попытался, PDO вызовет ошибку или выдаст исключение, в зависимости от того, как вы настраиваете атрибут PDO::ATTR_ERRMODE (см. PDO::ATTR_ERRMODE )

    Если вы не склонны это делать, подумайте об этом вместо этого …

     $check = $dbh->prepare("SELECT COUNT(1) FROM BetaTesterList WHERE EMAIL = ?"); $check->execute(array($email)); $count = $check->fetchColumn(); if ($count == 0) { // no records found } else { // record exists } работа $check = $dbh->prepare("SELECT COUNT(1) FROM BetaTesterList WHERE EMAIL = ?"); $check->execute(array($email)); $count = $check->fetchColumn(); if ($count == 0) { // no records found } else { // record exists } 

$ res должен выглядеть примерно так:

 array ( [0] => array ( [column1] => value, [email] => value ), [1] => array ( [column1] => value, [email] => value ), [2] => array ( [column1] => value, [email] => value ) ) 

Поэтому, if(!($res['email')) всегда будет оцениваться как true, потому что $res['email'] не определено (нуль, я полагаю), и оно отрицается. Итак, отрицание отрицания = true :).