PDO返回空属性名称

mwp*_*mwp 22 php odbc pdo teradata

我对pdo_odbc和PDO :: FETCH_OBJ(以及PDO :: FETCH_CLASS)有一个奇怪的问题,导致以下错误消息:

PHP Fatal error:  Cannot access empty property
Run Code Online (Sandbox Code Playgroud)

这是代码:

$dbh = new PDO("odbc:FOO");

$sth = $dbh->query("
  SELECT rolename
  FROM dbc.allrolerights
  WHERE databasename = 'BAR'
");

$result = $sth->fetch(PDO::FETCH_OBJ);
Run Code Online (Sandbox Code Playgroud)

作为参考,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                          "
}
Run Code Online (Sandbox Code Playgroud)

这似乎支持它.我已经尝试了几种不同的PDO属性组合和一堆不同的角度来解决这个问题.一种解决方案是获取关联数组并将其传递给类构造函数.但是,这对于在幕后直接使用PDO :: FETCH_CLASS的某些框架和ORM不起作用.

我想补充一点,其他fetch方法似乎做对了,例如,PDO :: FETCH_NAMED:

array(1) {
  ["RoleName"]=>
  string(30) "FNAR                          "
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找可以放在PDO dbh或sth定义中的东西,或者用于数据源或驱动程序的odbc.ini或odbcinst.ini来解决此问题.先感谢您.

更新: odbc_fetch_object()(即不是PDO)与完全相同的一切都很好.只是想提一下.显然,PHP,unixODBC或ODBC驱动程序似乎没有任何严重问题.它是PDO代码中的一部分.是时候打开一个错误报告...... 打开了

$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);
Run Code Online (Sandbox Code Playgroud)

并输出:

object(stdClass)#1 (1) {
  ["RoleName"]=>
  string(30) "FNAR                          "
}
Run Code Online (Sandbox Code Playgroud)

更新2:情况继续变得越来越奇怪.我可以做一个PDO :: FETCH_LAZY并看到上面的var_dump()中看到的空白列名称,但如果我尝试按名称访问该属性(例如$ result-> RoleName),它就可以了!这些获取方法的作用有何不同,以至于其中一些方法有时可以访问字段名称,而其他方法则不能?

ODBC跟踪的并排比较("工作"cf."不工作")显示没有差异(除了不同的指针地址).PDO :: FETCH_BOUND适用于编号和命名列.PDO :: FETCH_INTO具有RoleName属性的对象不具有.

ham*_*ldt -1

我认为现在的“解决方案”是使用获取样式 PDO::FETCH_NAMED,然后转换返回的数组并填充动态类:

function arrayToObject(array $array){
   $obj = new stdClass();
   foreach($array as $k => $v)
      $obj->$k = $v;

   return $obj;
}
Run Code Online (Sandbox Code Playgroud)