• ベストアンサー

相対パスの挙動を理解できない

PHP5+Apatch2でプログラムを作成しています。 Apatch,PHP共に初心者です。 ----------------------------------------------------- index.php[1] | PHPフォルダ[1]- CLASSフォルダ[2a]- class.php[3a] |              | |              phpfile.php[2a] | LIBフォルダ[1]- lib.php[2b] ------------------------------------------- *[]内は同じ番号のものが同じ階層を表すとします。 *apatchのドキュメントルートは[1]の一つ上になっています。 とプログラムを作成して、class.php[3a]の中で require_once("../phpfile.php[2a]");を 行った場合、 No such file or directoryのエラーが発生します。 かわりにrequire_once("../PHP/phpfile.php[2a]");と 置き換えた場合は動作します。 相対パス"../"は一つ上の階層に上がると理解していたのですが、 二つ上にある階層へと移動しているように思います。 気になったので、lib.php[2b]から<a href="../index.php[1]">aaa</a> を表示させてみたところ、上手くindex.php[1]へリンクを貼れます。 apatchの設定、PHP5がおかしい、HTMLがおかしい、誤解している等、 初心者なりに予測されるものが多いので手が付かなくなっています。 原因と思われるものがあればどうかご指摘ください。 よろしくお願いします。

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

  • ベストアンサー
回答No.2

まずは カレントディレクトリを調べては? <?php //カレントディレクトリの絶対パスを表示 print getcwd(); ?> 試しに 手元の Apache/2.2.3 (Unix) DAV/2 PHP/4.4.7 mod_ssl/2.2.3 OpenSSL/0.9.7l で require_once("../ひとつ上の階層にあるphpファイル"); して問題なく動作しました。 #1さんも匂わせてますけど 例えば、質問者さんの構成でPHPフォルダにあるphpファイルから class.php[3a]をrequireして そのclass.php[3a]のなかでrequireする場合は カレントディレクトリは PHP/CLASS/ではなく PHP/のままの筈です http://code.nanigac.com/source/view/303

make_midi
質問者

お礼

ありがとうございます。 umasikajiroさんのご丁寧な解説で解決しました。 以前にも同じことで躓いて、その時は解決したのですが、 なぜか今回は混乱したままでした。 getcwd();はこういった相対パスを考える場合に使いやすい関数ですね。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

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

実際にブラウザから呼び出しているスクリプトの位置は?class.php自体をブラウザからアクセスしているんでしょうか?

make_midi
質問者

お礼

