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

标签 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
    }
    
  2. 打开E_NOTICE 错误。您应该知道 $res['EMAIL'] 是一个 undefined index 。在脚本的顶部...

    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
    }
    

关于php - 检查 PDO Fetch select 语句何时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641934/

相关文章:

php - 使用 Google 登录 Api 时如何在数据库中安全地插入和使用用户信息

php - 如何正确使用 PDO 对象进行参数化 SELECT 查询

php - 检查以查看 MySql 中的匹配项

eclipse - 在 Mac 上为 PostgreSQL 安装 PDO 驱动程序(使用 Zend for eclipse)

php - PDO 在查询中引用整数。我现在应该做什么?

php - PDO 更新查询中的跟踪错误

php - 当我们告诉它不要这样做时,为什么 PDO 会产生警告?

php - Laravel 4 Auth::attempt 使用电子邮件或用户名和密码

php - MYSQL:根据当前时间返回列时间值?

php - 用于插入和返回最后插入行号的代码中的安全漏洞