Я использую 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');