• ベストアンサー

【PHP】include()で余計な文字まで表示されてしまう

レンタルサーバーのPHP5利用者です。 include() や require() 等で外部の関数を読み込む場合、 <?php ~ ?> の外側に文字があるとそれが変なところで表示されてしまいます。例えば、 <呼び出し側> include(gaibu.php); $msg = write_fc(); print $msg; <外部ファイル側> aaa <?php function write_fc(){ return 'Hello'; } ?> bbb <結果> aaabbbHello といった感じなのですが… この「aaa」「bbb」をさせない方法があれば教えてください。 それとも<?php ~ ?> の外側に文字をかくこと自体非常識なのでしょうか。 お詳しい方、よろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

>この「aaa」「bbb」をさせない方法があれば教えてください。 質問内容のような書き方をしているかぎり、表示させない方法はありません >それとも<?php ~ ?> の外側に文字をかくこと自体非常識なのでしょうか。 個人で趣味レベルでのプログラムならば自由ですが、実際にプログラムを仕事としている人たちの中では非常識な記述方法です とりあえずの解決方法としては、function類は、function類だけを記述したファイルを作りましょう 実際に画面として表示させるところでincludeさせて処理をするという方法。 こうやっておくと、HTML部分とfunction部分を分離することが出来ます。 この方法が一般的と言うわけではありませんが、HTMLとphpのロジック部分をごちゃ混ぜにするよりはマシです。 <外部ファイル側> ------------func.php <?php function write_fc(){ return 'Hello'; } function FooFunc(){ return 'foo'; } function HogeFunc(){ return 'hoge'; } ?> -------------------- --------------------aaabbb.php <?php include(func.php); $foo = FooFunc(); $hoge = HogeFunc(); ?> aaa <?php print $foo; ?> bbb <?php print $hoge; ?> -------------------- 実行結果 aaaFoobbbHoge --------------------index.php <?php include(func.php); $msg = write_fc(); print $msg; ?> -------------------- 実行結果 Hello

ikataro
質問者

お礼

やっぱ <?php ~ ?> の外に文字を書いちゃダメなんですね。 ファーストサーバーの場合、プログラムの1行目に #! /usr/bin/php と書かなきゃいけないようなのでこれが丸見えになって困っていました。 でも外部ファイル側には書かなくても動作するみたいなのでなんとかなりそうです。 ありがとうございました。

その他の回答 (3)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.4

>ファーストサーバーの場合、プログラムの1行目に >#! /usr/bin/php >と書かなきゃいけないようなのでこれが丸見えになって困っていました。 CGI動作ですね。Perlスクリプトでも同じですが、最初に起動されるスクリプトの先頭にあればいいので、includeやrequireされる側には不要です。includeされる側は拡張子は.cgiや.phpに限定されないですしね。

ikataro
質問者

お礼

なんと!サーバー屋の説明にはそのようなことは… ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

できるかできないかと言われれば、できます。 呼び出し側で出力のバッファリング処理というのをすればよいでしょう。 ただ、インクルードするのに無駄な出力があるのはどうかとおもうので やらない方がだとうかなぁと。 <? ob_start(); include "gaibu.php"; ob_end_clean(); $msg = write_fc(); print $msg; ?>

ikataro
質問者

お礼

なるほど、書き出しをやめさせる方法があったのですね。 ありがとうございます。

回答No.1

includeされる側(=外部ファイル側)の <?php ~ ?> の外に文字を書くということは、「これらの文字列をそのままHTMLとして取り込んでね!」と宣言しているような状態です。よって、そのまま表示されるのが自然な動作です。 もしこれらの表示をさせたくないのであれば、  ・外部ファイルから該当する部分を削除する。  ・または、HTML形式のコメントアウトを施す。 といった対応になると思います。

ikataro
質問者

お礼

なるほど。 「aaa」「bbb」を受け取っても、いったん変数内に入れて削除とかできないかなと思っていましたが無理なんですね。 どの専門書にも <?php ~ ?> の外に文字を書くなとは書いてないし不思議に思っていました。 ありがとうございました。

