mysql 5.1发出错误信号导致PDO异常

时间:2013-08-06 01:36:41

标签: php mysql pdo mysql-5.1

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

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

    我找到了一些类似问题的主题,我试过这些:左

    • 调用一个非常规程序

      调用`sp_raise_error`;

    • 使用函数抛出错误

      

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

    PDO无法捕获这两者。那么什么是解决方案? (我在MySQL5.5上测试过)

1 个答案:

答案 0 :(得分:0)

如果在较低版本的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; 

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