我在与PDO_ODBC和PDO :: FETCH_OBJ(和PDO :: FETCH_CLASS)一个奇怪的问题导致出现以下错误信息:PDO返回空属性名
PHP Fatal error: Cannot access empty property
下面的代码:
$dbh = new PDO("odbc:FOO");
$sth = $dbh->query("
SELECT rolename
FROM dbc.allrolerights
WHERE databasename = 'BAR'
");
$result = $sth->fetch(PDO::FETCH_OBJ);
作为参考的FOO DSN是使用由tdodbc软件包提供的tdata.so驱动程序的Teradata数据源。
我相信这是因为当PDO调用zend_API.h:object_init_ex()来实例化stdClass对象时,字段名称(从ODBC查询返回)为空。如果我切换到PDO :: FETCH_LAZY和的var_dump()行,我得到如下:
object(PDORow)#3 (2) {
["queryString"]=>
string(95) "
SELECT rolename
FROM dbc.allrolerights
WHERE databasename = 'BAR'
"
[""]=>
string(30) "FNAR "
}
这似乎备份。我尝试了几种不同的PDO属性组合和一堆不同的角度来解决这个问题。一种解决方法是获取关联数组并将其传递给类构造函数。但是,对于某些在后台直接使用PDO :: FETCH_CLASS的框架和ORM,这不起作用。
我想补充一点,其他的提取方法似乎做了正确的事情,例如,PDO :: FETCH_NAMED:
array(1) {
["RoleName"]=>
string(30) "FNAR "
}
我要找的东西,我可以把在PDO胸径或某物的定义,或者在数据源或驱动程序的odbc.ini或odbcinst.ini中解决此问题。先谢谢你。
更新: odbc_fetch_object()(即不是PDO)的工作原理与所有相同。只是想提到它。显然,PHP,unixODBC或ODBC驱动程序似乎没有任何严重问题。这是PDO代码中的东西。时间打开一个bug报告... opened
$dbh = odbc_connect("FOO", NULL, NULL)
or die(odbc_error_msg());
$sth = odbc_exec($dbh, "
SELECT rolename
FROM dbc.allrolerights
WHERE databasename = 'BAR'
");
$result = odbc_fetch_object($sth);
var_dump($result);
和输出:
object(stdClass)#1 (1) {
["RoleName"]=>
string(30) "FNAR "
}
更新2:局势继续增长越来越离奇。我可以执行一个PDO :: FETCH_LAZY并查看上面var_dump()中看到的空白列名称,但是如果我尝试通过名称访问属性(例如$ result-> RoleName),它可以工作!这些获取方法有什么不同,它们中的一些有时可以访问字段名称,其他则不能?
ODBC跟踪(“working”cf.“not working”)的并行比较显示没有区别(除了不同的指针地址)。 PDO :: FETCH_BOUND适用于编号列和命名列。 PDO :: FETCH_INTO具有RoleName属性的对象不。
尝试先升级PHP。 –
我试过5.5.9。不用找了。 – mwp
有两件事我可以建议:你的'SELECT rolename'不区分大小写吗? PDO可能会对此有点有趣。另外,如果您加入到具有相同列的表中,除非您在SQL中选择dup作为dup1,否则列可能不会再回来。还有一个最后的建议尝试反驳'''列名.. –