gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

0000-00-00 と PHP:実装側の考察

さて。
とりあえず「0000-00-00を食い止める」を至上命題にする場合、必要なのが
・空文字でINSERTしない
ここ。
これを主眼にして、少し実装側の考察をしてみませう。

一つ、ガードとして
sql_modeに STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_DATE を入れて置く
という手があるのですが。データは入らないのですが「SQLでエラーになる」ので、やり方を間違えると若干困るので、もうちょっと頑張ってみましょう。

https://gallu.hatenadiary.jp/entry/2019/11/04/160833 でも書きましたが、Laravel には ConvertEmptyStringsToNull というMiddleware があります。
今回の件で考えると一件便利そう、ではあるのですが、LaravelのConvertEmptyStringsToNullは「全項目無差別」なので。

んと……端的には
・文字列のカラムがあって
・空文字でもいい(入力必須ではない)
ようなケースで、ConvertEmptyStringsToNullがonになっていると
・未入力
・空文字……が、ConvertEmptyStringsToNullによってNULLに変換される
・NULLをinsertしようとしてエラー(NOT NULL制約って、普通、入ってるよね?)
って感じになるので、無差別はちょっと嬉しくないの感じでございます。

となると、とりあえずやりたいのが
・「カラムが日付系の型のデータだけ」空文字ならNULLに変換したい
ってのが、とりあえず今回としては「よい落としどころ」になるのではないかなぁ、と思っています。

後は、カラムによっては「文字型であろうが"NULL許可で、空文字が入るくらいならNULLがいい"」ってケースが、おいちゃんは全く思いつかないし思い浮かばないのですが、もしかするとそういうケースが「ないとも限らない」のであろうなぁ、と、思われるので(可能性としては)。

大雑把には
・「対象になるカラム名の配列」を用意して
・そのカラムについては「空文字ならNULLに置換する」
ような処理を、良い感じの箇所に挟み込んでおくと、比較的「案配がよい」のではないかなぁ、と思われます。

「とりあえず」SlimLittleToolsでの実装予定

んで。最近、Slimが大変にお好みなので、つい SlimLittleTools / なんてぇものを作って、使っておりますが。
そこでは
・filterの追加: ConvertEmptyStringsToNull と同じようなもの、を、カラム単位で出来るように
・MackModelDetail の修正( make_model_detail.php の実態 ):「日付型のカラムの配列」を作成できるようにする
・Modelの修正: 「日付型のカラムの配列」については「空文字ならNULL」に変換するようにする:その変換が on/off 出来るようなスイッチ用のメソッドを追加(デフォルトは、一応 false(変換しない)にしておく)
なんて実装を考えてます。

あと、 https://gallu.hatenadiary.jp/entry/2019/11/04/160833 で書いた
> NULLをVALUESに与えると、NULLになる(DEFAULTの値にはならない)
この部分が微妙に気になって引っかかっているので。加えて
・Modelの修正: insertとupdateのタイミングで「値がNULLなら、keyごと削除」の処理を追加:その削除が on/off 出来るようなスイッチ用のメソッドを追加(デフォルトは、一応 true(削除する)にしておく)
を入れておこうかなぁ、と思ってます。

この辺はまだ、少し考察や検討の余地などもありそうなので。
ご意見などいただけると、反映できる、かもしれないので、よかったら是非。