我正在使用PDO(dblib驱动程序)来调用SQL Server存储过程。当它出错时,它使用PRINT生成返回消息。问题是我无法通过errorInfo函数获取消息。结果为空,行数也返回-1。
例如,当我在SQL Server Management Studio中运行存储过程时:
CALL x_prodcedure 1,2
它输出(不是行集):Invalid ID/data
当我在php中进行相同的调用时,找不到行集数据,并且errorinfo返回:
Array
(
[0] => 00000
[1] => 0
[2] => (null) [0] (severity 0) [(null)]
[3] => 0
[4] => 0
)
不确定我可以使用哪些其他功能来获取“无效的ID /数据”消息
实际上PDO ERROR 000
是成功执行查询时的错误值。
您仅应在打印失败时进行打印,否则应忽略。
根据您的情况,大致情况:
if(!$stmt->execute(array(...))){
var_dump($dbh->errorInfo()); //not outside of the failure block
}else{
var_dump($stmt->fetchAll());
}
[很有可能not a rowset
未被视为PDO
的错误
到目前为止,我发现用PHP捕获MS SQL Server消息的最佳方法是使用ct库,freetds构建的sybase扩展,以及sybase_set_message_handler()函数。示例代码:
<?
$con = sybase_connect("server", "sa", "password");
sybase_set_message_handler("dbMsg", $con);
sybase_min_client_severity(0); // In case you want all messages
sybase_min_server_severity(0); // In case you want all messages
$rs = sybase_query("PRINT 'OK'; WAITFOR DELAY '00:00:05'; PRINT 'OK1';");
$rs = sybase_query("USE SOMEDB; PRINT 'OK'; SE LECT 1"); // Intentionally with error
function dbMsg($number, $severity, $state, $line, $text) {
echo microtime(1) . " [{$number}] [{$severity}] [{$state}] [{$line}] [{$text}]\n";
}
?>
使用sybase_set_message_handler函数还将防止sybase_query发出任何警告。
基于Debian Jessie的示例:
cd /usr/src
apt-get source php5
cd [php source folder]/ext/sybase_ct
phpize
./configure --with-sybase-ct=/usr
make
make install
请注意,此构建过程与mssql扩展名不兼容,因为mssql一个别名为sybase函数。