无法使用 PHP PDO 获取 SQL Server 打印消息
Posted
技术标签:
【中文标题】无法使用 PHP PDO 获取 SQL Server 打印消息【英文标题】:Can't get SQL Server Print message with PHP PDO 【发布时间】:2014-12-27 03:46:21 【问题描述】:我正在使用 PDO(dblib 驱动程序)来调用 SQL Server 存储过程。当它出错时,它使用 PRINT 生成返回消息。问题是我无法使用 errorInfo 函数获取消息。结果为空,行数也返回-1。
例如,当我在 sql server management studio 中运行存储过程时:
CALL x_prodcedure 1,2
它输出(不是行集):Invalid ID/data
当我在 php 中进行相同的调用时,没有找到行集数据并返回错误信息:
Array
(
[0] => 00000
[1] => 0
[2] => (null) [0] (severity 0) [(null)]
[3] => 0
[4] => 0
)
不确定我可以使用哪些其他函数来获取“无效 ID/数据”消息
【问题讨论】:
【参考方案1】:其实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
的错误
【讨论】:
【参考方案2】:到目前为止,我发现在 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";
?>
基于 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 函数。
【讨论】:
以上是关于无法使用 PHP PDO 获取 SQL Server 打印消息的主要内容,如果未能解决你的问题,请参考以下文章
php 无法连接到 sql server 2008(使用 pdo dblib)
在 PHP 中,当将 PDO 与 pgSQL 一起使用时,如何在原始 INSERT sql 查询中获取“RETURNING”子句的值
php+mysql 请问:用pdo如何获取某个表中记录的数目?