【问题标题】:check when PDO Fetch select statement returns null检查 PDO Fetch 选择语句何时返回 null
【发布时间】:2011-11-30 07:31:11
【问题描述】:

我有以下代码:

  $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';
                }

尽管记录已经存在于数据库中,但它仍然会插入值。如何防止这种情况发生?

【问题讨论】:

    标签: php pdo


    【解决方案1】:

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

    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
      }
      

    【讨论】:

      【解决方案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 :)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        • 2014-09-15
        • 2011-07-31
        • 2019-03-12
        相关资源
        最近更新 更多