我有以下代码:
$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';
}
但是,尽管DB中已存在记录,但仍会插入该值。我该如何防止这种情况?
答案 0 :(得分:2)
这里有几件事......
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
}
答案 1 :(得分:0)
$ 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)并且它被否定。所以,否定否定=真:)。