无法通过PHP PDO获得SQL Server打印消息

问题描述 投票:2回答:2

我正在使用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 /数据”消息

php sql sql-server stored-procedures pdo
2个回答
0
投票

实际上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的错误


0
投票

到目前为止,我发现用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函数。

© www.soinside.com 2019 - 2024. All rights reserved.