プログラミング言語の仕様をキチンと理解していないと、とんでもない不具合に遭遇します。
とある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で、奥深し」
こんな自分に幸あれ!
0 件のコメント:
コメントを投稿