#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:
Здесь есть пара вещей…
-
PDOStatement::fetchAll()
возвращает массив массивов. Чтобы проверить наличие записи, попробуйтеif (count($res) == 0) { // no records found }
-
Включите
E_NOTICE
ошибки. Вы бы знали, что$res['EMAIL']
это неопределенный индекс. В верхней части вашего скрипта…ini_set('display_errors', 'On'); error_reporting(E_ALL);
-
Я бы рекомендовал создать уникальное ограничение для вашего
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 :).