- ベストアンサー
PHPのメッセージとは?Undefined offsetとは?select.phpのソースコードとは?
- PHP学習者です。機械の部品表(Bill of materials) のテーブルであるpartsmasterから条件によってレコードを検索して画面表示させるプログラムselect.phpで、Undefined offset (未定義のオフセット)というメッセージが出てきます。
- また、ソースコード(select.php)では、指定された条件に基づいてデータベースからデータを検索し、結果を表示する処理が行われています。さらに、画面ショット(selectQuery.php)も提供されています。
- 質問者は、Undefined offset (未定義のオフセット)とは何か、そしてこのメッセージが表示されないようにする方法について知りたいとしています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まずは、 ""とNULLは異なります。 $cols[$i] = "" は 長さが0の文字列という値です。 $cols[$i] = NULLは、 要素はあるけど、それに値がないこと unset($cols[$i]) は、 要素自体をなくすこと で、それぞれ違います。 > $cols[$i] =="" と empty($cols[$i]) はどう違うのでしょうか? empty($cols[$i])は $cols[$i]の中身が 長さが0の文字列や 0や "0" やfalseやNULL のときや $cols[$i]という要素自体がないときに 真(TRUE)となります。 しかし、$cols[$i]===""は、 長さが0の文字列のときだけ真となり unsetされたり、もともと代入されていなければ Undefined offsetのNoticeが発生します。 ちなみに、上の通り、長さ0の文字列ときは empty($cols[$i] は真になってくれるので empty($cols[$i] OR $cols[$i]==="" と書かなくても empty($cols[$i] だけ書いても、同じことですね。 変数や配列要素の 未定義や 空判定に !isset ( ) empty ( ) is_null( ) のなにを使うべきなのかは、 結構ややこしいのですが、以下が参考になるかと https://taisablog.com/archives/1324
その他の回答 (4)
- okwavey6
- ベストアンサー率17% (99/553)
>早速にご回答を頂きまして、有難うございます。 どういたしまして。 >私はNotepad ++ をエディターとして使っています。 私も使っていたことがあります。 Windowsでは良いんですが、Macで同じ環境を構築出来なかったので乗り換えてしまいました。 >もちろん行番号も出ますが、ソースコードをコピーするときに行番号を入れることが出来ませんでした。それで「問題となっている60行とはこれです、」と記入するのを忘れてしまい、見てもあまり意味のないものになってしまいました。 そうなんですよね。 プログラミング用の質問掲示板だと、始めから必要なものが揃っていたりします。 >教えて頂いたClimbi を少し調べてみましたが、ドメインネームが売りに出されていて、オファー金額を入力してくださいのような画面が出てきて、自分のプログラムソースコードをほかの人とシェアー出来るURLが出てくるようなものには出会えませんでした。 失礼しました。確認しておりませんでした。 >引き続き調べてみます。 検索スキルのアップがプログラミング学習ではプラスに働くと思います。 学習意欲があるのなら、環境構築も自分で出来るようになるとステップアップに繋がります。 自宅のPCにXAMPPをインストールするのも良いですし、VM Player で仮想PCを立て、そこにCentOSなどのLinux環境を構築してテスト用のサーバーとしても良いと思います。前者の方が簡単です。
お礼
色々とためになるご指摘を頂き、本当に有難うございます。プログラミングや環境設定などについては、まだまだ勉強の足りない未熟者ですので、励みになります。
- superside0
- ベストアンサー率64% (461/711)
60行目とは、 if( $cols[$i]=="" OR empty($cols[$i]) ){ ですね。 このOR順だと、先にORの左側の $cols[$i]=="" の評価を行うので $cols[$i]がunsetで削除されていたとき、 存在しない配列の要素を参照しているので,Undefined offsetとなります。 評価順を逆にすることで、ORの左側の式が真のとき右側の式は実行しなくなるので、Undefined offsetのNoticeは出なくなります。 つまり、 if ( empty($cols[$i]) OR $cols[$i]=="" ) { ですね。
お礼
早速のご回答、有難うございます。 なるほど、わかったような気がします。早速やりたいところですが、今は家にいて、明日会社に行ってみるまでは試してみることが出来ません。 ちなみに、$cols[$i] =="" と empty($cols[$i]) はどう違うのでしょうか? 配列の中である要素をunset( ) すると、その要素があった場所が空になるということですよね。この時には empty($cols[$i]) ではあるけれど、$cols[$i] =="" ではない、ということなのでしょうか? つまり"" は empty ではなく、NULL が入っていると考えて良いのでしょうか? もしご迷惑でなければ教えてください。
60行目で配列内にないものを指定している 例:配列が(1,2,3)だとして4番目の要素を指定した等
お礼
早速にご回答いただき、有難うございます。 配列 $cols[] は存在しますし、forループ中で添え字として使う$i は for($i=0; $i<$count; $i++) として0から配列にある要素の数だけを参照するようにしてます。 ちなみに、このプログラムは自分の家にある古いXAMPP Version 1.6.4. の上では何のメッセージもなく期待通りに動きますが、会社で使っている新しいXAMPP Version 3.2.4 で走らせると質問したようなメッセージが出てくるのです。しかし、家のXAMPPも新しくしようと考えているので、あえてこのことは言わずに質問しました。 何かバージョンによるPHP言語の仕様変化のようなものが関係しているのでしょうか?
- okwavey6
- ベストアンサー率17% (99/553)
学習者と言うことで、本当は技術者向けなんですが、簡単にアドバイスです。 ソースコードをそのままコピペしても、見辛いので、例えばこのようなものを使いましょう。 https://nelog.jp/climbi エラーメッセージでは、エラーが発生した行数も表示されていますので、行番号が表示されるようなエディタを使うと良いですね。 好みですか、VScodeと言うのを調べて使ってみると良いかもしれません。 エラーの意味としてよくあるのは、定義されていない配列のインデックスを指定して参照しているときに出ることが多いです。 また、学習者の質問も対象としている場で質問した方が、為になる回答が多いと思います。
お礼
早速にご回答を頂きまして、有難うございます。 私はNotepad ++ をエディターとして使っています。もちろん行番号も出ますが、ソースコードをコピーするときに行番号を入れることが出来ませんでした。それで「問題となっている60行とはこれです、」と記入するのを忘れてしまい、見てもあまり意味のないものになってしまいました。 教えて頂いたClimbi を少し調べてみましたが、ドメインネームが売りに出されていて、オファー金額を入力してくださいのような画面が出てきて、自分のプログラムソースコードをほかの人とシェアー出来るURLが出てくるようなものには出会えませんでした。 引き続き調べてみます。
お礼
詳しい説明、本当に有難うございます。 今まであまりよく知らずにempty( )などを使っていたのが恥かしいです。 教えて頂いたサイトを徹底的に勉強してみようと思います。