用于Microsoft SQL Server的PHP ODBC PDO驱动程序返回空数组或false


PHP ODBC PDO driver for Microsoft SQL Server returning empty array or false

我有这个代码:

$dbh = new PDO('odbc:MSSQLServer', 'user', 'pass');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC);        
var_dump($result);

如果:

$sql = "select seri_cdser from tsica_alun_matr";

输出为:

array(1) {
    ["seri_cdser"]=>
    string(4) "3EMM"
}

但是如果:

$sql = "select * from tsica_alun_matr";

输出为:

SQLSTATE[22003]: Numeric value out of range: 0 [Microsoft][SQL Server Native Client 11.0]Numeric value out of range (SQLFetchScroll[0] at /usr/local/src/PDO_ODBC/odbc_stmt.c:372)

有时也会返回一个空数组,显然驱动程序不稳定。

tsica_alun_matr有13列。

有人知道这是否是MS SQL Server PDO驱动程序的错误吗?

将PDO与MSSQL一起使用时,我的连接字符串看起来有所不同。不确定这是否会有所帮助,但我就是这样做的:

$c = new PDO("sqlsrv:Server=x.x.x.x;Database=db_name", "username", "password");

这可能也有助于调试:

$c->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我在PHP文档中发现了一条注释:

http://php.net/manual/pt_BR/book.pdo.php

上面写着:

  1. 我的第二个错误是:

    致命错误:未捕获异常"PDOException",消息为"SQLSTATE[22003]:数值超出范围:0[Microsoft][SQL Native客户端]数值超出范围(处的SQLFetchScroll[0]ext''pdo_odbc''dodbc_stmt.c:372)'在(YOUR_TRACE_HERE)<lt<另一个无意义错误"数值超出范围"

->实际上,我返回了一个日期数据类型(datetime或smalldatetime)"原样",也就是说,没有将其转换为varchar在将其包含在结果集中之前。。。我不知道PDO是不是负责将其转换为PHP数据类型,但它没有。在它到达PHP之前进行转换。

因此,由于存在datetimesmalldate字段,我更改了PDO查询,如下所示,将datetimesmalldatetime转换为varchar。此页面有助于选择最佳的对话格式。

$sth = $dbh->prepare("
    select
        alun_cdal,
        seri_cdser,
        CONVERT(VARCHAR(23), matp_dat_Mat, 121) as matp_dat_Mat,
        alun_nmal,
        alun_sexo,
        CONVERT(VARCHAR(23), alun_dnsc, 121) as alun_dnsc
    from 
        tsica_alun_matr");

现在我的代码运行良好!