include_pathについての質問 - 質問文章

このQ&Aのポイント
  • PHPのinclude_pathについて質問です。
  • 特定の状況での相対パスの書き方について教えてください。
  • include_pathの設定とファイルの位置関係の関係について詳しく知りたいです。
回答を見る
  • ベストアンサー

include_pathについて。

PHP 5.2以上のバージョンの話として質問をさせて頂きます。 (ローカルではWindows版XAMPPを使用。リモートはLinuxサーバー。) ----- <ファイルの位置関係> imgディレクトリ --- C.jpg (画像ファイル) mainディレクトリ --- A.php sub ディレクトリ --- funcディレクトリ --- B.php (img、main、subディレクトリは3つとも同階層) //------- (A.phpの記述) require_once '../sub/func/B.php'; //------- (B.phpの記述) echo '<img src="C.jpgのパス">'; // ←■画像Cを表示したい■ //★どう表示されるかテスト★ echo dirname(__FILE__) ;   //----- このような状況で、 A.phpにアクセスすると、★テスト★の所は、 ~/sub/func   //←のように表示される。 // つまりこれは、__FILE__ は、 // A.phpではなく、B.phpを指している。(?) と、このような時、B.phpの中で、 C画像の相対パスは、どう書いたらよろしいのでしょうか? A.phpから見た、C画像の相対パスで書いたらいい? それとも、B.phpから見たソレでしょうか? phpinfo()でinclude_pathの項目を調べると、 .:/usr/local/lib/php/~ のように書かれています。(デフォルトのままです。)

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • kinta03
  • ベストアンサー率41% (7/17)
回答No.4

お疲れ様です。 すでに出尽くしたとは思いますが、念のため。 home(これがroot「/」だとして)  |  +-img  C.jpg  |  +-main  A.php  |  +-sub    |    +-func  B.php 単純に A.phpから見たときのB.phpは   「../sub/func/B.php」 B.phpから見たときのC.jpg   「../../img/C.jpg」 ですが・・・ 「http://localhost/main/A.php」でブラウズしていれば A.phpの位置が基点となります。 ここでA.phpで 「require_once '../sub/func/B.php';」 と取り込んでいるので、C.jpgはA.phpから見た 「../img/C.jpg」 で良いかと思います。 相対の場合はブラウズの基点が何処かを意識して記述してください。 ただ、B.phpを色々な階層に有るphpから取り込むのであれば・・・ 例として、mainの下にmain2が有ってD.phpが有り  +-main  A.php    |    +-main2  D.php D.phpからもB.phpを取り込んでいるとD.phpから見たC.jpgは 「../../img/C.jpg」 と為るのでB.phpひとつでは相対パスでは対応できません。 DocumentRootからの絶対パスで記述したほうが間違いが有りません。 「/img/C.jpg」

march4
質問者

お礼

分かりやすい回答をありがとうございます。 お陰様で、大変よく分かりました。(^_^)

その他の回答 (4)

  • kinta03
  • ベストアンサー率41% (7/17)
回答No.5

