2

これは私を少し怒らせています。おそらくサーバー構成の問題である可能性があると思いましたが、別のホストで試したところ、同じ問題が発生しました。

私はそれを絞り込み、すべてを除外するためのテストスクリプトを作成しました

<?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;
?>

うまくいけば、誰かが私のためにこれにいくつかの光を当てることができます。

4

2 に答える 2

2

PHP の演算子の優先順位に悩まされています。||は よりも優先順位が高い=ため、実際には論理 OR の結果を に代入しています$fh。に切り替える

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

問題を修正します。

を使用orすると、 の戻り値fopen()が に代入され$fhor die()が評価されます。 fopen() がファイル ハンドルを返す場合、 または は失敗し、コードが続行されます。fopen が失敗すると、ブール値の false が返され、 or die が開始されます。

では||、fopen の値は die 呼び出しと論理的に ORred され、その結果または (false) が $fh に割り当てられます。

于 2012-06-05T14:16:34.157 に答える
1
$fh = fopen($myFile, 'r') || die("Couln't open file");

ブール式を に代入しているため$fh、その過程で実際のファイル ハンドルが失われます。上記の行を次のように変更してみてください

($fh = fopen($myFile, 'r')) || die("Couln't open file");
于 2012-06-05T14:10:50.680 に答える