
今更だけど、PHPでサーバーにnullをPOST送信しようとすると、正規の手段では送れません。
これまでは騙し騙し使ってきたけど、仕事でガッツリSQLサービスを作ることになったので、適当な処理を書くわけにはいきません。
nullを送る方法が複数あるので、その方法を備忘録。
何故サーバーにnullを送る必要があるのか?
SQLにIS NULLでスキーマセットされているテーブルに対して、insertやupdateで、値をセットしなければそのカラム値はnullになります。
でも、ユーザーデータ更新のように、すでに値が登録されている場合、対象カラムの値をnullにしたい場合は、nullまたはブランク文字列を送信しないといけません。
今回の場合、チェックボックスで、何かしらのフラグとして、booleanのfalseまたは、INT値として0またはnullというような場合、ORMで処理してくれるケースもありますが、
今回はオレオレフレームワークの構築のため、自分で処理しないといけないケースに気がつきました。
そして、PHPに対して、POSTでもGETでもnull値を送る事ができない事態に気がついたというストーリーです。
nullが許可されている場合、falseや0などのような方に合わせた形で処理をするよりは、nullとして統一した方が扱いやすいという怠け思考でもあるので、null送りたいんですよね。
何故null値が送れないのか?
https://example.com/?sample_column=
この形で、GETクエリで送信をした場合、$_GET["sample"]は、ブランク文字列になります。
INTやBOOLEANカラムの場合は、エラーになるでしょう。
https://example.com/?sample=null
もちろん、こんなことをやっても、"null"文字列として扱われてしまいます。
https://example.com/
ただ、このように、クエリに含まれていない変数は、PHPではnullとして扱われます。
typeof(@$_GET["sample"])
> NULL
$_GETだけじゃなく、$_POSTでも同じ結果が返ってきます。
でも、任意のkey値をnullにしたいのに、存在しないnullを扱いたいわけではありません。
このように、クエリでnullを送るのは至難の業なんですね。
JSON形式で送信
$json = json_encode(["samplel" => null])
> https://example.com/?sample={$json}
JSONを文字列としてサーバーに送信して、それを受けたサーバーで、json_decodeをすれば、null値は送信できます。
$data = json_decode(@$_GET["sample_json"], true)
> $data["sample"] >> null
分かってはいたけど、いちいちjsonでコードするのがめんどくさいと考えて後回しにしてましたが、今回はこれが一番確実そうです。
カラム情報に合わせたjsonデータを送って毎回decodeすればいいかと割り切りました。
置き換え文字で対応するパターン
実はもう一つやり方があって、次のように、任意の文字列として送信して、サーバーでそれをnullに変換する方法です。
https://example.com/?sample=%null%
str_replace("%null%" , null , @$_GET["sample"])
個別の対応であれば、これでもいいかもしれませんが、汎用的なプログラムを書く場合は、文字列に気を遣うし、複数人開発ではトラブルになりやすいと思うので、
今回はこの方法はNGとしました。
あとがき
なんも考えずにプログラムをしていると、たまにこういうアホみたいな基礎ポイントでつまづくことがあります。
やはり、プログラミングのポイントは、他人がみた時のソースと、汎用性が重視されていることだと思うので、
その場しのぎのプログラムを書くと、その後一番困るのは自分であるということは、経験から身に染みて理解しています。
Have a good program.
0 件のコメント:
コメントを投稿