我有这个代码:
$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
上面写着:
->实际上,我返回了一个日期数据类型(datetime或smalldatetime)"原样",也就是说,没有将其转换为varchar在将其包含在结果集中之前。。。我不知道PDO是不是负责将其转换为PHP数据类型,但它没有。在它到达PHP之前进行转换。
- 我的第二个错误是:
致命错误:未捕获异常"PDOException",消息为"SQLSTATE[22003]:数值超出范围:0[Microsoft][SQL Native客户端]数值超出范围(处的SQLFetchScroll[0]ext''pdo_odbc''dodbc_stmt.c:372)'在(YOUR_TRACE_HERE)<lt<另一个无意义错误"数值超出范围"
因此,由于存在datetime
和smalldate
字段,我更改了PDO查询,如下所示,将datetime
和smalldatetime
转换为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");
现在我的代码运行良好!