проверка, когда оператор PDO Fetch select возвращает null

#php #pdo

#php #pdo

Вопрос:

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

   $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';
                }
  

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

Ответ №1:

Здесь есть пара вещей…

  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 атрибут (см. http://php.net/manual/en/pdo.setattribute.php )

    Если вы не склонны это делать, рассмотрите возможность использования этого запроса вместо этого…

     $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
    }
      

Ответ №2:

$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'] что не определено (я полагаю, null) и оно отрицается. Итак, отрицание отрицания = true :).