PHP - не удалось написать

Я застрял и нуждаюсь в руке. Надеюсь, кто-нибудь может помочь?

У кого-нибудь есть идеи, почему я получаю "сбой записи" в этом коде?

$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);

Заранее спасибо.

2 ответа

Решение

Используя оператор OR при создании дескриптора файла, вы возвращаете логическое значение в зависимости от операции. Таким образом, $write_handle будет содержать истину или ложь, а не ресурс файла. Лучший способ открыть файл для записи и проверить его успешность:

$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 флаг, он будет очищать файл для каждой записи.

Я видел его везде, но проблема в том, что || die("Не могу открыть users_v2!");

Сначала я добавил:

error_reporting(E_ALL);

чтобы увидеть, что php сообщает об ошибках.

$write_handle = fopen($write_file, "w") || die("Couln't open users_v2!");
fclose($write_handle);

Возвращает недопустимую ошибку дескриптора потока и дескриптор файла 1. Без него возвращается дескриптор файла "Resource id #x".

Изменение строки на:

$write_handle = fopen($write_file, "w"); // || die("Couln't open users_v2!");

и ваш код работает нормально. Собираюсь опубликовать это на php.net сейчас.

Другие вопросы по тегам