PHP MySQLi错误处理1062重复键输入

时间:2013-01-30 17:10:55

标签: php error-handling mysqli

如何优雅地捕获列名称上发生了1062错误代码(重复键输入)?

当我这样做时:

$db = @new mysqli('localhost', 'root', '******', 'database');

$pstmt = $db->prepare("INSERT INTO users (person_id, user_name, password, e_mail) VALUES (LAST_INSERT_ID(), ?, ?, ?)");
$pstmt->bind_param("sss", $_POST["register_user_name"], md5($_POST["register_password"]), $_POST["register_e_mail"]);
// error occurred
if (!$pstmt->execute()) {
    if ($db->errno == 1062) {
      $column_duplicate_key_entry = /*how to obtain the column name(s)?*/;
    }
}

唯一列为user_namee_mail

我知道我可以通过调用$db->error并自己解析字段来获取错误字符串。但在我看来,这并不优雅。还有其他更好的解决方案吗?

我想要做的是尝试插入新用户。如果插入的用户名已存在,则抛出1062错误,因此当电子邮件地址已存在时。我想检查是仅采用了用户名,还是仅检查了电子邮件地址,或者两者都是。再说一遍,我想以优雅的方式做到这一点,而不先选择电子邮件和用户名,并检查它们是否已经存在。如果可能的话,我想做一个插入查询并从中获取所有信息。

1 个答案:

答案 0 :(得分:4)

MySQL以数字,状态和消息的形式返回错误。如果不解析消息,您将无法确定哪些列是重复的。

此外,MySQL将在第一次失败时爆炸。因此,如果您将user_namee_mail作为重复项,则只会在邮件中返回遇到的第一个重复项。