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)