Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL如何避免PHP中的重复条目_Php_Mysql_Sql_Duplicates_Unique - Fatal编程技术网

MySQL如何避免PHP中的重复条目

MySQL如何避免PHP中的重复条目,php,mysql,sql,duplicates,unique,Php,Mysql,Sql,Duplicates,Unique,我认为最有效的方法是在表上创建一个UNIQUE字段,而不是在执行任何其他操作之前选择检查现有值,但这需要使用两个查询。相反,对于唯一的字段,只需要一个查询,因为MySQL会为您进行检查。问题是重复条目错误会导致内部服务器错误,我无法在PHP中恢复该错误。你们有什么建议,在PHP和MySQL应用程序中避免重复条目的最佳方法是什么?您可以使用REPLACE-INTO进行查询,它将首先尝试插入,然后删除具有相同ID的行并替换它 在重复键上使用 将值($to\u uid,$send\u amount)插

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

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

  • 在重复键上使用
  • 将值($to\u uid,$send\u amount)插入someTable(id,amount) 重复密钥更新金额=金额+发送金额

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

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

    找到了解决方案

    CodeIgniter需要设置

    $db['default']['stricton'] = TRUE;
    
    明确的呼唤

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

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

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

    如果使用IGNORE关键字,则会显示在执行 INSERT语句被忽略。例如,在不忽略的情况下,一行 复制表中现有的唯一索引或主键值 导致重复键错误,语句被中止。具有 忽略,仍不会插入该行,但不会发生错误。忽略 错误可能会生成警告,但重复的键错误会生成警告 不是


    最好在运行插入之前检查并确认是否存在重复性query@nedstark使用
    唯一的
    约束不是更好吗?更快?“问题是重复的输入错误会导致内部服务器错误,我无法在PHP中恢复”这听起来很奇怪explain@Dagon听起来确实如此,顺便说一句,我正在使用CodeIgniter。每次我尝试在具有
    唯一性
    约束的字段中插入相同的信息时,为了进行测试,我会得到一个内部服务器错误
    500
    。我已经尝试了
    try/catch
    块,但程序只是停止执行…在某个地方会有一些错误消息,找到它。这不是我想要的。我不想替换任何东西,我只是想避免输入已经存在的信息。你说重复的错误无法恢复,我想Dagon有不同的想法。谢谢你,但是我正在使用的mysqli或CodeIgniter呢?普通的try/catch不起作用。因为默认情况下,
    mysqli
    不会引发异常
    Mysqli
    函数只返回false。如果你想让mysqli在出错时抛出异常,或者在示例
    mysqli::query
    返回错误时,只需检查1062代码的
    mysqli::$errno
    ,我猜我将在CodeIgniter中询问如何执行此操作在我的回答评论中。酷家伙回答了。Great@Didar_Uranov我感谢您的帮助,但这实际上是一个您未能解决的CodeIgniter问题。如果没有我提到的设置,MySQL将无法抛出异常。