检查PDO Fetch select语句何时返回null

时间:2011-10-03 23:51:16

标签: 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';
                }

但是,尽管DB中已存在记录,但仍会插入该值。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:2)

这里有几件事......

  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
    }
    

答案 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)并且它被否定。所以,否定否定=真:)。