【问题标题】:Can't get SQL Server Print message with PHP PDO无法使用 PHP PDO 获取 SQL Server 打印消息
【发布时间】: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/数据”消息

【问题讨论】:

    标签: php sql sql-server stored-procedures pdo


    【解决方案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 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-04
        • 2015-07-21
        • 2017-08-09
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        相关资源
        最近更新 更多