У меня есть следующий код:
$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'; }
Однако это все еще вставляет значение, хотя запись уже существует в БД. Как я могу это предотвратить?
Пара вещей здесь …
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
(см. 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 :).