从sqlstate错误代码中获取mysql错误文本

时间:2018-01-30 10:26:50

标签: php mysql pdo

我正在处理写在不同页面中的mysql查询的错误处理(让我们说第A页),而不是负责打印它们的页面(第B页), 例如:

SQLSTATE[42S02]: Base table or view not found

我想收到错误消息文本:

Base table or view not found

来自代码:

42S02

idealy我正在寻找这样的函数:

get_sqlstate_error_text(42S02)

有关信息,我无法访问上一个查询,我只有错误代码

2 个答案:

答案 0 :(得分:1)

这就是事情发生的原因:

  1. PHP向MySQL提交查询

  2. 有些东西中断,MySQL得到internal error code,例如1146

  3. MySQL填充了邮件模板:Table '%s.%s' doesn't existTable 'shop.customers' doesn't exist

  4. MySQL获取与内部代码对应的映射标准SQLSTATE42S02

  5. 将数据发送回PHP并通过API公开

  6. 我们想要反过来:

    1. PHP有SQLSTATE(42S02)并想要一条错误消息(Base table or view not found

    2. SQLSTATE映射到几个内部错误:

      • 错误:1051 SQLSTATE:42S02(ER_BAD_TABLE_ERROR) - 消息:未知表'%s'
      • 错误:1109 SQLSTATE:42S02(ER_UNKNOWN_TABLE) - 消息:未知表'%s'在%s
      • 错误:1146 SQLSTATE:42S02(ER_NO_SUCH_TABLE) - 消息:表'%s。%s'不存在
    3. PHP很困惑:有三条消息可供选择,有%s个符号,其中没有一条是想要的消息。

    4. 更不用说允许userland SQL代码生成自己的SQLSTATE:

      mysql> SIGNAL SQLSTATE 'OMG00';
      ERROR 1644 (OMG00): Unhandled user-defined exception condition
      

      简而言之,由于两个原因,无法从代码中找出消息:

      1. 他们之间没有一对一的对应关系
      2. 消息似乎是自定义应用程序文本,而不是您可以查找的内置消息
      3. 不幸的是,明确禁止所有明显的解决方案:

        • 存储错误消息
        • 将键/值列表硬编码为所有可能的值

        ...所以唯一剩下的就是传输错误:

        http://example.com/show-error?txt=Base%20table%20or%20view%20not%20found
        

        ...但当然你不能这样做,因为迟早会有人将编辑后的链接发送为恶作剧:

        http://example.com/show-error?txt=Jimmy%20is%20an%20idiot
        

        所以现在你需要加密(或至少数字签名)消息。但是你想知道你是否允许将加密密钥存储在两个脚本都可以访问它的位置......

        好吧,我承认我太过戏剧化了。一个简单的加密/签名可能会成功 - 我不认为将密钥复制到两个脚本都违反规则。

答案 1 :(得分:0)

使用mySqli,您可以执行此操作来处理错误:

git push -u orign master -f

使用PDO试试这个:

if (!mysqli_query($con,"INSERT INTO Persons (FirstName) VALUES ('Glenn')"))
  {
  echo("Error description: " . mysqli_error($con));
  }