无法使用 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如何获取某个表中记录的数目?

php+mysql 请问:用pdo如何获取某个表中记录的数目?

如何使用PDO在PHP中获取结果数组?

PHP PDO 无法获取 OUT 参数值