php - iSeries 上的 PDO ODBC 到 IBM DB2 导致 Ubuntu Server 上出现段错误

标签 php pdo db2 unixodbc db2-400

我们尝试使用 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]

我们做了什么修复:

  1. 添加以下 PDO 属性无效:
    1. PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
  2. 激活unixodbc.log并检查它。查询已成功执行:
    1. 退出:[SQL_SUCCESS]
  3. 将 IFNULL 插入 SQL 语句。这解决了问题,但我们认为这对于生产环境来说并不是一个实用的解决方案。

目前:没有任何想法。上面显示的代码在 Windows XP 和 Windos 7 上的 XAMPP 上运行良好,没有错误。如果我们使用 PDO::ATTR_ORACLE_NULLS 则不相关。两种可能的选项都工作正常,结果数组按预期显示

这个问题有解决办法吗?感谢您的帮助和想法。

附加信息: 我们使用 Ubuntu 12.04 LTS 64 位。该错误是否可能是由于 libc 64bit 中的错误而发生的?似乎脚本在“某处”中止。

最佳答案

好的。经过几个小时的测试和设置其他开发环境后,我们发现这是 64 位系统上的问题。

系统期望答案内有严格的 8 字节字段长度(fetchAll 函数),但得到的是 4 字节字段长度。这会导致上面提到的段错误。

设置几乎相同的 32 位环境是(临时)解决方案。该脚本现在正在运行。属性 PDO::ATTR_ORACLE_NULLS 也按预期工作。

对于生产环境,这意味着 RAM 限制为 4 GB :/

关于php - iSeries 上的 PDO ODBC 到 IBM DB2 导致 Ubuntu Server 上出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582226/

相关文章:

php - 我如何在 MySQL 中排序一个列表,以便特定的 id 总是首先出现?

php - PDO 和 MySQLi 准备好的语句有什么区别?

db2重新组织表

hibernate - 什么是 DB2 jdbc 驱动程序或者我可以从哪里获得它?

Python DB2 SSL 连接

php - 在 CakePHP 和 MySQL 中获取每日销售值

php - 如何使用此备份脚本排除文件夹?

PHP PDO - mysqli_num_rows 的替代方案

php - 图片没有上传到 Godaddy

php - 在 PHP 中使用 PDO 更新 MySQL 数据库