проверить, когда PDO Fetch select возвращает ноль - PullRequest
3 голосов
/ 04 октября 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

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

  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
    }
    
0 голосов
/ 04 октября 2011

$ 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:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...