Я использую wamp-сервер. Я пытаюсь записать в файл, но он дает такую ошибку: «Warning: fwrite () ожидает, что параметр 1 будет ресурсом, boolean given». Как я могу это решить?
$file = 'file.txt'; if (($fd = fopen($file, "a") !== false)) { fwrite($fd, 'message to be written' . "\n"); fclose($fd); }
Перемещение скобок:
if (($fd = fopen($file, "a")) !== false) { fwrite($fd, 'message to be written' . "\n"); fclose($fd); }
Ваш код присвоил результат (fopen($file, "a") !== false)
(т.е. логическое значение) до $fd
.
Делайте одно за раз, потому что нет спешки и достаточно места:
$file = 'file.txt'; $fd = fopen($file, "a"); if ($fd) { fwrite($fd, 'message to be written' . "\n"); fclose($fd); }
Особенно упростите код, если вы столкнетесь с сообщением об ошибке.
Также знайте свой язык: ресурс в PHP всегда оценивает true.
И знай свой мозг: двойное отрицание сложно, всегда.
Проблема в вашем состоянии if
. Сравнение PHP связывается более тесно, чем присваивание, поэтому fopen !== false
сначала оценивает значение true
, а затем true
записывается в $fd
. Вы можете использовать скобки для группировки $fd = fopen($file, 'a')
вместе, или вы можете вывести эту часть из условия и записать if ($fd !== false)
вместо вашего условия.
Поместите ваш !== false
за пределами ")"
Как это:
$file = 'file.txt'; if (($fd = fopen($file, "a")) !== false) { fwrite($fd, 'message to be written' . "\n"); fclose($fd); }
приоритет оператора вызывает вашу проблему. !==
связывается более плотно, чем =
, поэтому ваш код на самом деле:
if ($fd = (fopen(...) !== false)) { ^--------------------^--
и вы назначаете логический результат сравнения !==
с $ fd.
Либо измените брекетинг, либо переключитесь на оператор or
, который имеет более низкий приоритет привязки:
if (($fd = fopen(...)) !== false) { ^----------------^
или
$fd = fopen(...) or die('unable to open file');