PHPでクエリパラメータが多すぎる場合に発生するエラーです。
細かいことは後ほど書くとして、エラー内容が意味不明すぎる。。
DBは「PostgreSQL」になります。
僕のプロフィールはこちら
「7 number of parameters must be between 0 and 65535」エラーって?
パラメータの数が多すぎる場合にエラーが発生します。
例えば、SQLのINSERT文で一気に登録する場合などに発生します。
1 |
[2019-10-09 15:52:08] local.ERROR: SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535 (SQL: ... |
INSERT文の一括登録は「マルチプルインサート」なんて言ったりします。
解消方法は?
PDOは一度に処理できるクエリパラメータが「65535」までです。
つまり、65535以下にしてあげればよいわけです。
ということで、以下のサイトを参考に配列を分割するなど、一度に登録していたものを分割します。
1 2 3 4 5 6 |
chunked_new_record_array = array_chunk($new_record_array, 65000, true); foreach ($chunked_new_record_array as $new_record_chunk) { //do PDO insertion } |
■PDOException: SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535
URL:「https://stackoverflow.com/questions/40361164/pdoexception-sqlstatehy000-general-error-7-number-of-parameters-must-be-bet」
実は配列の分割だけではダメ
上記の対応をしてみたのですが、同じエラーが出ました。
実は、INSERT文のクエリパラメータは、配列で1ではなく、一つ一つのパラメータを1と数えます。
つまり、「VALUES(‘a’, ‘b’, ‘c’)」となっていた場合、パラメータは「1」ではなく「3」になります。
だめやん。
パラメータの数は計算するしかない
パラメータの数はSQLによって異なります。
ってことは、それぞれのSQLで分割する基準(数値)は変わってくるわけです。
まあ、あくまで一度にINSERTをしている箇所だけの問題ですが、データ量の多い処理だと考慮するべきでしょう。
おすすめ書籍
僕はLaravelの勉強をするのに以下の書籍を購入しました。おすすめですよ!
まとめ
マルチプルインサートってよく使うと思うですよね。
で、このエラーって大量データ扱う場合によく出ると思うんですよね。
なのに、情報が全くなくてびっくりするんですよね。
ではまた。
関連記事
以下の記事も合わせて読まれています。