Вопрос
Я застрял и нуждаюсь в помощи.Надеюсь, кто-нибудь сможет помочь?
Кто-нибудь знает, почему в этом коде я получаю сообщение «не удалось записать»?
$write_file = "/usr/home/public_html/php/users_v2.sql";
$write_handle = fopen($write_file, "w") || die("Couln't open users_v2!");
if (is_writeable($write_file)) {
if ($write_handle === FALSE) echo 'Failed handle?!';
if (fwrite($write_handle, "Hi\n") === FALSE) echo "Failed write!\n";
}
fclose($write_handle);
Заранее спасибо.
Решение
Используя оператор OR при создании дескриптора файла, вы возвращаете логическое значение в зависимости от операции.Таким образом, $write_handle будет содержать true или false вместо файлового ресурса.Лучший способ открыть файл для записи и проверить его успешность:
$write_handle = fopen($write_file, 'w');
if ($write_handle === false)
{
die('Could not open file ' . $write_file);
}
Кроме того, вы можете использовать file_put_contents
()
функция, которая обрабатывает fopen(), fwrite() и fclose() за вас.Я рекомендую это только в том случае, если вы выполняете только одну запись в один и тот же файл, так как это потребует больших затрат, и если вы не передадите FILE_APPEND
флаг, он будет очищать файл при каждой записи.
Другие советы
Я видел, как он использовался везде, но проблема в том, что || умереть ("не открывать пользователи_v2!");
Сначала я добавил:
error_reporting(E_ALL);
чтобы увидеть, что php сообщает об ошибках.
$write_handle = fopen($write_file, "w") || die("Couln't open users_v2!");
fclose($write_handle);
Возвращает недопустимую ошибку дескриптора потока и дескриптор файла, равный 1.Без него возвращаемый дескриптор файла будет «Идентификатор ресурса #x».
Изменение строки на:
$write_handle = fopen($write_file, "w"); // || die("Couln't open users_v2!");
и ваш код работает нормально.Сейчас собираюсь опубликовать это на php.net.