関連するQ&A

  • PHP include_once

    include_onceで読み込んだファイルが そのままテキストとして出力されてしまいます。 以下のような感じです。 インクルードするファイル fail.inc test_val = array("aaa" => "aaa111", "bbb" => "bbb222", "ccc" => "ccc333"); ソース本体 src.php <?php include_once('./fail.inc'); 以下処理 exit(); ?> これをそのまま実行すると以下のように出力されます。 test_val = array("aaa" => "aaa111", "bbb" => "bbb222", "ccc" => "ccc333"); includeせずにそのまま走らせると正常に動きます。 httpd.confのaddtypeにincという拡張子は追加していませんが 他の同様のソースでは問題なく読み込めます。 require_onceとかも試しましたが同じようにfail.incの中身がそのままテキストとして 出力されてしまいます。 どうしたら正しく読み込めますでしょうか。 ご回答よろしくお願いしますm(_)m

    • ベストアンサー
    • PHP
  • PHPをインクルードした時の画像パスについて

    PHPでページをインクルードをしようと思っています。 index.htmlにインクルードするページを仮にaaa.htmlとbbb.htmlとします。 aaa.htmlとbbb.htmlはcommonというフォルダに入っています。 aaa.htmlなどに使われている画像はcommonの中のimgというフォルダに入っています。 階層を表すと index.html common  ├aaa.html  ├bbb.html  ├img   ├gazou.jpg   ├gazou2.jpg というふうになっています。 そこで、index.htmlに <?php include("common/aaa.html"); ?>でインクルードし インクルードするaaa.htmlに設置してある画像には ../common/img/gazou.jpg というパスで設置しました。画像の確認はindex.htmlで確認済みです。 ※img/gazou.jpgではなぜかダメでした。(aaa.htmlからの相対パスではなく、インクルードした側にindex.htmlからの相対パスになるのでしょうか?) 次に salonというフォルダにあるhair(ヘアサロン)のフォルダにあるkari(仮)というお店ページを作ります。 階層は以下のようになっています。 index.html common  ├aaa.html  ├bbb.html  ├img   ├gazou.jpg   ├gazou2.jpg salon  ├hair    ├kari     ├index.html     ├access     ├ ├index.html     ├menu     ├ ├index.html   インデックスがあり、アクセスページ、メニューページなどさらに一つ入るといった作りになっています。 ここのページにもtoppageのindex.htmlと同じようにaaa.htmlなどインクードします。 階層が違うのでsalon/hair/kari/index.htmlへのインクルードは <?php include("../../../common/aaa.html"); ?> で行いました。問題なくインクルードはできたのですが、画像がつぶれています。 階層が違うからですよね? このように階層が異なるデータで 共通のインクルードをしたい時はどうしたらいいのでしょうか? 階層が違くとも共通で入るヘッダー等作りたいのです。 環境はテストなのでアパッチ、ローカルサーバーで見ています。 本アップしないと見れないのでしょうか? お願いします。

    • ベストアンサー
    • PHP
  • インクルードした部分が表示されない

    サイドバーなど、すべてのページに共有する部分を外部ファイルにし、下の例のようにインクルードさせています。 ↓(例)↓ <? php require("http://○○○/sample.txt"); ?> 拡張子は、htmlにしたかったので、PHPが利用できるように、.htaccessで設定しています。 これで普通のページはちゃんと表示され、問題はなかったのですが、 メールフォームやYomi-Search、Movable Typeの検索結果など、 CGI?(? % & などがつくURL)のページでは インクルードさせている部分が真っ白になってしまいます。 ソースを見ると、 <? php require("http://○○○/sample.txt") ? > のままになっていました。 ? % & などがつくURLでは、インクルードできないということでしょうか? 解決法をご存知の方は、どうかご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHPのinclude_pathについて

    以下はPEARでExcelファイルを作成し、ダウンロードするプログラムです。 <?php require_once("Spreadsheet/Excel/Writer.php"); $workbook = new Spreadsheet_Excel_Writer('sample3-1.xls'); $worksheet =& $workbook->addWorksheet('サンプル'); $workbook->close(); print('<html>'); print('<head>'); print('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />'); print('</head>'); print('<body>'); print('<p><a href="./sample3-1.xls">Excelファイル</a></p>'); print('</body></html>'); ?> このプログラムを実行すると、 Warning: require_once(Spreadsheet/Excel/Writer.php) [function.require-once]: failed to open stream: No such file or directory in C:\Inetpub\wwwroot\Test\src\excelsample.php on line 2 Fatal error: require_once() [function.require]: Failed opening required 'Spreadsheet/Excel/Writer.php' (include_path='.;C:\php5\pear') in C:\Inetpub\wwwroot\Test\src\excelsample.php on line 2 というエラーメッセージが出ます。 php.iniには、PEARのパッケージをインストールした際に ;***** Added by go-pear include_path=".;C:\php-5.2.17-Win32-VC6-x86\pear" ;***** と記述されているにも関わらず、エラーメッセージのpathはinclude_path='.;C:\php5\pear'となっており、原因がわかりません。 php.iniはC:\WINDOWSの直下に置いてあります。 PHPのバージョンはphp-5.2.17-Win32-VC6-x86で、Cドライブの直下にインストールしています。 WebサーバーはIISです。 eclipseを使っており、バージョン?はpleiades-e3.6-php_20110326です。 また、phpinfoのinclude_pathはLocalとMasterの両方が.;C:\php5\pearとなっています…。 Configuration File (php.ini) Path C:\WINDOWS Loaded Configuration File C:\WINDOWS\php.ini この2つはこの様になっており、これは2つの場所は一致していないといけないのでしょうか? 解決手段がまったくわかりません。 何かこのエラーについてわかることがあれば教えていただけませんか?

    • 締切済み
    • PHP
  • include/require文へのバリデーション

    include/require文でユーザが入力した文字列を未検証のまま使用をしてはいけませんが、 $filename = array('aaa','bbb','ccc'); for($i=0; $i<count($filename); $i++){ include('folder/' . $filename[$i] . '_include.php'); } のようにユーザーが入力した文字列を使わずに使用する場合はバリデーションはしなくても、 ハッキングされる心配はないのでしょうか?

    • ベストアンサー
    • PHP
  • header関数で文字化け

    PHP初心者なのでよろしくお願いします。 たとえば header('Location: aaa.php?msg=こんにちは'); として、 aaa.php側で受け取って表示させると「こんにちは」が文字化けします。 Firefoxでは大丈夫でIEで文字化けします。 これを回避するにはどう記述したらいいでしょうか?

    • ベストアンサー
    • PHP
  • htmlファイルをincludeして、文字列変換して表示

    お世話になります。 /index.php  /aaa/index.phh    /aaa01.jpg    /aaa02.jpg  /bbb/index.php    /bbb01.jpg    /bbb02.jpg    /bbb03.jpg と、いうようなフォルダ構造でホームページを作成して、 /index.php で <body>  ヘッダだよ<br>  include_once("aaa/index.php");  フッタだよ<br> </body> とすると、aaa/index.php に書かれてある文字を表示することができます。 しかし、画像 aaa01.jpgなどは、/以下になく、/aaa/以下にあるため、 表示されません。 そこで、include_onceと同時に <img src="aaa01.jpg" となっているところを、 <img src="aaa/aaa01.jpg" と、書き換えられないものかと考えた次第です。 やりたいことは、同じヘッダフッタを持ったページで、その中に フレームタグなどを使用することなく、 別々のフォルダに別々に作成したページ、/aaa/index.php /bbb/index.php などを 表示したいと、いうことです。 全く別の発想でも構いません、よい案などあればご紹介ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP includeについて

    今、下記のようなサーバサイドのプログラムを作成しており、 解決できずに困っております。 【環境】 CentOS5 [PHP5] sakuraインターネット レンタルサーバ スタンダートプランです。 参考:http://www.sakura.ne.jp/rentalserver/matrix.html 【概要】 cronよりinclude関数を含むPHPファイルを実行、 そのPHPファイル内から他dirに保管されているテキストを参照し、 外部ASPへ文字列を送信する、という内容です。 理想としては、 cron1よりphp1を実行し、 php1に記載されている下記、 include 'phpA'; include 'phpB'; これら2行を完結させる事です。 しかしphpAは正常動作するのですが、 phpBは正常に動作せず、理想と異なる結果になります。 テストとして、下記を実行しました。 ★test1 php1のinclude関数を入れ替える。 include 'phpB'; include 'phpA'; 結果:phpBは正常動作、phpAにエラー。 ★test2 cron1よりphpAのみを実行 cron2を追加しphpBを実行 結果:phpA&B共に正常動作。 ★test3 test1と同じ構造でphp1を次のように変更。 include 'phpA'; sleep(30); session_unset(); $_SESSION = array(); session_destroy(); session_start(); include 'phpB'; 結果:phpAのみ正常動作。 上記の通り、cronを2種作成すれば理想の結果が返るのですが、 仕様上それは採用できず、あくまでphp1のみをcronより実行する 必要があります。 セッション・変数をリセットする必要があるのかと test3を試しましたが結果は同じでした。 尚、私はPGを専業としておらず質問に不適切な記載があるかと存じます。 お知恵をお借りできますと幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • Smartyのテンプレートにincludeしたファイルを表示したいので

    Smartyのテンプレートにincludeしたファイルを表示したいのですが、うまくいきません。 具体的には、意図しない数値が入ってしまいます。 どうすればよいのでしょうか? ■呼び出す側 require("../../libs/Smarty.class.php"); require_once('../../lib/set_include_path.php'); $header = include("header.php"); $smarty = new Smarty(); $smarty->assign("header",$header); $smarty->display("date.html"); ■テンプレート <body> {$header}<br>日付<br> ■表示例 include("header.php"); の内容が正常表示 1 日付 include("header.php"); の内容が正常表示された後、勝手に「1」と表示されるので、困ってます。表示されないようにするにはどうすればよいでしょうか。 var_dump($header);ってしたところ、int(1) ってなるので、この1が表示されているのかと思うのですが、なんで表示されるのか、表示されないようにするにはどうすればよいか、教えてください。

    • ベストアンサー
    • PHP
  • ファイルの先頭に文字を追加するには?

    ファイルの先頭に文字を追加するにはどうしたらよいでしょうか? ファイルの末尾に追加するなら echo 追加する文字列 >> ファイル名 でオッケーですが、 先頭に追加する方法が、単純そうなのに、調べても分かりませんでした。 例えば test.txt の中身が以下で、 aaa bbb # echo hello >> test.txt で aaa bbb hello となりますが、 hello aaa bbb とするには、どうしたらよいでしょうか。 単純なコマンドはあるでしょうか。

専門家に質問してみよう