iT邦幫忙

0

PHP中的require_include 路徑問題

php
  • 分享至 

  • xImage

雖然問題解決了
但是在很多不理解的地方,懇請指教QQ
這問題竟然解了6小時差點吐血死亡...

問題是使用require 或 include 時有甚麼路近上的差別嗎?

問題描述
網站的前台跟後台的某個功能會固定連到,後台設定的一個資料夾

// 後台資料夾
backside.file  
  |
  |
  setringfunction.file
         |
         --- admin.file
         |       |--- admin.php
         |
         --- sendmail.file
         |       |--- sendmail.php
         |
         --- checkmail.file
                 |--- checkmail.php  //這隻需要(require/include)sendmail.php

// 這兩隻檔案都會需要(require/include) checkmail.php
// 前台
index.php
member.php  

checkmail.php 裡面

// 相對路近
include '../sendmail/sendmail.php';

這聽起來超簡單的!!
路徑一抓就好....
結果我自己被自己的觀念卡死

// 前台easy
// 從這個位置開始往下抓
include '/backside/setringfunction/checkmail/checkmail.php';

結果前台怎麼用怎麼錯
後台卻很正常...

// 後台admin.php
// 相對路徑
include '../checkmail/checkmail.php';

但我的觀念是前台去抓checkmail.php後再從這個檔案位置
去抓上一層的sendmail.file 裡的sendmail.php 檔案
這個觀念是錯的嗎??

同事跟我提這句
'因為對前台而言這不是上一層的檔案'
所以是因為用include 所以位置是以原本檔案為主這樣嗎?
意思是
例如 A.php include B.php include C.php 要從A的路徑去看C.php 而不是從B.php
觀念是這樣嗎?還是又錯了?
那假如是require 也是這樣看路徑嗎?

謝謝各位大神QQ


最後是這樣解決

// 後台資料夾
backside.file  
  |
  |
  setringfunction.file
         |
         --- admin.file
         |       |--- admin.php
         |
         --- sendmail.file
         |       |--- sendmail.php
         |
         --- checkmail.file
                 |--- checkmail.php  //這隻需要(require/include)sendmail.php

// 後來改成這兩隻檔案(require/include) 這一層的checkmail.php
// 前台
index.php
member.php

sendmail.file
    |--- sendmail.php

checkmail.file
    |--- checkmail.php  //這隻需要(require/include) 同一層sendmail.php

checkmail.php 裡面

// 以為是相對路近但卻是從這裡開始往下抓
include '/sendmail/sendmail.php';

因為前台的 checkmail.php 裡面明明相對sendmail.php 因該也是
include '../sendmail/sendmail.php';
但卻只要寫 '/sendmail/sendmail.php'就好所以想是不是
路徑位置是以要原本檔案為主

qpalzm iT邦新手 1 級 ‧ 2020-09-07 17:59:12 檢舉
之前也跟大大有相同問題,但後來查過後其實他們找路徑的方式是一樣的,差別只在於成是執行發生錯誤一個對中斷一個不會,至於前台要抓後台ws,應該是前台歸前台,後臺歸後台,兩個的基準點不同喔~~所以後臺的位置抓的include 路徑應該不太一樣~小小經驗分享~如果有錯再多多指教
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-09-07 19:28:00
最佳解答

相對路徑的問題。
require 跟 include 的對應路徑解釋都是大同小異。
比較擔心的是 include 又 include的問題。

畢竟當第一個 include 時的目錄是在不同的地方呼叫。
則當include的檔案又有一個include。
就有機會發生路徑的問題。

依以下範例為例

A.php
test/B.php
ccc/ccc.php
ccc/ddd/ddd.php

A.php

<?php
include 'ccc/ccc.php';
?>

test/B.php

<?php
include '../ccc/ccc.php';
?>

ccc.php

<?php
include 'ddd/ddd.php';
?>

A跟b include 這個ccc相對路徑,本身並沒有問題。
可是ccc中又include一個ddd。這時這邊的解釋路徑就會不一樣了

a的話沒問題。因為a本身是在根目錄下。所以當載入ccc的同時。其所屬路徑就會是
ccc/ddd/ddd.php

但b的話,雖然在載入ccc沒問題。
可是當載入ddd是用
test/ddd/ddd.php 這個路徑讀取。當然會出錯。

一般正統的作用是會宣告一個根路錄的實體位置。
或是將ccc.php中的共用include。改成如下

<?php
include dirname(__FILE__).'ddd/ddd.php';
?>

這樣子就可以確保是用ccc.php的路徑來去讀取ddd.php。

看更多先前的回應...收起先前的回應...

那個我照著大大的講解的在做一次
可是一開始是有錯誤的...但是又突然沒有錯誤了QQ
開始不是很懂出錯的點了

載入B.php時會正常...
本來會報錯的,但現在不會,可是我看不出來哪裡有差...
也使用清除快取再重新載入了
apache也重新開關跟重新啟動了
依舊不能成功出錯QQ (會正常顯示OK)
求大神賜教

A.php
B.file
  |---- B.php
  
C.file
  |--- ccc.php
  |--- ddd.file
         |--- ddd.php //echo 'OK';

https://ithelp.ithome.com.tw/upload/images/20200907/20120558tahZWqUtyn.png

// A.php
include 'C/ccc.php';

// B/B.php
include '../C/ccc.php';

// C/ccc.php
include 'ddd/ddd.php';

不好意思請問一下
但b載入ccc是可以的

正常載入ddd是不可行的(雖然我試時可以??)
但不是很懂 test/ddd/ddd.php 這個路徑開頭test怎麼來的
因為想說先引用ccc.php 一開始是'../' 上一層
請教大神,感激不盡

我上面的範例,b是放在 /test 內的。

簡單來說,如果相對路徑的情況。基本都是依第一個運行的php路徑為主。
所以我的a.php的路徑是在 /
但我的b.php路徑則是在 /test

當開始 include 就會開始發生路徑問題。
畢竟起始路徑不同。

你好!
不好意思再請問一下
B.php include C.php
運行第一個php檔案是B
所以是路徑會是 /test/ddd/ddd.php 後面是ccc.php檔案
然後因為test檔案裡沒有ddd資料夾所以會出錯

但我目前路徑位置也是 /test/ddd/ddd.php
卻可以成功include?

A.php是在根(/)目錄下面
而B.php是在跟目錄下的/test檔案裡
是這樣嗎?
謝謝大大

我要發表回答

立即登入回答