yii 2プロンプトエラー1062 Duplicate entry'xxx&'for key'uniqe_index'まとめ


昨日バックグラウンドで話題データを追加したとき、以下のエラーを報告しました.エラーメッセージを見るとmysqlのnameフィールドに一意のインデックスが設定されていることがわかり、データが挿入できないため、なぜ直接エラーを報告したのか分かりません.他の値を挿入してもこのような状況に遭遇しなかったからです.
モデルのrulesで発見されました
[['name'], 'filter', 'filter' => '\yii\helpers\Html::encode']

この検証コードは、それが原因であることがわかります.nameフィールドの検証にはfilterも使用されるため、Html::encodeは入力したhtmlを含む特殊文字をエスケープします.当時は「CHARLES&KEITH」と入力され、Html::encodeを経て「CHARLES'&'amp;KEITH」に変換され、ライブラリに格納されたフィールド値が「CHARLES'&'amp;KEITH」となりました.名前フィールドの検証もあります
[['name'], 'unique']

ユーザーが入力した「CHARLES&KEITH」の値を使用して、データベース内のすべてのnameフィールドと比較するだけで、比較すると自然に通過します(フロントエンドでこの関門を検証します).しかし、次にfilterは、ユーザーが入力した値をHtml::encodeから「CHARLES'&'amp;KEITH」に変換し、データベースに挿入すると、nameフィールドに一意のインデックスが設定されているため、この値が存在し、yii 2はこのエラーを報告します(理解が間違っている場合は訂正してください).