このサイトには広告リンクが含まれます。

PHPのreadfileで、Parse errorとWarningが出たときに、解決した流れを書いてみる

いつもはエラーが出ても、メモもしないで、検索してつつき回して解決しちゃっていますが。
今回は忘れずメモできたので、まとめてみます。

初歩的すぎる内容かもしれませんが・・・

スポンサーリンク

もとのコード

登場するファイルは、次の4つです。
 oyayubi-typing/expand/monthly03.php・・・メインのHTMLファイル
 oyayubi-typing/ads/ad_month03.php・・・メインファイルに広告を置くためのPHPファイル
 oyayubi-typing/ads/gads_728x90.html・・・貼り付ける広告
 oyayubi-typing/menu-and-footer.php・・・フッターとサイドメニューのHTMLファイル

ちなみにサイトはこれです → 親指タイピング|無料の親指シフト入力練習サイト

コードは以下。さて、何が問題でしょう。

/* monthly03.phpのbody内 */
<div id="waku">
<div id="main" class="green">
<!-- 中略(メイン部分) -->
<?php include('../ads/ad_month03.php'); ?>
</div><!-- /main -->
<?php include('../menu-and-footer.php'); ?>
<!-- 中略(パンくずナビ) -->
</div><!-- /waku -->

/* ad_month03.php */
<?php
  readfile 'gads_728x90.html';
?>

最初の表示

広告を読み込む部分でエラーが出ています。
また、この部分より後に書いてある、フッターとサイドメニューを読み込むPHPは、読み込まれていません。

エラー内容

こんなの。パスの前半は伏せてます。

Parse error: syntax error, unexpected “gads_728x90.html” (T_CONSTANT_ENCAPSED_STRING) in /パス/oyayubi-typing/ads/ad_month03.php on line 2

とりあえず、検索の助けも借りながら読みます。

Parse errorというのは、PHPの解析がうまくいかなかった、というエラーだそうです。プログラムの実行以前に、問題が起きてしまったようです。
内容としては、構文エラー(syntax error)であると。
具体的には、予期しない(unexpected)、”gads_728x90.html”っていう文字列(STRING)が、ad_month03.phpの2行目にありますよ、と。

そう主張していらっしゃるようなんですが、何がおかしいねん。

よくみたら、readfileにカッコ()が抜けていました。
なぜ書かなかった、自分。

コード修正

カッコを足しました。

/* ad_month03.php(旧) */
<?php
  readfile 'gads_728x90.html';
?>

/* ad_month03.php(新) */
<?php
  readfile ('gads_728x90.html');
?>

修正後の表示

PHPの解析が最後までできたようで、フッターとサイドメニューが表示されました。
しかし、まだエラーが出ています。

エラー内容2

今度は警告(Warning)だそうです。

Warning: readfile(gads_728x90.html): failed to open stream: No such file or directory in /パス/oyayubi-typing/ads/ad_month03.php on line 2

警告つまり、文法的には読めるけど、何か間違ってんじゃないの、と。
具体的には、readfileでファイルを開くのに失敗した(failed to open stream)、なぜならそんなファイルはない(No such file)と言ってます。

ちゃんとあるじゃん、adsフォルダに一緒に入ってるよ。
と思い、ファイル名の書き間違いを疑ったのですが、違うようです。

もしかすると、パスの書き方が違うのかもしれません。
ad_month03.phpから見たパスではなく、monthly03.phpから見たパスにしないといけないのでは。

コード修正2

パスを直しました。

/* ad_month03.php(新) */
<?php
  readfile ('gads_728x90.html');
?>

/* ad_month03.php(再修正) */
<?php
  readfile ('../ads/gads_728x90.html');
?>

再修正後の表示

意図していた表示になりました。よし。

まとめ

エラーはこうやって地道に直してます。なけなしの検索力と英単語力でぶん回してるうちに、知識や経験が蓄積されていく感じです。
 

プログラムは、脱力するほど単純な入力ミスで、エラーになります。
カッコの種類や付け忘れ・閉じ忘れ、文末のセミコロン忘れなんかには気をつけます。
これは今までも身に染みていること。

あとは、ファイルAの中で、includeを使ってファイルBを呼び出し、Bの中でさらにファイルCを呼び出す場合。
BやC内に書くファイルのパスは、大元のAを基準にします。(相対パスの場合)
これは、HTMLのパーツを貼り付ける場合も、PHPファイルを読み込む場合も、同じらしいと今回学びました。
 

ところで、文中では修正前後のファイルについて、「新」やら「再修正」と書きましたが、これは悪い例です。
これだと後で、どれがどれだか分からなくなっちゃうので。
実際には、日付+通し番号など、どれが新しいのか分かるような名前を付けましょう。

そんなところです。
 

参考

「Parse error: syntax error」とは? | PHPプログラミングの教科書 [php1st.com]
PHPのエラー・警告・注意の違いとは | PHPプログラミングの教科書 [php1st.com]

関連記事

【結局どれ】webページをパーツ分けして、PHPで組み合わす時の関数5種【脱・見よう見まね】
自作のタイピングサイトや小説サイトにおいて、メニューなど共通の項目を外部ファイル化し、PHPを使って呼び出しています。 今まで何の疑問もなく・・・
プログラミング
文月をフォローする
スポンサーリンク
スポンサーリンク
こちらもいかが?

コメント

スポンサーリンク
タイトルとURLをコピーしました