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

Php mysql 5.1发出错误信号以导致PDO异常,php,mysql,pdo,mysql-5.1,Php,Mysql,Pdo,Mysql 5.1,我知道mysql 5.5允许使用信号SQLSTATE'45000'设置消息\文本='Error:…'引发用户定义的错误。如果在某些表上插入触发器之前将插入操作放入,则此错误将停止该操作。PDO还可以方便地捕获PDO异常并输出errorinfo(),即信号SQLSTATE中定义的消息文本 但是,我租用的服务器上的mysql版本是mysql 5.1。我想知道如何使用mysql 5.5中的SIGNAL SQLSTATEMENT等特性引发用户定义的错误。 在插入触发器之前,在中中断insert操作 可被

我知道mysql 5.5允许使用
信号SQLSTATE'45000'设置消息\文本='Error:…'
引发用户定义的错误。如果在某些表上插入触发器之前将
插入
操作放入,则此错误将停止该操作。
PDO
还可以方便地捕获
PDO异常
并输出errorinfo(),即
信号SQLSTATE
中定义的
消息文本

但是,我租用的服务器上的mysql版本是mysql 5.1。我想知道如何使用mysql 5.5中的
SIGNAL SQLSTATEMENT
等特性引发用户定义的错误。

  • 在插入触发器之前,在
    中中断
    insert
    操作
  • 可被
    PDO捕获
  • 我找到了一些关于类似问题的主题,并尝试了以下内容:

    • 调用不存在的过程

      调用'sp_raise_error'

    • 使用函数抛出错误


    PDO
    无法捕获这两种情况。那么什么是解决方案?(我在MySQL5.5上进行了测试)

    如果在较低版本的MySQL(如5.1)中使用
    SIGNAL SQLSTATE
    ,则会出现
    1064
    错误。因此,为了使用像
    SIGNAL SQLSTATE
    does这样的函数,您可以尝试以下步骤

    1.创建名为“TBL_DUMMY”的辅助表 2.在TBL_虚拟机上插入触发器之前创建 3.创建名为“SP\U RAISE\U ERROR”的过程 4.用法 只需执行
    SP\u RAISE\u ERROR
    ,而不是
    SIGNAL SQLSTATE
    。例如,
    调用SP\u RAISE\u ERROR(“密码不正确”)
    将引发异常,消息为:

    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; 
    
    如果V_ID不为NULL且V_ID P_ID则
    调用'SP_RAISE_ERROR'('Title duplicated');
    如果结束;
    

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

    您是否可以通过简单的语法错误导致异常?@YourCommonSense是的,
    PDO
    将捕获sql语法错误尝试了上述步骤。但出现了以下错误“变量'new'不能设置为'[error:Title duplicated]'的值。”.它是如何解决的?@Rakes是的,就是这样。您可以使用正则表达式来提取错误消息的部分。regexp看起来像
    [错误:(.*)]
    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 $$
    
    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;