【问题标题】:Finding out why a mysqli INSERT failed - which unique index was duplicated?找出 mysqli INSERT 失败的原因——复制了哪个唯一索引?
【发布时间】:2013-05-14 17:42:08
【问题描述】:

我目前正在编写一个需要允许用户注册的 REST 风格的 php 服务器。基础工作正常,但我现在专注于错误处理。我的 users 表在“user_name”字段和“user_email”字段上有一个唯一索引。当我尝试插入重复值时,我可以读取错误并获得类似

的字符串

密钥“user_name”的重复条目“noggin182”

我需要把它翻译成可以显示给用户的东西。是否有一种简单的方法可以获取有关插入失败原因的更多详细信息?我可以轻松地解析字符串以找出答案,但这感觉很混乱,如果字符串在更新或语言更改时发生更改,事情就会中断。

【问题讨论】:

  • 您还需要什么详细信息?
  • Duplicate entry 'noggin182' for key 'user_name' 没有比这更简单或更具描述性的理由了
  • 我需要显示我自己的消息并根据失败的原因在代码中采取不同的操作。我需要解析字符串吗?我原以为应该有一个更整洁的方式

标签: php mysqli


【解决方案1】:

如果您正在尝试做我认为您正在尝试做的事情,那么可能值得采用不同的方法,并将用于将用户添加到存储过程中的逻辑放在单个事务中,然后执行事先进行任何检查以查看用户是否已存在。

然后,您可以返回您自己的逻辑来判断用户是否添加,或者不能添加的原因。或者提出您自己的错误或其他问题。

【讨论】:

    【解决方案2】:

    错误信息通常包含更多信息

    ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
    

    数字错误代码 (1146)。这个数字是 MySQL 特定的,不能移植到其他数据库系统。

    您可以返回此数字并在客户端显示相应的文本,但通常我们所做的是捕获异常并记录完整的堆栈跟踪,但仅向客户端返回简单文本。 您的用户不想知道有人尝试重复密钥插入,因为他们无能为力,因为他们想知道保存失败并且网站管理员已收到有关问题的警报,正在调查它,并且解决方案即将到来..

    【讨论】:

      【解决方案3】:

      因为在该列上添加了唯一键。 unique 不允许重复数据。

      试试这个:

      $query="select * from table where user_email='".$_POST["user_email"]."'";
      
      $result=mysql_query($query);
      if(mysql_num_rows($result)>0)
      {
      your insert query.....
      }
      else
      {
      echo "email already exists";
      }
      

      【讨论】:

      • 他知道,他只是不喜欢明显的错误信息。
      • 是的。我希望向用户显示一条友好的消息。如果该名称已被占用,我想告诉他们尝试不同的名称,或者如果他们已经注册,请尝试登录而不是注册新帐户。如果电子邮件重复,那么我想向用户发送一封电子邮件,其中包含指向用户名提醒和密码重置的链接。信息很明显,但我需要信息,解析感觉很粗糙
      • 然后在运行插入之前进行这些检查
      • 是的,我很担心并发问题,但是其他人只是向我指出,我可以将它全部包装在存储过程中并在表上加锁以避免并发问题跨度>
      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多