我们尝试使用 PDO ODBC 从 Unix 系统 (Ubuntu) 连接到 iSeries 上的 DB2。到目前为止一切都很好。如果我们在结果数组中获得 NULL 值,则会导致段错误。
这里有一些测试代码来重现段错误:
$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);
最后一行导致段错误!
php5[26525]: segfault at 2035000 ip 00007f8bf21f18d3 sp 00007fff78f1d3d8 error 6 in libc-2.15.so[7f8bf20a8000+1b5000]
我们做了什么来修复:
- 添加以下 PDO-Attribute 无效:
- PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
- 激活 unixodbc.log 并检查它。查询成功执行:
- 退出:[SQL_SUCCESS]
- 将 IFNULL 插入 SQL 语句。这解决了问题,但在我们看来,对于生产环境来说,这不是一个实用的解决方案。
目前:没有任何想法。上面显示的代码在 Windows XP 和 Windows 7 上的 XAMPP 上运行良好,没有错误。如果我们使用 PDO::ATTR_ORACLE_NULLS 则无关紧要。两种可能的选项都可以正常工作,结果数组按预期显示
这个问题有什么解决方案吗?感谢您的任何帮助和想法。
附加信息:我们使用 Ubuntu 12.04 LTS 64 位。是否可能由于 libc 64bit 中的错误而发生此错误?似乎脚本在“某处”中止。