У меня возникла странная проблема с pdo_odbc и PDO:: FETCH_OBJ (и PDO:: FETCH_CLASS), из-за чего появляется следующее сообщение об ошибке:
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, для справки, является источником данных Teradata с использованием драйвера tdata.so, предоставляемого пакетом tdodbc.
Я считаю, что это происходит потому, что имя поля (как возвращено из запроса ODBC) пуст, когда PDO вызывает zend_API.h: object_init_ex() для создания объекта stdClass. Если я переключу на PDO:: FETCH_LAZY и var_dump() строку, я получаю следующее:
object(PDORow)#3 (2) {
["queryString"]=>
string(95) "
SELECT rolename
FROM dbc.allrolerights
WHERE databasename = 'BAR'
"
[""]=>
string(30) "FNAR "
}
Который, кажется, поддерживает это. Я пробовал несколько различных сочетаний атрибутов PDO и множество разных углов для решения этой проблемы. Одним из решений является выбор ассоциативного массива и передача его в конструктор класса. Однако это не работает для определенных фреймворков и ORM, которые используют PDO:: FETCH_CLASS напрямую, за кулисами.
Я хочу добавить, что другие методы выборки, похоже, делают правильные вещи, например PDO:: FETCH_NAMED:
array(1) {
["RoleName"]=>
string(30) "FNAR "
}
Я ищу что-то, что я могу внести в определение 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);
И вывод:
object(stdClass)#1 (1) {
["RoleName"]=>
string(30) "FNAR "
}
Обновление 2: Ситуация продолжает расти все более странно. Я могу сделать PDO:: FETCH_LAZY и увидеть пустое имя столбца, как показано выше в var_dump(), но если я попытаюсь получить доступ к свойству по имени (например, $result- > RoleName), он будет работать! Какие методы выборки делают так по-другому, что некоторые из них иногда могут обращаться к именам полей, а другие не могут?
Сравнительные сравнения ODBC-следов ( "рабочий", cf. "не работает" ) не показывает различий (кроме разных адресов указателей). PDO:: FETCH_BOUND работает как с нумерованными, так и с именованными столбцами. PDO:: FETCH_INTO объекта с свойством RoleName нет.