こんにちは!
ナビゲータのEVEです。
引き続きPrototype EVEで使用していたバッチ処理を修正しています。いろいろありますね・・・。不整合が、今回PHP5からPHP8へ変更したことにより、噴出しています。
[不整合]
昨日、今日発見した不整合は以下の通りです。
❶不要な位置にbreakが入っているとエラーになる。例えばif文・・・。
❷HTMLで利用する、コンボボックス内で、SELECTEDを指定しても同行が選択されない。
❸MySQLのNULLを許容している項目に、""でデータの挿入ができなくなった。
❶は、単純なミスです。if文にbreak文が入っていて、エラーになりました。PHP5の時はエラーにはなっていません。
❷は、サーバーサイトでHTMLで編集し、コンボボックスの当該行にSELECTEDを指定しても、同行が表示されません。一番上の行が表示されています。最初、JavaScriptでオンロードのタイミングで以下のように指定していました。
window.document.FormName.ElementName.options[ComboboxIndex].selected = true;
その指定で、ComboboxIndex、添え字の指定に誤りを見つけたため、その部分をサーバーサイトで実現しようと、HTMLを編集する方法を採用したのですが、思ったような動作をしません。
そのため、結局元に戻し、JavaScriptで正しい添え字を設定し、正常の動作にしたという修正をしています。なぜだろう???PHPのバージョンには、関係ないはずなのだが・・・?
❸は、PDOの仕様のようです。MySQLでNULLが許容されているなら、そこに何も設定しないのなら、NULLを指定しろというのです。今まで""とNULLは区別なく利用できたのですが、PDOを利用する場合、それを明確に区別し登録しなくてはいけないようです。ちなみに、最初の段階では、PHPからのメッセージに基づき、NULLではなく、イニシャルデータ例えば0を設定していました。しかし、ChatGPTにこの問題を相談したところ、NULLを明示的に指定すればいいことを教わりました。この場合、初期データを設定したいだけだったので、NULLに再修正しています。
ちなみに、""は文字列で、NULLはデータ型NULLという扱いで全く別の文字コードを使用しています。知っていたんですけれどね・・・・。ちなみに、その違いについて、ChatGPTに聞いてみました。
プログラムで ""(ダブルクォーテーション内に何も文字がない空の文字列)と NULL は異なるものです。これらは異なるデータ型および値を表現します。
❶""(空の文字列)
・データ型
文字列 (String)
・表現
"" または ''
・意味
文字列データ型で、文字列として空の文字を持つことを示します。つまり、文字列データ型の変数や値が何も含まないことを表します。
❷NULL
・データ型
NULL
・表現
NULL
・意味
NULLは特別なデータ型で、値が存在しないことを示します。NULLは変数やデータベースフィールドに値が設定されていないことを表します。NULLは存在しない値として扱われ、通常のデータ型とは異なります。
言語によっては、"" と NULL は異なるデータ型であり、異なる比較結果を返すことがあります。例えば、PHPにおいて "" と NULL を比較すると true が返りますが、== で比較すると true が返ることになります。ただし、=== を使用するとデータ型も一致させる必要があるため、"" === NULL は false となります。
言語やコンテキストによって、"" と NULL の振る舞いは異なりますが、一般的には "" は空の文字列であり、NULL は値が存在しないことを示す特別なデータ型であると考えてください。
厳格に区別する方式が採用されたようです。ちょっと、気になるのは、違うなら、コードで表現した場合、それぞれのコードがあるような気がするのですが、ChatGPTからの回答はありませんでした?
[あとがき]
かかりっきりというわけではないのですが、いろいろあり時間がかかっています。本日、Prototype EVEの管理システムで、管理者ユーザーのパスワードを変更しましたが、正常に変更できました。バッチ処理以外のシステムを動かしたのは、本日が初めてなので、感動です。
そうそう、pro2grammer.comへアクセスできなくなっていました。ドメインの有効期限切れです。近頃、クライアントのVMWareで開発をしていのたので、気にしていませんでした。次に来るのはSSLの更新なのですが、それまでには、バッチ処理の製造を完了したいと願っています・・・。
では、また!!!