php - 使用 PHP PDO、rowCount 的异常行为和捕获异常

标签 php mysql pdo

在使用 PHP/PDO 并执行 INSERT 时,我遇到了一些异常行为。这是一些示例代码:

foreach ($all_users as $this_user) {
    try {
        $stmt = $db->prepare('INSERT INTO fav_colors (name, color, whattime) VALUES (:name, :color, :whattime)');
        $stmt->bindValue(':name', $this_user[name]);
        $stmt->bindValue(':color', $this_user[color]);
        $stmt->bindValue(':whattime', $this_user[time]);
        $stmt->execute();
        $count = $stmt->rowCount();
    } catch(PDOException $e) { catchMySQLerror($e->getMessage()); }

    if ($count == 1) {
        echo "Successful write to table";
    } elseif ($count == 0) {
        echo "ERROR writing row to table";
    }

}

假设我有 10 个名称/颜色要插入,时间为 DATETIME 格式 (2016-01-01 12:00:00)。我对此代码有一个循环,在代码之后我检查 $count 以查看插入是否正常。

这是我的问题。 10 次插入之一,无论出于何种原因 $write_time 为空。 mySQL 生成错误(不能为空)。我的自定义函数 catchMySQLerror 将错误写入表并通过电子邮件发送给我。确实如此,但该条目的 $count 仍然为 1,并且根据它,即使没有插入记录,一切都很好。

那么我在这里使用的 try/catch 来捕获异常是否有问题?如何添加一些可以更好地处理代码中错误的内容?我知道我可以在 catchMySQLerror 行之后添加更多行并以这种方式处理错误。这就是我所做的。但我想使用 if/else 来处理错误,并且使用我刚才提到的方法,我只能处理错误...而不能在成功时处理。

更新:我编辑了代码以显示我如何使用 $count

最佳答案

如果 ->execute() 抛出异常,则 $count = $stmt->rowCount(); 不会执行,因此 $count 保留上一次迭代(如果有的话)。
如果您依赖该值,则必须在每次迭代开始时(重新)初始化它。

关于php - 使用 PHP PDO、rowCount 的异常行为和捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35707537/

相关文章:

php - 我收到错误 1045 (28000) : Access denied for user 'root' @'localhost' (using password: NO) with the command sudo mysql on ubuntu

PHP 使用可变长度形式更新

php - 计算行和列中相同的数字 php mysql

mysql - Datagrip IDE 无法通过需要 CLIENT_PLUGIN_AUTH 连接到 MySQL

php - 使用返回非对象错误的 PDO 连接到数据库

php - 在 CakePHP 中创建临时表并将其作为模型加载

php - Symfony 1.4 条件验证

php - 如何通过 HTTP 下载 URL 中包含 unicode 字母的图像?

php - 如何修复通知 : Object of class PDOStatement could not be converted to int

MySQL 将记录数限制为一列中的 5 个唯一值