2012-06-05 86 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 。

相关问题