мы пытаемся подключиться из системы Unix (Ubuntu) к DB2 на iSeries с PDO ODBC. Пока все в порядке. Если мы получаем NULL-значения в результирующем массиве, это приводит к segfault.
Вот некоторый тестовый код для воспроизведения segfault:
$pdo_dsn = "odbc:DRIVER={iSeries Access ODBC DRIVER};SYSTEM=***";
$pdo_username = "***";
$pdo_password = "***";
$pdo_dbh = new PDO(
$pdo_dsn,
$pdo_username,
$pdo_password,
array(
PDO::ATTR_PERSISTENT => FALSE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
$pdo_query = "SET SCHEMA [SCHEMANAME]";
$pdo_params = array();
$pdo_stmt = $pdo_dbh->prepare($pdo_query);
$pdo_stmt_result = $pdo_stmt->execute($pdo_params);
$pdo_query = "SELECT * FROM [FIRSTTABLE] LEFT JOIN [OTHERTABLE] ON (1=2)";
$pdo_params = array();
$pdo_stmt = $pdo_dbh->prepare($pdo_query);
$pdo_stmt_result = $pdo_stmt->execute($pdo_params);
$pdo_result = $pdo_stmt->fetchAll(PDO::FETCH_ASSOC);
Последняя строка вызывает segfault!
php5[26525]: segfault at 2035000 ip 00007f8bf21f18d3 sp 00007fff78f1d3d8 error 6 in libc-2.15.so[7f8bf20a8000+1b5000]
Что мы сделали, чтобы исправить:
- Adding the following PDO-Attribute with no effect:
- PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
- Activate the unixodbc.log and checked it. Query was successfull executed:
- Exit:[SQL_SUCCESS]
- Вставьте IFNULL в оператор SQL. Это устраняет проблему, но, по нашему мнению, не является практическим решением для продуктивных сред.
На данный момент: Из любой идеи. Показанный выше код отлично работает с XAMPP в Windows XP и Windos 7 без ошибок. Это не имеет значения, если мы используем PDO::ATTR_ORACLE_NULLS. Оба возможных варианта работают нормально, и массив результатов отображается, как и ожидалось.
Есть ли решения этой проблемы? Спасибо за любую помощь и идеи.
Дополнительная информация: Мы используем Ubuntu 12.04 LTS 64bit. Возможно ли, что эта ошибка возникает из-за ошибки в libc 64bit? Кажется, что скрипт обрывается "где-то там".