2012-08-08 104 views
1
<?php 

$top = "../top.txt"; 
$middle = "../middle.txt"; 
$bottom = "../bottom.txt"; 
$end = "/st.txt"; 
$data = "/dt.txt"; 

$handle1 = fopen($top, "r"); 
$contents1 = fread($handle1, filesize($top)); 
fclose($handle1); 

$handle2 = fopen($end, "r"); 
$contents2 = fread($handle2, filesize($end)); 
fclose($handle2); 

$handle3 = fopen($middle, "r"); 
$contents3 = fread($handle3, filesize($middle)); 
fclose($handle3); 

$handle4 = fopen($data, "r"); 
$contents4 = fread($handle4, filesize($data)); 
fclose($handle4); 

$handle5 = fopen($bottom, "r"); 
$contents5 = fread($handle5, filesize($bottom)); 
fclose($handle5); 

echo $contents1; 
echo $contents2; 
echo $contents3; 
echo $contents4; 
echo $contents5; 

?> 

我得到這些錯誤爲他們每個人:閱讀與PHP文件 - 的fopen/FREAD

警告:的fopen(../ top.txt)[function.fopen]:未能打開流:沒有這樣的文件或目錄

警告:文件大小()[function.filesize]:STAT失敗../top.txt

警告:的fread():提供的參數是不是一個有效流資源

警告:FCLOSE():提供的參數是不是一個有效的流資源

文件模式中的所有文件和文件夾,並設置爲777

存在於服務器上的所有文件

PHP5安裝在服務器上

我在做什麼錯?

+0

['file_get_contents()'](http://php.net/file_get_contents)可能是你感興趣的。 – mario 2012-08-08 22:08:05

+0

檢查[include_path](http://us2.php.net/manual/en/function.get-include-path.php)和[open_basedir](http://www.php.net/manual/en/ini .core.php#ini.open-BASEDIR) – ghbarratt 2012-08-08 22:08:52

回答

1
$top = "../top.txt"; 

意味着從您的當前位置是移動一個文件夾時,並搜索文件top.txt。這與$middle = "../middle.txt";$bottom = "../bottom.txt";相同。對於這兩個:

$end = "/st.txt"; 
$data = "/dt.txt" 

它從根目錄搜索。確保你的文件位於你引用它們的地方。我可能會認爲你在最後兩個變量希望這個:

$end = "./st.txt"; 
$data = "./dt.txt" 

其中./代表當前目錄。

因此,給你更詳細的例子。比方說,你有你的PHP文件位於/var/www/httpdocs/project/phpFile.php那麼你的文件會像被鏈接:

$top = "/var/www/httpdocs/top.txt"; 
$middle = "/var/www/httpdocs/middle.txt"; 
$bottom = "/var/www/httpdocs/bottom.txt"; 

$end = "/st.txt"; 
$data = "/dt.txt" 

所以現在注意到,在過去的兩個變量的區別 - 它們保持不變,因爲你已經將它設置爲尋找從根目錄(/)。在哪裏,如果你會使用聯用./,那麼路徑將是:

$end = "/var/www/httpdocs/project/st.txt"; 
$data = "/var/www/httpdocs/project/dt.txt" 

希望這可以解釋它。是的,看看答案中提到的其他人的職能。

2

使用全路徑,而不是 ../top.txt 使用 /path/to/top.txt

OR

你一個也使用 $top = $_SERVER['DOCUMENT_ROOT'] . "/../top.txt";

0

PHP manual

如果PHP認爲filename指定一個本地文件,那麼它會 試圖打開該文件的流。該文件必須可供PHP, 訪問,因此您需要確保文件訪問權限允許訪問此 。如果您啓用了安全模式,或者open_basedir進一步 限制可能適用。

我建議你檢查open_basedirinclude path

下面是一些代碼來幫助你做到這一點:

echo 'open_basedir: '.ini_get('open_basedir')."\n"; 
echo 'Include path: '.get_include_path()."\n"; 
echo 'Current path: '.__DIR__."\n"; 

有了,你應該能夠確認您是能夠達到的範圍內或下的open_basedir的目錄的文件。如果open_basedir是「空白」,那麼PHP不應該強制執行任何限制。

如果你真正需要的是怎樣的文件路徑通常是由PHP處理(如一些其他的答案似乎表明),那麼read this(也由手動)的解釋:

文件包括基於給定的文件路徑,或者如果沒有給出,則指定include_path。如果文件在 include_path中找不到,include將最終在失敗之前檢入調用腳本自己的 目錄和當前工作目錄。包含構造的 如果找不到文件將發出警告;這個 與require的行爲不同,它會發出致命錯誤。

如果路徑定義 - 無論是絕對的(從驅動器盤符 或\ Windows上,或/在Unix/Linux系統),或相對於 當前目錄(開始或...) - include_path中將完全忽略 。例如,如果文件名以../開頭,則解析器將在父目錄中查找以查找所請求的文件。

我假設你沒有使用安全模式,因爲它是now deprecated