【问题标题】:PHP MySQLi Error Handling 1062 duplicate key entryPHP MySQLi错误处理1062重复键条目
【发布时间】:2013-01-14 14:34:11
【问题描述】:

我怎样才能优雅地捕获发生 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 错误,即当电子邮件地址已经存在时。我想检查是否只使用了用户名,或者只使用了电子邮件地址,或者两者兼而有之。再说一遍,我想以一种优雅的方式来做,而不是先选择电子邮件和用户名并检查它们是否已经存在。如果可能的话,我想做一个插入查询并从中获取所有信息。

【问题讨论】:

  • 你误用了LAST_INSERT_ID() 如果它是一个自动增量列,你不需要在插入语句中指定它。
  • 后退一步,作为开发人员,您是否应该根据查询知道。我认为重复输入错误就足够了。
  • 备案->errno 想要$pstmt 作为它的资源/对象。

标签: php error-handling mysqli


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多