PDO ODBC到iSeries上的IBM DB2会在Ubuntu Server上导致段错误

时间:2013-01-29 11:50:33

标签: php pdo db2 unixodbc db2-400

我们尝试使用PDO ODBC从Unix系统(Ubuntu)连接到iSeries上的DB2。 到目前为止一切都很好如果我们在结果数组中得到NULL-valus,则会导致段错误。

这里有一些重现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);

最后一行会导致段错误!

php5[26525]: segfault at 2035000 ip 00007f8bf21f18d3 sp 00007fff78f1d3d8 error 6 in libc-2.15.so[7f8bf20a8000+1b5000]

我们做了什么修复:

  1. 添加以下PDO-Attribute无效:
    1. PDO :: ATTR_ORACLE_NULLS => PDO :: NULL_TO_STRING
  2. 激活unixodbc.log并进行检查。查询已成功执行:
    1. 退出:[SQL_SUCCESS]
  3. 将IFNULL插入SQL语句。这解决了这个问题,但对于生产环境而言,这不是我们认为的实用解决方案。
  4. 目前:出于任何想法。上面显示的代码在Windows XP和Windos 7上的XAMPP上工作正常,没有错误。如果我们使用PDO :: ATTR_ORACLE_NULLS则无关紧要。两种可能的选项都可以正常工作,结果数组按预期显示

    这个问题有什么解决方案吗?感谢您的帮助和想法。

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

1 个答案:

答案 0 :(得分:2)

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

系统期望在答案(fetchAll-function)中有一个严格的8字节字段长度,但是字段长度为4字节。这导致了上面提到的段错误。

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

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