著者がプロジェクトで単純な作成問題のインターフェイスを作成していたとき、誤って ThinkPHP の 2 つの落とし穴を踏んでしまいました。これをピットと呼んでいるのは、実際にはドキュメントに不慣れなためです。インターフェイス コードは次のとおりです。
public function createProblems(){ $problems = I('json.'); if (empty($problems)) { $this->error($problems, 'json格式不符合规范'); } foreach ($problems as $problem) { $data = D('Problem')->create($problem, self::OP_INSERT); if (!$data) { $this->error($problem, D('Problem')->getError()); } $temp[] = $data; } $ret = D('Problem', 'Service')->addProblems($temp); if ($ret === false) { $this->error(null, '导入失败'); } $this->success(null);}
インターフェイスによって完成される関数は、バッチで問題を作成することです。パラメーターは json 配列です。
自動入力を使用すると、フォーム送信項目が上書きされる可能性があります。その目的は、フォームフィールドの不正な送信を防止することです。 Model クラスの create メソッドを使用してデータ オブジェクトを作成すると、フォーム データが自動的に処理されます。
オートフィルはフォームを上書きすることが公式ドキュメントに明記されているため、投稿したパラメータに特定の値を与えてもcreateメソッド使用後に上書きされる可能性があります。 気をつけてください! ! !
addAll メソッドには Null 値を含めることはできません。そうしないと、他のデータが自動的に前方に移動し、追加が失敗します。例:
[ { "appId": 1, "serviceId": 2, "createUser":null, "status": 1, "priority": 2 }]
このうち、createUserフィールドがnullとなり、挿入時のSQL文がva_problem(appId,serviceId,createUser,status,priority)の値(1,2, 1、2) 。 null 値がなくなったため、挿入が失敗します。これは ThinkPHP3.2.3 のバグです。このブログには関連する議論があります。
problemModel には、createUser が自動的に入力されます。
API を通じて質問を作成すると、最初に自動入力が上書きされるため、フォーム内の createUser 値が無効になります。これが最初の落とし穴です。次に、自動入力の createUser が get_username() 関数を呼び出すため、API 経由で呼び出されたときに session(username) が値を取得できないため、フィールドは作成後に "createUser":null になり、2 番目の落とし穴が生じます。