Php mysql 5.1发出错误信号以导致PDO异常
我知道mysql 5.5允许使用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操作 可被
信号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;