【问题标题】:mysql 5.1 signal an error to cause PDO exceptionsmysql 5.1 发出错误信号导致 PDO 异常
【发布时间】:2013-08-06 01:36:40
【问题描述】:

我知道 mysql 5.5 允许使用SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: ...'; 来引发用户定义的错误。如果将 INSERT 放在某些表上的 BEFORE INSERT TRIGGER 中,此错误将停止该操作。并且PDO 也可以方便地捕捉PDOException 并输出errorinfo() 即MESSAGE_TEXTSIGNAL SQLSTATE 中定义的MESSAGE_TEXT
但是,我租用的服务器上的mysql版本是mysql 5.1。我想知道如何使用 mysql 5.5 中的 SIGNAL SQLSTATEMENT 等功能引发用户定义的错误。

  1. before insert 触发器中中断 insert 操作
  2. 可以被PDO捕获

我发现了一些关于类似问题的主题,并且我尝试了这些:

  • 调用一个不存在的过程

    调用`sp_raise_error`;

  • 使用函数抛出错误

https://blogs.oracle.com/svetasmirnova/entry/how_to_raise_error_in

PDO 无法捕获两者。那么有什么解决办法呢? (我在 MySQL5.5 上测试过)

【问题讨论】:

  • 你能通过简单的语法错误导致异常吗?
  • @YourCommonSense 是的,PDO 将捕获 sql 语法错误

标签: php mysql pdo mysql-5.1


【解决方案1】:

如果您在较低版本的 MySQL(如 5.1)中使用 SIGNAL SQLSTATE,您将收到 1064 错误。所以,为了使用SIGNAL SQLSTATE这样的功能,你可以尝试以下步骤。

1。创建名为“TBL_DUMMY”的辅助表

CREATE TABLE IF NOT EXISTS `TBL_DUMMY`  
(
    `error` VARCHAR(256)
);

2。在 TBL_DUMMY 上创建 BEFORE INSERT 触发器

delimiter $$  
CREATE TRIGGER `TRIG_BI_DUMMY` BEFORE INSERT ON `TBL_DUMMY`  
    FOR EACH ROW
BEGIN  
    SET NEW = NEW.`error`;
END $$  

3。创建名为“SP_RAISE_ERROR”的过程

delimiter $$  
CREATE PROCEDURE `SP_RAISE_ERROR` (IN P_ERROR VARCHAR(256))  
BEGIN  
    DECLARE V_ERROR VARCHAR(300);
    SET V_ERROR := CONCAT('[ERROR: ', P_ERROR, ']');
    INSERT INTO `TBL_DUMMY` VALUES (V_ERROR);
END $$

4。用法

只需执行SP_RAISE_ERROR 而不是SIGNAL SQLSTATE。比如CALL SP_RAISE_ERROR ('Password incorrect.')会抛出异常,消息是:

0 15:40:23 CALL SP_RAISE_ERROR ('Password incorrect.') Error Code: 1231. Variable 'new' can't be set to the value of '[ERROR: Password incorrect.]'.

你可以在程序中使用它:

IF V_ID IS NOT NULL AND V_ID <> P_ID THEN  
    CALL `SP_RAISE_ERROR` ('Title duplicated.');
END IF; 

之后,您可以从外部程序中的消息中提取错误文本。

【讨论】:

  • 尝试了上面提到的步骤。但是得到了下面提到的错误“变量'新'不能设置为'[错误:标题重复]'的值”。它是如何解决的?
  • @Rakes 是的,就是这样。您可以使用正则表达式来提取错误消息的一部分。正则表达式看起来像 [ERROR: (.*?)]
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2012-10-01
  • 2017-03-31
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多