ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Opened 12 years ago

Closed 12 years ago

Last modified 12 years ago

#1477 closed defect (fixed)

PHP5.2以上の環境でOpenPNE2.10がセットアップできない

Reported by: kiwa Owned by: ebihara
Priority: minor Milestone: OpenPNE2.10.1
Component: その他 Version: 2.10.x & 2.11.x
Keywords: OpenPNE2.11.2 Cc:

Description

http://sns.openpne.jp/?m=pc&a=page_fh_diary&target_c_diary_id=13720 より転記

?m=setup
で必要事項を記入後、送信したら、

PHP Catchable fatal error: Object of class DB_Error could not be converted to string in /home/chao/lib/include/DB/pgsql.php on line 528

というエラーがでた
該当行は、str_replaceみたいなんだけど。

んーこんなところでいきなり言われてもなぁ。
ソース全部追っかけていかないと駄目かしら
「2.10は、PHP5.0系までしか対応してないのか」のエントリでも書いたのですが、PHP5.2からの仕様変更で__toStringメソッドが定義されていないオブジェクトをstringにしようとすると、発生するエラーのようです。

この関数に渡されたオブジェクトをstr_replaceで使うときに暗黙の型変換が起こり、そこで上記の仕様の罠に陥ったのではないかとおもいます。

この仮説が正しければ、PHP5.2以上のホスティングサーバではOpenPNEは(セットアップができないので)利用できないってことになりますね

Change History (11)

comment:1 Changed 12 years ago by kiwa

Priority: minorcritical

comment:2 Changed 12 years ago by kiwa

Owner: changed from nobody to ogawa

再現チームでは難しいので判断をお願いします。

comment:3 Changed 12 years ago by kalze

報告者です。
環境ですが、以下の通りです
Debian GNU/Linux etch
apache 2.2.3
PHP 5.2.0
PostgreSQL 8.1.9
PHPの4との互換モードはOFFです。

comment:4 Changed 12 years ago by ebihara

Keywords: 再現待ち removed

2.10.1での修正候補とします。ひとまず再現待ちから外しておきます

comment:5 Changed 12 years ago by ebihara

Owner: changed from ogawa to nobody

comment:6 Changed 12 years ago by ebihara

Milestone: OpenPNE2.10.1

comment:7 Changed 12 years ago by ebihara

Owner: changed from nobody to ebihara
Status: newassigned

comment:8 Changed 12 years ago by ebihara

Keywords: 確認中 added
Owner: changed from ebihara to ogawa
Status: assignednew

手元のPHP5.2.1の環境で確認しましたが、再現しませんでした。

?m=setup&a=setup_do_setupで実行しているDB関数はdb_insert()のみですが、この関数は内部的にプリペアドステートメントを用いていますので、string型への型変換があるとすれば、プリペアドステートメント向けにパラメータを変換している部分ということになります。

ですが setup_do_setup で db_insert() に渡しているパラメータのうち、Object型になりうるものは見受けられません。

よって、このバグは通常の条件下では発生しないものだと推測されます。

報告者のkalzeさんは、OpenPNE2.10.0時点でのPostgreSQL用セットアップSQLの不備が原因で、セットアップに失敗している経緯がありますが、2.10.1で取り込まれる予定のセットアップSQLによるセットアップをおこなったところ、正常にセットアップできたという旨の報告をされています(参考:http://sns.openpne.jp/?m=pc&a=page_c_topic_detail&target_c_commu_topic_id=2793)。

このことから、当現象は OpenPNE2.10.0 で PostgreSQL のセットアップに失敗したことが原因で発生するものであり、現在は対応していると考えて差し支えないと判断します。

しかし、プリペアドステートメントのパラメータに予期しないObject型が渡りうるということはそれ自体がバグであると認識し、さらにソースコードを追ったところ、OpenPNE_DB_Writer::insert()でOpenPNE_DB_Writer::nextId()が失敗した場合を想定しておらず、DB_Errorオブジェクトがプライマリキーとして扱われる場合があることがわかりました(以下のコードの $id)。

        $seq_name = sprintf('%s_%s', $table, $pkey);
        if ($pkey && ($id = $this->nextId($seq_name))) {
            $fields_values = array($pkey => $id) + $fields_values;
        }

そこで、OpenPNE_DB_Writer::nextId() の返り値としてDB_Errorオブジェクトが返りうることを想定した処理に修正することで、本件への対応とさせていただきます。

以下のリビジョンで修正しましたのでご確認ください。

comment:9 Changed 12 years ago by ogawa

Keywords: 確認中 removed
Owner: changed from ogawa to ebihara

comment:10 Changed 12 years ago by ogawa

Priority: criticalminor
Resolution: fixed
Status: newclosed

comment:11 Changed 12 years ago by ogawa

Keywords: OpenPNE2.11.2 added
Note: See TracTickets for help on using tickets.