使用PHP有效地接收MSSQL SP自定义错误

使用PHP有效地接收MSSQL SP自定义错误,php,sql-server,pdo,Php,Sql Server,Pdo,我正在使用PHP和MSSQL SP插入和更新数据。为了确保数据没有被错误更新,我在SP中使用IF语句,如果触发错误,我想使用RAISERROR触发自定义错误消息 回到PHP,我想将此错误消息用作if语句的一部分。为了有效地执行此操作,我的RAISERROR会像下面这样发送数字代码:RAISERROR('2',16,2),但在PHP中,我找不到获取“2”的方法,因为这似乎是我在这些消息中唯一可以使其唯一的方法 到目前为止,我发现了两个PDO函数来获得此类错误: print_r($stmt->

我正在使用PHP和MSSQL SP插入和更新数据。为了确保数据没有被错误更新,我在SP中使用IF语句,如果触发错误,我想使用RAISERROR触发自定义错误消息

回到PHP,我想将此错误消息用作if语句的一部分。为了有效地执行此操作,我的RAISERROR会像下面这样发送数字代码:
RAISERROR('2',16,2)
,但在PHP中,我找不到获取“2”的方法,因为这似乎是我在这些消息中唯一可以使其唯一的方法

到目前为止,我发现了两个PDO函数来获得此类错误:

print_r($stmt->errorInfo());
print_r($stmt->errorCode());
其中,只有errorInfo()给了我一些有用的东西,这是:

Array
(
    [0] => HY000
    [1] => 50000
    [2] => 2 [50000] (severity 16) [(null)]
    [3] => -1
    [4] => 16
)
这不是特别有用,因为我需要的实际值只能通过以下方式获得:

$errmsg = $stmt->errorInfo()[2];
$error = substr($errmsg, 0, strpos($errmsg, " "));

它感觉不是特别有用,看起来很笨重,但我还没有找到任何方法使它更干净,所以我希望有人能帮助我

嗨,你找到解决办法了吗?我在与同样的问题作斗争。@stev遗憾的是,不,我决定采用我在底部写的解决方案,它不一定是干净的,但它是有效的。现在我看到您至少从errorInfo获得了位置2上的代码。我哪里都找不到我的代码。其他人建议使用sqlsrv驱动程序,但它们似乎仅适用于php7的linux。@stev由于此问题的特殊性质,我无法帮助您对系统无法工作的原因给出一般性答案;我可以试着给你一个线索,但是,首先要确保你的存储过程是在第一个位置执行的,然后如果该SP中出现了raiserror,然后使用print\r($stmt->errorInfo())查看你是否真的返回了一个错误。strpos($errmsg,“”)只抓取第一个空格,因此如果raiserror以空格开头,那么错误也将为空