私がcakePHPでシステム構築していると、必ずと言っていいほど発生し悩んでしまうエラーがあります。
例えば入力フォームを作成し、いったん終了した後にもう一つ項目追加をすると、以下のようなエラーが表示されます。
Unexpected field '*****' in POST data
しかも、このエラーが起きると毎度解決が難しくて何日もハマってしまうばかりでいつも心折られますw
ネット上には同じように悩む方が多く、解決するための方法も様々で、自分のブログにもこのエラーコードが発生した際に行う解決方法を記録してますが、いつもそれですんなりと解決したことはありません。
入力フォームを作成する場面では必ずというほど起きてしまうので、今回も今ケースの解消法を記録します。
今回は、ファイルアップロードの項目を追加することが発生し、DBにファイルデータ名やデータ量などファイルデータの記録用カラムを追加し、Viewファイルの方はinputパーツを生成しました。
<?php echo $this->form->control("file_data", ['type' => 'file', 'label' => false,]); ?>
これで一先ず登録のアクションを実行してみると、毎度起きていつもハマって困るエラーが発生しました。
Unexpected field 'file_data' in POST data
このエラーが発生した場合の原因や解決策として紹介されているのはだいたい以下のようなことが多かったです。
- DBのフィールド名が間違っている → inputのnameもしくはDBのフィールド名を変更する
- モデルが用意されていない → 対象ModelのTableとEntityを作成する
- キャッシュが残っている → tmpフォルダ内のキャッシュデータを削除する
- フォームにenctype=”multipart/form-data”がない → 追記する
当然上記の解決方法は試してみましたが、エラー表示消えず。ほんと心折られるなこのエラーメッセージ・・・
他の項目と同じようにして追加構築しているのになぜこのフィールドだけがエラー対象になるのか本当に全く分からない。
そして他に調べると、もう一つ解決方法を見つけました。それは以下のようなこと。
// ViewのForm内のend前あたりに追加
$this->Form->unlockField('file_data');
上記はセキュリティによるハッシュ化が行われないようにフィールドのロックを解除するのだそう。いわゆるセキュリティ対象から外れるという事になる。
実際これを追加し、アクション実行すると登録ができた。
うむむ・・・、通過したのは良かったけど、実際この解決はどうなんですかね?
他の項目は登録できたのに一つフィールドを他フィールドと同じように作っただけでエラーが発生してしまうってのもおかしな話だと思うんですけどね。僕からしたらむしろバグに近いものだと思ってますよもはや。
一先ずこれで終了とし、何かあった場合のエラー解消法として記録残しておきます。
同じようなエラー表示で困っている方にとって参考になれば幸いです。