2

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 および Windows 7 の XAMPP から正常に動作し、エラーは発生しません。PDO::ATTR_ORACLE_NULLS を使用する場合は関係ありません。可能なオプションは両方とも正常に機能し、結果の配列は期待どおりに表示されます

この問題の解決策はありますか? 助けとアイデアをありがとう。

追加情報: Ubuntu 12.04 LTS 64bit を使用しています。libc 64bit のエラーが原因でこのエラーが発生する可能性はありますか? スクリプトが「どこかで」中止されたようです。

4

1 に答える 1

2

Ok。数時間のテストと追加の開発環境のセットアップの結果、これは64ビットシステムの問題であることがわかりました。

システムは、回答(fetchAll-function)内で厳密な8バイトのフィールド長を想定していますが、4バイトのフィールド長を取得しています。これにより、上記のセグメンテーション違反が発生します。

ほぼ同じ32ビット環境をセットアップすることが(一時的な)ソリューションでした。スクリプトは現在機能しています。また、属性PDO::ATTR_ORACLE_NULLSは期待どおりに機能します。

実稼働環境の場合、これは4 GBへのRAM制限を意味します:/

于 2013-01-30T12:43:47.923 に答える