【问题标题】:How to handle error for duplicate entries?如何处理重复条目的错误?
【发布时间】:2011-03-09 23:28:02
【问题描述】:

我有一个 PHP 表单,可以将数据输入到我的 MySQL 数据库中。我的主键是用户输入的值之一。当用户输入表中已经存在的值时,返回 MySQL 错误“Duplicate entry 'entered value' for key 1”。 而不是那个错误,我想提醒用户他们需要输入不同的值。只是回显的消息或其他内容。

如何将特定的 MySQL 错误转换为 PHP 消息?

【问题讨论】:

    标签: php mysql error-handling


    【解决方案1】:

    要检查此特定错误,您需要找到error code。重复键为1062。然后使用来自errno() 的结果与:

    mysqli_query('INSERT INTO ...');
    if (mysqli_errno() == 1062) {
        print 'no way!';
    }
    

    关于编程风格的说明
    您应该始终避免使用 magic numbers (我知道,我是在这个答案中介绍它的人)。相反,您可以将已知错误代码 (1062) 分配给一个常量(例如 MYSQLI_CODE_DUPLICATE_KEY)。这将使您的代码更容易维护,因为 if 语句中的条件在几个月后仍然可读,而 1062 的含义已经从记忆中消失了:)

    【讨论】:

    • 是的,我也发现了 :D 我把它插上电源,它工作得很好。谢谢 jensgram,正是我正在寻找的解决方案!
    • @jensgram:+1 感谢您提供非常有用的答案和提示。我只是为那些使用 PDO 的人添加这个链接:php.net/manual/en/pdo.errorcode.php
    • 对于 OOP,它是 $mysqli->errno
    • 找出错误号:echo mysqli_errno($link); //其中链接是您的数据库连接。
    • 你为什么要花一些时间来指导读者使用常量,而不是仅仅(或至少除了)将它应用到你的代码 sn-p 中?
    【解决方案2】:

    您可以在插入时检查来自mysql_query 的返回值。

    $result = mysql_query("INSERT INTO mytable VALUES ('dupe')");
    
    if (!$result) {
        echo "Enter a different value";
    } else {
        echo "Save successful.";
    }
    

    【讨论】:

    • 啊哈,我以前见过这个,这绝对是正确的。谢谢尼克!
    • 其实有什么方法可以检查是不是具体的错误?
    • 是的 - mysql_errno() 将返回最后一个错误的错误代码。在我的脑海中,我不知道那个代码是什么,但你可以在 (!$result) 分支中检查它。
    • mysql_errno() 的 OOP 等效项是 $mysqli->errno
    【解决方案3】:

    尝试使用此代码处理重复条目并显示回显消息:

      $query = "INSERT INTO ".$table_name." ".$insertdata;
                    if(mysqli_query($conn,$query)){
                        echo "data inserted into DB<br>";                   
                    }else{
                       if(mysqli_errno($conn) == 1062)
                           echo "duplicate entry no need to insert into DB<br>";
                       else
                        echo "db insertion error:".$query."<br>";
    
                    }//else end
    

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 这只是打开错误报告,据我所知。无论如何,谢谢。
      【解决方案5】:

      使用mysql_errno() 函数,它返回错误号。重复键的错误号是 1062。 例如

      $query = mysql_query("INSERT INTO table_name SET ...);
      if (mysql_errno() == 1062){
          echo 'Duplicate key';
      }
      

      【讨论】:

        【解决方案6】:

        这是我使用的完整代码,并且运行良好。它的 PDO 友好,并且可以轻松处理您的错误,(一旦您使用 die 发现那是什么。然后您可以从那里复制错误消息,并将其包含在 if 中。这来自我想要的注册页面如果找到主键(电子邮件)并产生错误,则重定向到登录页面。

        function insertUserDetails($email, $conn){
        
          try {
              $query = $conn->prepare ("INSERT INTO users (emailaddress) VALUES (:email)");
                    $query ->bindValue('email', $email);
                    $query->execute();
                }
          catch (PDOException $e) {
        
              if(str_contains($e, '1062 Duplicate entry')) {
                  header("Location: login.php");
        
              }
                  die("Error inserting user details into database: " .  $e->getMessage());
        
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-08-03
          • 1970-01-01
          • 2019-11-26
          • 2012-02-04
          • 2013-01-14
          • 2018-10-12
          • 2018-02-04
          • 2018-05-19
          相关资源
          最近更新 更多