申し訳ありません。 設計図等なしで闇雲に制作していたため混乱していました。 require先にあるファイルからではなく、 ブラウザがアクセスしているページからの階層を指定しなければ ならなかったのですね。 同じことで以前にも躓いて、 その時は解決したはずなのにまた躓いていました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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
  • requireやinclude時の階層の書き方

    ずっと困ってます。よろしくお願いします。 読み込む大元のファイル名がindexだとして、その中にrequireを書くとします。 そこからrequireするファイルはindexと同階層にあるaフォルダにあるreq1.phpとします。 さらにreq1.phpからrequireするファイルがあり、同階層(aフォルダ内)にあるreq2.phpとします。 req2.phpはなぜかindexと同階層と、aフォルダ内の、計2カ所に同名の同じファイルがあるとします。 コードを書くと、 index内でrequire_once('a/req1.php'); req1.php内でrequire_once(dirname(__FILE__).'/req2.php'); としています。 この場合、読み込まれるreq2は、req1と同階層にあるものではなく、indexと同階層のものが読み込まれてしまいます。また、indexと同階層のreq2を消しておけば、req1と同階層に置いてあるreq2が読み込まれます。 この辺の挙動が、なぜこうなるのかを説明してください。 特に、 1.dirnameとの関係について 2.別階層に同名ファイルが複数存在の有無に関係なく、とにかくrequireする階層を確実に1つだけに限定する方法について(dirnameではうまくいかないような気がします) の2点は詳しく知りたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP/icludeを使った相対パスの引き方について

    プログラム初心者です。 includeやrequireなどの関数を使ってファイルを呼び込むために、下記のようなソースを作りましたが、Fatalエラーになってしまいます。どこがいけないのかご指摘をいただけないでしょうか? ネットでこれらの関数の扱い方について検索しますと、PHPでは実行されたファイルのディレクトリがルートとして扱われるそうで、他のディレクトリを参照する時は、相対パスのみでは無理の様子でした。この場合、組込み定数となる__FILE__を使って絶対パスを導かなければいけないような記述がありました。これに習って書いてみたのですが、どうもうまくいきませんのでご指導をいただければと思います。 ■以下、ツリー構造 root |_con ←フォルダ階層 | |_nav.php ←ファイル階層 |_mod | |_nav.csv |_view |_index.php ■以下、phpファイル群 /////// nav.php ////////// <?php $Data=file (dirname(__FILE__)."/../mod/nav.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$DataN[$i]); ?> /////// index.php //////// <?php include once (dirname(__FILE__). "/../con/nav.php"); ?>

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

    いつもお世話になっております。 超初級な質問で申し訳ないのですが困ってます。 下記のような4つのclassがあります。 A_Class------------ <?php require_once('Base_Class'); class A_Class extends Base_Class{} Base_Class------------------ <?php require_once('B_Class'); abstract class Base_Class { public function hoge (){ $b = new B_Class(); $b->hoge(); } } B_Class--------------------- <?php require_once('C_Class'); class B_Class{ public function hoge (){ $c = new C_Class(); } } C_Class--------------------- <?php require_once('Base_Class'); class C_Class extends Base_Class{} ほかのファイルからrequire_once('A_Class');をすると PHP Fatal error: Class 'Base_Class' not found in C_Class.class.php on line 2 となります。 Base_Classのrequire_once('B_Class');をクラス定義の下に書けば通るのですが、 できればrequire_onceは上部にそろえておきたいです。 require_onceを下に書かずに修正する方法がありましたらご教授お願いします。

    • 締切済み
    • PHP
  • CSSで相対パス

    さっきニコニコ動画のスタイルシート見たんですけど、 こういう記述があって body.tpl { width:960px; background:#FFF url('/img/tpl/bg_rc2.gif') repeat-x; color:#333; margin:0px auto; padding:0px; } このスタイルシートはcssというフォルダの中にあって、 そこと同じ階層にimgというフォルダがあって、 あとは直接index.phpとかのメインのファイルが置いてあるみたいなんですけど、 普通外部スタイルシートから別のフォルダ(同じ階層にある別のフォルダ)にあるイメージを呼び出すなら ../img/tpl/bg_rc2.gif になるはずだと思うんですけど、上の記述だとまるでCSSの相対パスのベースが上位の階層(index.phpとかのメインのファイルがあるの階層)になってるみたいにに見えるんですよね、 もしこれが出来るなら、大量にネストして外部スタイルシート作ってある場合(imgフォルダから遠い階層)、 ../../../../../../img/a.gif って呼び出さないといけないのが楽にすむじゃないですか、 もし外部スタイルシートの相対パスのベースをこういう風に設定できる方法があるならおしえて下さい、 俺の勘違いだったらごめんなさい

    • ベストアンサー
    • HTML
  • 相対パス

    絶対パス、相対パスのうち 相対パスの意味がいまいちよくわかりません!! なんとなく分かるのですが、上のフォルダーの../など HPを作っていて、編集画面で一つ上の・・がどこかわかりません。 index.htmlですが、基本的に一つなので、上の階層は どこでしょう?

  • smartyの設定 include?path以下の設定がわからない

    独学でPHPを学んでいます。 PHPの基本はひととおり理解はできました。 開発環境・最新のXAMPP導入。 windows、OSはVISTA smartyをインストールしましたが、その設定につまずいています。 Smarty.class.phpが存在するパス(D:\xampp\libs)をphp.iniファイル447行目を下記のように設定しましたが、うまくいきません include_path=D:\xampp\libs\ xamppフォルダの下にlibsフォルダを入れたので上のパス指定で問題ないと思うのですが、どこが間違っているのでしょうか。 ちなみに、libs以下の\も不要だろうと思い、消したりして試してみましたが、結果は同じ。下記のように表示がなされます。 Warning: require_once(local/xampp/libs/Smarty.class.php) [function.require-once]: failed to open stream: No such file or directory in D:\xampp\htdocs\lesson\smarty1.php on line 3 Fatal error: require_once() [function.require]: Failed opening required 'local/xampp/libs/Smarty.class.php' (include_path='.;D:\xampp\php\pear\') in D:\xampp\htdocs\lesson\smarty1.php on line 3 上の文章ですが、3行目後半”Smarty.class.php' (include_path='.;D:\xampp\php\pear\')”の部分ですが、php.iniからinclude_pathを変更したりしているのですが、一向に表示が変わりません。 もしかしたらphp.iniファイルは二つあったりするのでしょうか。 php.iniのファイルはPHPフォルダに入っているものでよろしいですよね? もちろんアパッチは再起動させています。 なのにできません・ あと、ロジックファイルの require _once()の()内はSmarty.class.phpだけでもよろしいのでしょうか。 もう悩みすぎて頭がおかしくなりそうですね。 ちなみにsmartyがなくても、アプリケーション開発に支障はありませんでしょうか。 あくまで個人で趣味の範囲でアプリケーションを作成したいと感じています。

    • ベストアンサー
    • PHP
  • PEARライブラリで携帯サイト開発

    はじめまして PHP初心者でjavaを多少かじった程度のものです 現在、携帯サイトを作成しております 質問点はPEAR::Net_UserAgent_Mobileに関してです このライブラリ内のMobile.phpをrequireしたいのですが、なんど試してもうまくいきません。 コマンドからインストールして利用した場合はうまく動くのですが 直接、ライブラリをダウンロードして作業フォルダに格納して使おうと思うと 真っ白画面が。。。 記述 コマンドインストール実行の場合   require_once('Net/UserAgent/Mobile.php'); 手動で設置した場合   require_once(dirname(__FILE__).'/../lib/Net/UserAgent/Mobile.php')); です。 フォルダ構成は, htdocs┐      ─scriptフォルダ─hoge.php(ここでrequireを記述しています)      ─libフォルダ┐              Netフォルダ┐                     UserAgentフォルダ─Mobile.php となっています 何が対応方法はもちろん、参考URL、気になったところなんでも結構です。 OS  UNIX 言語 PHP,HTML よろしくお願いします                                 

    • 締切済み
    • PHP
  • さくらのレンタルサーバーでDB.php読み込み失敗

    下記の環境でPHPを書いています。 ・さくらのレンタルサーバ スタンダード ・PHP 5.2.13 ・php.iniファイルパス /home/******/www/php.ini その中で、require_once("DB.php");と記述をしているのですが、 その部分で下記のエラーが発生します。 Warning: require_once(DB.php) [function.require-once]: failed to open stream: No such file or directory in /home/xxx/www/class/db.class on line 6 Fatal error: require_once() [function.require]: Failed opening required 'DB.php' (include_path='.:/usr/local/php/5.2.13/lib/php') in /home/xxx/www/class/db.class on line 6 2ヶ月ほど前に作成した時は間違いなく正常に動作していたのですが・・・。 久しぶりにアクセスしたらこんなエラーが出ていて途方にくれています。 推測できる原因はありますでしょうか?

    • ベストアンサー
    • PHP
  • 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/~ のように書かれています。(デフォルトのままです。)

    • ベストアンサー
    • PHP