お疲れ様です。 先ほどの回答の補足です。 <?php echo 'Real Path = '.str_replace('\\','/',realpath('./')).'/<br>'; ?> 上記phpをhomeに置いて実行すると 自分のレンタルサーバーでは 「/virtual/***.***.212.34/home/」 となります。 XPのApache2では 「H:/Ap2_root/home/」 となります。 何が言いたいかは、お察しが付くと思いますが HTMLでは「/」とすると「home」の事ですが phpから「/」としたときとでは意味が違いますので これに気を付けて下さい。

march4
質問者

お礼

補足までして頂き、ありがとうございます。 >HTMLでは「/」とすると「home」の事ですが >phpから「/」としたときとでは意味が違いますので ここ、重要ですね! 混同しないよう、気をつけたいと思います。 ありがとうございました。(^_^)

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

横から一点だけ・・ >そのため、C画像への相対パスは、 >B.phpからの相対パスで書けば良いと思っていたのです。 (略) >※今もまだ、半信半疑。笑) ブラウザは(A.phpやD.phpがincludeした)B.phpがどこにあるかなんて知りません。ましてフルパス(サーバパス)も知りません。極端な話B.phpをブラウザからアクセスできない場所に置くこともあるわけです(サーバにインストール済みのPEARライブラリなどは当然そうなりますよね)。 ブラウザは自分(ブラウザ)自身アクセスしたURLと返ってきたhtmlソースがすべてです。相対パス(DocumentRootからのパスも含む)はブラウザがアクセスしたURLから計算できなくてはいけません。 #これが理解できていないで先に進むことは厳禁です。

march4
質問者

お礼

回答をありがとうございます。 >相対パス(DocumentRootからのパスも含む)はブラウザがアクセスしたURLから計算できなくてはいけません。 こちらのアドバイスを聞くことが出来て、とても安心しました。 また、自分で実際に、A.phpとかB.phpを作り、検証もしましたので、 もう、これで大丈夫です! ありがとうございます! ということで、階層の異なる複数のファイルからincludeされるファイルの中でのパス表記では、 特に「パスは絶対パスを使うべき」だということを今回学びました。 # 「../img/C.jpg」の階層がどうたら の件は、もう少し待ってみたいと思います。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>../img/C.jpg >になりますでしょうか? > >それとも、 >aunuzさんの書かれた、"img/C.jpg" こちらでしょうか? えっと・・。どちらも「同じもの」ですよね。"../"は結局自分の位置ですから。ブラウザが「同じURL」にアクセスするのだからどちらでもいいです。ブラウザは最終的にURLにしてからアクセスしますから何の違いもありません。何故そういう枝葉末節にこだわるのかわかりません。 >階層が全く異なる2つのファイル、 >A.php、D.php それぞれから呼ばれるB.phpの中では、 >C画像の位置を、相対パスでは指定してはいけない!! >ということになりますでしょうか? DocumentRootから指定するか、$path . "/img/C.jpg"にようにしておいて$pathを呼び出し側でセットしてから呼ぶことになりますね。どちらでもお好みで。ただし後者の方法で$pathのセット忘れをするくらいならDocumentRootから指定すべきです。 というか「違う階層から同じ画像を指定する」という時点で、普通にhtmlを書く場合でもDocumentRootから書きませんかね。いちいちpathを書きかえるのも面倒でしょ?

march4
質問者

お礼

回答をありがとうございます。 >何故そういう枝葉末節にこだわるのかわかりません。 え。 「../img/C.jpg」 と 「img/C.jpg」は同じものなんですか? 私の考え方では、両者は全くの別物でした。。。 (両者を同じモノだと分かっていながら、 ウダウダ細かいことを言っている余裕は今のところ、私にはないので、 私がウダウダ言っている場合には、 「おそらく、この質問者は両者を違うモノだと思って質問をしているのだろう」くらいに、 思って頂けると非常に助かります。) さて、話を戻しまして、 「../img/C.jpg」 と 「img/C.jpg」は同じものなのか、について。 http://www.shoshinsha.com/hp/1hour/know/pass.html こちらのサイトによると、 ・同じ階層にあるものは、そのままファイル名か「./ファイル名」 ・下の階層にあるものは、「./フォルダ名/ファイル名」 ・上の階層にあるものは、「../ファイル名」 とあります。 つまり、このサイトの説明では、 「../img/C.jpg」という相対パスは、 基準のファイルから見て、一つ上の階層にある「imgディレクトリ」の中の、 C.jpgを意味し、 一方、「img/C.jpg」だと、 基準のファイルから見て、同じ階層にある「imgディレクトリ」の中の、 C.jpgを意味することになるかと思います。 >えっと・・。どちらも「同じもの」ですよね。 これは、どういった考え方をすると、 「同じもの」になるのでしょうか。 どうか教えて下さい。 「../img/C.jpg」と書いても、また、「img/C.jpg」と書いても、 同じ動作になるということでしょうか? >というか「違う階層から同じ画像を指定する」という時点で、普通にhtmlを書く場合でもDocumentRootから書きませんかね。 質問時に書きましたが、 B.phpの中で以下のように書くと、 echo dirname(__FILE__) ;  //★どう表示されるかテスト★ ~/sub/func   //←のように表示される。 こうなるわけです。 そのため、C画像への相対パスは、 B.phpからの相対パスで書けば良いと思っていたのです。 (呼び出し元が、A.phpだろうと、D.phpだろうと、 B.phpからの相対パスで、C画像は正しくパス指定されると、 私は当初考えていた。※今もまだ、半信半疑。笑) でも、DocumentRootから引っ張ってきた方が、 無難そうだということが今回分かりましたので、 今後は、そちらで対応していこうかなと思います。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>C画像の相対パスは、どう書いたらよろしいのでしょうか? A.phpからのpathで書くことになります。つまり"img/C.jpg"でいいてす。 画像ファイルを取得するためにサーバにアクセスするのは「ブラウザ」です。そしてブラウザはA.phpの位置しか知りません。サーバ内部でのincludeなんて知りえないし、サーバパスもわかりません。 普通は(面倒なので)DocumentRootからのpathで(つまり"/img/C.jpg")書きますけどね。

march4
質問者

お礼

回答をありがとうございます。 >A.phpからのpathで書くことになります。つまり"img/C.jpg"でいいてす。 A.phpから見た場合の相対パスですと、 ../img/C.jpg になりますでしょうか? それとも、 aunuzさんの書かれた、"img/C.jpg" こちらでしょうか? さて、補足ですが、 もし仮に、B.phpがあるディレクトリに D.phpというphpスクリプトがあったとして、 そこの記述にも、 require_once '../sub/func/B.php'; こう書かれていましたら、まずいことになりますよね? つまり、 D.phpがB.phpから引っ張ってきました、C画像のパスである、 ../img/C.jpg というパスには、 C画像は存在しないわけですから。。。 (存在しないパスを指してしまっている。) したがって、 階層が全く異なる2つのファイル、 A.php、D.php それぞれから呼ばれるB.phpの中では、 C画像の位置を、相対パスでは指定してはいけない!! ということになりますでしょうか? >普通は(面倒なので)DocumentRootからのpathで(つまり"/img/C.jpg")書きますけどね。 これは、上記の理由からでしょうか? 基本的に、PHPのコーディングにおいて、 相対パスというのは、あまり使うべきではない? 指し示す相手が、同一ディレクトリにあるファイルにのみ、相対パス指定をする、 みたいな考え方をすべきなのでしょうかねぇ。。。 パスの絶対、相対の使い分けについて、 アドバイスをして頂けますと、とても嬉しいです。

関連するQ&A

  • インクルードファイルからの相対パス

    main.php: <?php include('x/sub.php'); ....... ?> x/sub.php: <?php $a=file('data.txt'); ....... ?> において data.txt は main.php と同じディレクトリになければなりません インクルードされたファイルからファイルを呼び出すときに インクルード先からの相対パスでファイルを指定できるようにできないでしょうか? つまり上の場合にはdata.txtがsub.phpと同じディレクトリにあるようにです

    • ベストアンサー
    • PHP
  • PHPの画像表示パス

    お世話になります。 PHPでブラウザに画像を表示するときのパスについて質問させていただきます。 以下のようなコードで、画像のフルパスを使って画像を表示させようとしていますが、画像が表示されません。(添付スクリーンショットの左側)。 このコードの 第1行をコメントアウトして、第2行の相対パスでやると、画像がちゃんと表示されます。(右側) これはどうしてなのでしょうか?詳しい方がいらっしゃいましたら、よろしくご教授ください。 ちなみに、このファイル自体のパスは C:\xampp\htdocs\PHP7-solutions\new-test.php です。 <?php $selectedImage = "C://xampp/htdocs/php7-solutions/images/kinkakuji.jpg"; //$selectedImage = "images/kinkakuji.jpg"; if (file_exists($selectedImage) && is_readable($selectedImage)) { // && is_readable($selectedImage) $imageSize = getimagesize($selectedImage); echo "<pre>"; print_r($imageSize); echo "</pre>"; echo "<img src='".$selectedImage."' alt='kinkakuji temple' ".$imageSize[3].">"; }else { echo "no such file<BR>"; }

    • ベストアンサー
    • PHP
  • php インクルードincludeした時のパス

    phpにてincludeした時のパスで躓いています。 現在のツリーは以下の様になっています。 index.html common  ├header.html  ├footer.html  ├right.html  ├img   ├navi-home.jpg   ├navi-1.jpg  ├css   ├base.css salon  ├hair    ├kari     ├index.html     ├access     ├ ├index.html     ├menu     ├ ├index.html この中の../hair/kari/index.htmlの中に ../common/header.html及びfooter.htmlを <?php include_once(dirname(__FILE__).'/../../../common/header.html'); ?> にてインルードしています。(書き方あってます?dirname(__FILE__).いります?) つぎに../hair/kari/access/index.htmlの中にもインクルードします。 <?php include_once(dirname(__FILE__).'/../../../../common/header.html'); ?> という風に一つ下の階層なので../を付け足しました。 このようにページ毎にheaderまでの相対パスが違うので、そのページ毎にパスを書き換えていかなければいけないものなのでしょうか? また../始まりではなく/始まりでないと表示されません。 /始まりは絶対パスでしたっけ? この書き方は間違っているのでしょうか? そして最後に、 ../common/header.htmlの中の画像ファイルやリンクは <img src="/common/img/navi-home.jpg"> の様に書かないと、インクルードしたファイル側で表示されません。 これも同じように/始まりのこの書き方でいいのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 相対パスから絶対パスへ返還したい

    file:///C:/My%20Documents/IMG_1273-bbbb.jpg 以上のバナーをつくりました。リンク先はJPG画像でもよいということです。 が、この画像を右クリックしてプロパティを見ると、上記のような相対パスで表示されます。 コレを絶対パスに変換する方法はありませんか? 当方かなり知識不足ですので、できるだけ平易にお願いしたいです。

  • dreamwever相対パスからルートパス

    ../../img/a.jpg と相対パスで書かれているものを、リンク画像含めてすべてサイトルートパス /img/a.jpg に変換したいのですが、dreamweberで可能でしょうか? プラグインや他のツールでも構いません。

  • phpのパス指定

    初めてphpを触っています。 いくつかの処理を外部ファイルにしたいのですが パスの指定が悪いのか、同じ階層に置いたり、いろいろ試してもfatal error ばかりです。 どこが悪いのか、教えていただけないでしょうか? サンプルとして、moto.phpのなかのincludeフォルダー内の外部ファイル:func.phpを実行することとします。 moto.php <?php require "./include/func.php"); $a = 2; $b = 1; $c = $a - $b * $a; echo return_word($a); echo "<br>"; //改行 echo return_word($b); echo "<br>"; //改行 echo return_word($c); ?> func.php <? php function return_word ( $data ){ if ( $a==1){ return "a"; }else if ($a==2){ return "b"; }else{ return "c"; } } ?> コマンドラインから php moto.php を実行すると <? php function return_word ( $data ){ if ( $a==1){ return "a"; }else if ($a==2){ return "b"; }else{ return "c"; } } ?> Fatal error: Call to undefined function return_word() in C:\xxxxxx\php\moto.php on line 9 となってしまいます。 外部ファイルは見えているようなのに、どうして関数がundefined になってしまうのでしょうか? phpの基本的なことなのかもしれませんが よろしくアドバイスお願いできればと思います。

    • ベストアンサー
    • 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のinclude_pathのエラーについて

    phpで以下のエラーが出ております。 いろいろ試しているのですが、解決できません。 各種設定ファイルに設定の誤りがあるのでしたら教えていただきたいと思います。 1)Fatal error: main(): Failed opening required '' (include_path='.;c:\php\includes') in C:\Apache2\htdocs\aaa\ins.php on line 26 2)Fatal error: main(): Failed opening required '' (include_path='.;c:\php4\pear') in C:\Apache2\htdocs\aaa\ins.php on line 26 c:\php4\pearというディレクトリは存在しないがなぜか出る。 3)Fatal error: main(): Failed opening required '' (include_path='.;c:\php\includes\aaa') in C:\Apache2\htdocs\aaa\ins.php on line 26 4)Fatal error: main(): Failed opening required '' (include_path='.;C:\Apache2\htdocs\aaa') in C:\Apache2\htdocs\aaa\ins.php on line 26 ##ins.phpのソース: $tpl = "ccc.tpl"; require_once($tpl); ##ディレクトリ構成 C:\Apache2\htdocs\aaa ins.php ccc.tpl ##php.iniの設定: ---有効にした場合1)のメッセージ include_path = ".;c:\php\includes"  ---コメントアウトした場合2)のメッセージ ;include_path = ".;c:\php\includes"  ---以下のpathにフォルダを作成してccc.tplを配置した場合3)のメッセージ include_path = ".;c:\php\includes\aaa" ---以下のpathを指定した場合4)のメッセージ include_path = ".;C:\Apache2\htdocs\aaa" ##httpd.confの設定: line 231 DocumentRoot "C:/Apache2/htdocs" line 256 <Directory "C:/Apache2/htdocs"> AllowOverride Options AuthConfig ##環境 os:winXP apache2:apache_2.0.58 php:PHP Version 4.4.1

    • ベストアンサー
    • PHP
  • include時の頭の良いパス指定について

    include時の頭の良いパス指定について 長い上に少々わかりにくい話ですが、includeする場合のパスについてです。 現在の構成は次のとおりです。 / ├inc/ │ ├file_a.class.php │ ├file_b.class.php │ ├file_c.class.php │ │ │ └require/ │   └require.php ├dir/ │└index.php │ └index.php 【/index.phpの中身】 <?php  require_once "./inc/require/require.php";  //その後いろいろ処理 ?> 【/inc/require/require.phpの中身】 <?php  require_once "./inc/file_a.class.php";  require_once "./inc/file_b.class.php";  require_once "./inc/file_c.class.php"; ?> 今回後付で、「/dir/index.php」を設置しました。 「/index.php」とほぼ処理は共通なので、「/dir/index.php」を次のように書いています。 【/index.phpの中身】 <?php  require_once "../index.php"; ?> しかし、この場合「/dir」以下からは、incまでの階層が異なるため、includeしても、 各クラスのファイルを読み込むことができず、 No such file or directory in require.php on line 2 のエラーが表示されてしまいます。 こういう場合、どういうパス指定をするのがいいのでしょうか。

    • ベストアンサー
    • PHP
  • ファイルのパスを参照してセルに画像を表示できますか?

    質問をお願い致します. 以下のような感じで,B列のセルに画像ファイルのパス名を入力しています.このとき,左側のA列のセルに,その画像を表示したいのですが,このようなことは可能でしょうか?     A        B 1 (右の画像) c:\img\pic001.jpg 2 (右の画像) c:\img\pic002.jpg 3 (右の画像) c:\img\pic003.jpg 宜しくお願い致します.

専門家に質問してみよう