このサイトはPHPを独習する際に作成したスクリプトを基に、プログラム言語初心者のための入門講座として作成しました。PHPは初心者に親しみやすく、解りやすいプログラム言語です。これからプログラムを学ぶ人の参考になればと思います。
エラーについて
PHPはプログラム言語ですから、色々なことができます。でも正しく書かなければうまく動きません。 正しくない記述をすれば、予想した動きは不可能です。プログラムのどこかに間違いがあるのですね。 PHPはスクリプトにエラーがある場合、そのエラーがどの行にあるのかを表示してくれます。このエラー表示は英語で何行目と教えてくれるのですが、実はなかなか手ごわい相手です。 また、場合によってはパソコンの暴走、壊れてしまうこともあります。エラー表示がでるのはいい方と考えて、がんばって修正に取り組みましょう。
エラーの種類
エラーと言っても実はいくつかの種類があります。代表的なのは Error Warning Notice です。これ以外にもあるようなのですが、出たことがないですね。
Parse error: parse error, unexpected '}' in C:Program FilesApache・・・index.php on line 131
Parse error やFatal errorが出てきた場合は、当然プログラムは動いていません。この場合はスクリプトのバグ探しです。PHPはどの行にエラーがあるのかを表示してくれます。最後の on line 131 の部分「131行」がおかしいと言う意味です。
多くの場合、表示された行番号の上の行あたりが怪しいですね。上の例では「unexpected '}'」とありますが、これは対応する{}の問題で始まりの '{' がないためにでたエラーです。この場合は131行ではなくおそらくその数行上のあたりに間違いがあるはずです。
かなり困るのがこの行番号が一番最後の行になっている場合です。つまりどの行か特定できない時もあるのですね。こんなとき、私は/*〜*/を使って間違いを探しています。まずスクリプトの90%ほどを取り囲みエラーが出ないことを確認して順にその範囲を狭くしていくわけです。 ちょっと手間はかかりますが、これなら必ず見つけ出すことができます。
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers ・・・ in asd.php on line 3
この警告はsession_start の前に1行あけてしまったため表示されるメッセージです。しかしプログラムは普通に動く場合があります。この場合もメッセージは表示されたままですが正常に作動しました。
Notice: Use of undefined constant j - assumed 'j' in・・・index.php on line 131
注意は通常は表示されません。php.ini の設定を変更することで表示させることができます。名前の通り「注意」なので「動けばいいや」的な場合は気にせずいてもいい訳です。私も長い間放置していました。
この場合はdate 関数の format パラメータ文字列(ここでは j / Y / m)を「"」で括っていなかったため表示されたメッセージです。 フォーマットの文字は「"」で括らなくても動作するようですが、その代わりに「『"』を使う方を推奨します」というメッセージを表示しているのです。
最も危険なエラーは無限ループです。これは while 等の使い方の間違いから起こります。これはエラーとしては問題外ですが、はじめのうちはよくやってしまうものです。 その場合、先ずはブラウザの終了を試してください。それでだめならタスクマネージャで終了します。 それでも反応がない場合は強制終了ですね。ループの扱いにはくれぐれも注意してください。
すべてのエラーを表示させる方法
エラーを表示させるどうかは、設定ができます。通常では表示させるようになっていますが php.ini の設定を変えることで表示させないようにすることもできるのです。 しかし、作成段階では表示させる方がいいので、通常は変更の必要はありません。しかし、Error と Warning は表示されるのですが、Notice は表示されない設定になっていると思います。 php.ini で Notice を表示させる方法は300行あたりに
302行 error_reporting = E_ALL & ~E_NOTICE
という記述があります。「;」はない行です。この「~E_NOTICE」は Notice は除くという意味です。これを削除すると Notice が表示されるようになります。
302行 error_reporting = E_ALL
これでスクリプトによっては大量の Notice を見ることができます。 最もよく出るのが、「Notice: undefined index・・・」です。おもしろいことにYahoo でこの言葉を検索すると、このエラーの解説ではなく実際にエラーとして表示されているサイトが出てきます。
エラーログを残す
エラーはログとして記録されます。しかし通常は残らない設定になっていました。php.ini で設定します。 367行あたりにログファイルの保存場所を指定する記述があります。以下の記述の場合phpフォルダとlogフォルダは作成してください。「;」があれば削除します。
367行 error_log = "C:/php/log/error.log"
でも大量のログが残るのも困り物です。Notice は状況によって大量に発生する場合があります。実際の動作が可能であるため気がつかずに、大量の Notice を書き出すことがあるのです。そのデータは5GBにもなることがあります。1ファイルで5GBもあるテキストデータは開くことすらできません。 通常は必要ないと思うのでもとに戻しておきましょう。
エラーの表示を回避する
これで Notice を含むすべてのエラーが表示されるようになりました。「注意」は無視しても動くのですが、やはり正しい記述に直したほうがいいですね。 気付かずに内部で無駄な処理をさせている場合などに、Notice が大量に発生することもあります。レンタルサーバーではエラーが大量に発生した場合を考慮して Notice は残さないか、すぐに削除しているのではないかと思います。 上記例のメッセージはカレンダーへのアクセス、つまりページビューが発生する毎に出力されます。私のサイトでもカレンダーがあるのですが、月や年を変更するたび、すべてのNotice を出力するため大量のデータが出るのです。 そこで役に立つのが次の1行です。これをスクリプトの1行目に入れるとエラーを表示させなくなります。作成中は//でエスケープして、間違い訂正をする。サーバーに上げるときは有効にするのです。
error_reporting(1);
プログラミングってエラーとの戦いみたいなとこがありますよね。皆さんもがんばってください。 なおこのサイトで公開しているスクリプトにも沢山の Notice がありました。修正していないものもあるので注意して御利用ください。(2008/4/24)
|