[PHP] issetはnullでfalseを返す仕様

2023年7月7日

PHP

eyecatch プログラミング言語の仕様をキチンと理解していないと、とんでもない不具合に遭遇します。 とあるDatabaseシステムを構築していた時に、insert時に、is nullカラムの対応で、nullのカラム値の情報を削除する必要があったので、処理を書いていたところ、 どれだけやっても、エラーが無くならなかったので、調べてみたらPHPの言語仕様を間違えて認識していたことが判明。 エンジニアのあるあるネタなのかもしれませんが、自分への戒めとして、今回の経緯をブログに残しておきます。

不具合の内容

データベースって、idカラムは大体が、整数タイプで、NOT NULLとされているのと、インクリメント処理がされている場合が多いので、UPDATEの時は、WHEREでID指定をしますが、INSERTの場合は、ID値は指定しないほうが都合がいいです。 SQLにINSERTを実行する前に次のようなコードでIDを除外していました。 function database_insert($data=[]){ if(isset($data['id'])){ unset($data['id']); } $this->sql_insert($data); } $dataに、INSERTされるデータ一式が入っているのですが、その時に、idというkey値が存在すれば、idキーを削除するという意味で書いたのですが、これでエラーが続出 調べてみると$data['id']がnullの時にエラーが出ていることが判明。

issetで存在確認

そもそも、issetって、変数がセットされている事の確認だと思って使っていたんですが、どうやらnullの時には、falseを返す仕様だったんですね。 確認するために、次のようなコードを書いてみました。 <?php $a = [ "b" => null, "c" => 1, ]; echo 'b: '. isset($a['b']).PHP_EOL; echo 'c: '. isset($a['c']).PHP_EOL; 結果は、 b : c : 1 オーマイガ!

リファレンスサイトを良く読もう!

その後リファレンスサイトを読んでみると、ちゃんとnullはダメよ的な内容が書かれていました。
変数がセットされているかを調べます。 これは変数が宣言されており、 null とは異なる値だということです。 変数が、unset() により割当を解除された場合、 もはやセットされているとは見做されません。 null が代入されている変数をチェックしたときは、 isset() は false を返します。 null文字 ("\0") は PHP の null 定数とは異なることにも注意してください。 複数のパラメータが渡された場合は、 isset() は全てのパラメータがセットされている場合にだけ true を返します。 評価は左から右へと行われ、セットされていない値に出会うとすぐに評価が止まります。 参考 : https://www.php.net/manual/ja/function.isset.php

連想配列のkey値調べは、array_key_exists()

今回の場合は、array_key_exists()という関数を使って、key値(添字)の存在確認をするのが良かったようです。 う〜ん、仕方がないので、一句。 「PHP、insetはnullで、奥深し」 こんな自分に幸あれ!

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