2

8つのフィールドに10,000行の大規模な複数行の挿入クエリを作成しました。つまり、データ配列としてpg_query_paramsに90,000個の値を渡します。

このエラーが返されます:

警告:pg_query_params():クエリに失敗しました:エラー:バインドメッセージは24464パラメータを提供しますが、プリペアドステートメント""には57行目のclass.postgresql.phpに90000が必要です

SQLとデータ配列を再確認しました。確実に90,000の値が渡されていますが、何らかの理由で、マジックナンバー24464しか検出されていません。

4

2 に答える 2

7

postgresで使用される有線プロトコルは、使用されるパラメーターの数が符号付き2バイト整数として渡されることを示していますが、これは明らかに90000には適合しません。

phpドライバーは2バイト整数に収まらないものを無視しているようです-90000は0x015f90です。その下位2バイトを取得すると、0x5f90が24464になります。インサートを小さなバッチに分割してください。大丈夫

于 2012-05-29T08:06:57.680 に答える
4

<clippy>大きなマルチレコードINSERTステートメントを使用して、PostgreSQLデータベースにデータを一括ロードしようとしているようです。これは非効率的で不器用ですが、明示的なトランザクションを囲まずに単一の挿入を使用するよりもはるかに優れています。pg_copy_from()を使用するようにコードを書き直して、 PHPのpostgresqlドライバーが提供する優れたインターフェイスを介してPostgreSQLの効率的なCOPYバルクロードインターフェイスを利用する必要があります。</ clippy>

真面目な話COPYですが、これが進むべき道であり、PgPHPドライバーがそれをサポートしているように見えます。pg_put_line()COPYを使用して、さらに制御が必要な場合は明示的に実行することもできるようです。

于 2012-05-29T08:20:33.830 に答える