2012-06-05 134 views
2

這讓我有點生氣,想到也許它可能是一個服務器配置問題,但我已經嘗試過在不同的主機上並得到同樣的問題。fread():提供的參數不是一個有效的流資源

我已經把範圍縮小,並創建了一個測試腳本,以排除一切了

<?php 
$myFile = "test.txt"; 
$fh = fopen($myFile, 'r') || die("Couln't open file"); 
if ($fh == true) { 
     echo "file handle valid<br>"; 
} 
else { 
     echo "file handle invalid<br>"; 
} 
$theData = fread($fh, filesize($myFile)) || die("Couldn't read file"); 
echo $theData; 
fclose($fh)|| die("Couldn't close file"); 
?> 

當test.txt的丟失我正確地得到模具無法打開文件 當test.txt的是那裏我得到

警告:FREAD():提供的參數不是在

一個有效的流資源我已經設置的test.txt到777,以確保

我也寫只是爲了仔細檢查,工作正常

<?php 
$data = file_get_contents('test.txt'); 
echo $data; 
?> 

希望有人能提供一些線索這對我來說。

回答

1
$fh = fopen($myFile, 'r') || die("Couln't open file"); 

您正在爲$fh分配一個布爾表達式,從而丟失了進程中的實際文件句柄。嘗試將以上行更改爲

($fh = fopen($myFile, 'r')) || die("Couln't open file"); 
1

您在PHP中被operator precedence咬傷。 ||的優先級高於=,所以實際上將邏輯OR的結果分配給$fh。切換到

$fh = fopen($myFile, 'r') or die("Couln't open file"); 
          ^^--- lower precedence logical or 

將修復起來。

隨着or,的fopen()返回值被分配給$fh,則or die()評價 - 如果fopen()函數返回一個文件句柄,或將失敗,代碼proceedes。如果fopen失敗,則返回一個布爾值false,並且死亡將踢入。

使用||,fopen的值與die調用進行邏輯或運算,並將該結果或(false)賦值給$ fh 。

相關問題