【问题标题】:MySQL How to Avoid Duplicate Entries from PHPMySQL 如何避免 PHP 中的重复条目
【发布时间】:2014-06-17 14:28:47
【问题描述】:

我认为最有效的方法是在表上创建一个UNIQUE 字段,而不是在执行任何其他操作之前选择检查现有值,但这会使用两个查询。取而代之的是 UNIQUE 字段只需要一个查询,因为 MySQL 会为您检查。问题是重复输入错误会导致我无法在 PHP 中恢复的内部服务器错误。你们有什么建议,在 PHP 和 MySQL 应用程序中避免重复条目的最佳方法是什么?

【问题讨论】:

  • 最好在运行插入查询之前检查并确认重复性
  • @nedstark 使用UNIQUE 约束不是更好,更快吗?
  • “问题是重复输入错误导致内部服务器错误,我无法在 PHP 中恢复”这听起来很奇怪,请解释一下
  • @Dagon 听起来确实如此,顺便说一句,我正在使用 CodeIgniter。每次我尝试在具有UNIQUE 约束的字段中插入相同的信息以进行测试时,我都会返回一个内部服务器错误500。我尝试了try/catch 块,但程序只是停止执行......
  • 某处会有一些错误信息,找到它。

标签: php mysql sql duplicates unique


【解决方案1】:
  1. 使用ON DUPLICATE KEY

INSERT INTO someTable (id, amount) VALUES ($to_uid, $send_amount) ON DUPLICATE KEY UPDATE 金额 = 金额 + $send_amount

https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

2) 您可以捕获重复键异常。 PDO 示例:

try{
    $stmt->execute(...);
}
catch(PDOException $e){
    if($e->errorInfo[1] == 1062){
        // Mysql returned 1062 error code which means a duplicate key
    }
}

【讨论】:

  • 谢谢,但是我正在使用的 mysqli 或 CodeIgniter 呢?普通的 try/catch 不起作用。
  • 因为mysqli 默认不抛出异常。 Mysqli 函数只返回 false。如果您想让 mysqli 在错误 stackoverflow.com/questions/14578243/… 上抛出异常,请参阅此答案,或者在例如 mysqli::query 返回 false 时检查 mysqli::$errno 以获取 1062 代码
  • 猜猜我会问如何在 CodeIgniter 中做到这一点。
【解决方案2】:

您可以对查询使用 REPLACE INTO,它会先尝试插入,然后会删除具有相同 ID 的行并替换它。

【讨论】:

  • 这不是我想要的。我不想替换任何我只想避免放入已经存在的信息的东西。您说重复错误无法恢复,我认为 Dagon 有不同的想法。
【解决方案3】:

找到解决方案!

CodeIgniter 需要设置

$db['default']['stricton'] = TRUE;

显式调用

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

为了让 MySQL 抛出异常。还必须捕获异常。

【讨论】:

  • 我在回答 cmets 中提到了 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);。酷哥做了他的回答。很棒
  • @Didar_Uranov 感谢您的帮助,但这实际上是您未能解决的 CodeIgniter 问题。如果没有我提到的设置,MySQL 将无法抛出异常。
【解决方案4】:

您可以使用INSERT IGNORE 来防止更新行并防止在行已存在时引发异常。

https://dev.mysql.com/doc/refman/5.5/en/insert.html

如果您使用 IGNORE 关键字,则在执行 INSERT 语句被忽略。例如,如果没有 IGNORE,那么一行 复制表中现有的 UNIQUE 索引或 PRIMARY KEY 值 导致重复键错误并且语句被中止。和 IGNORE,该行仍然没有插入,但没有发生错误。忽略 错误可能会生成警告,尽管重复键错误会 不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2019-05-03
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多