Функция Php fread() ничего не возвращает


У меня есть простая функция AJAX, вызываемая, когда пользователь нажимает кнопку, которая отправляет текст текстовой области HTML и предупреждает об ответе от серверной части:

send_button.onclick = function ()
{
    var ajax = new XMLHttpRequest();
    var text = text_input.value;
    ajax.onreadystatechange = function ()
    {
        if (ajax.readyState == 4 && ajax.status == 200) alert(ajax.responseText);
    };
    ajax.open("POST", "write.php", true);
    ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    ajax.send("text=" + text);
};

, А также PHP-скрипт на бэкэнде, который должен записывать полученный текст в файл и воспроизводить содержимое файла:

<?php

    $filename = "preview/preview.html";
    $text = (isset($_POST["text"]) ? $_POST["text"] : "");

    try
    {
        $fh = fopen($filename, "w+");
        if (!$fh) throw new Exception("File open error");

        fwrite($fh, $text);

        $filetext = (filesize($filename) > 0 ? fread($fh, filesize($filename)) : "");
        echo $filetext;

        fclose($fh);
    }
   catch (Exception $e)
   {
        header("Location: error.php");
   }

?>

Но каждый раз ответ оказывается пустым. Я попытался повторить жестко закодированную строку вместо fread(), и это сработало, я также попытался повторить filesize($filename), что также отлично сработало.
Данные POST, отправленные функцией AJAX, также проходят, и функция fwrite($fh, $text) делает именно то, что должна.
Что я делаю не так?

Author: Parzival, 2014-12-16

3 answers

Вы не перемотали файл назад:

  1. вы открываете свой файл для записи
  2. вы выписываете какой-то текстовый файл, указатель находится в КОНЦЕ файла
  3. вы пытаетесь прочитать некоторый текст из файла, но указатель находится в КОНЦЕ файла
  4. данные не считываются, поэтому вы выводите пустую строку

Почему бы не использовать что-то более похожее на это:

file_put_contents('preview/preview.html', $_POST['text'], FILE_APPEND);
readfile('preview/preview.html');

"Файл не может быть прочитан" - это все прекрасно и здорово, но все операции открытия/записи/чтения избыточны и могут быть сведено к приведенным выше двум строкам кода.

 1
Author: Marc B, 2014-12-16 18:11:30

Вместо этого вы могли бы использовать $filetext = file_get_contents($filename);. Я думаю, что вы переместили указатель файла в конец после записи в него, поэтому вы видите только символ конца файла.

 0
Author: Telz, 2014-12-16 18:15:48

Вы можете использовать file_get_contents($имя_файла)

 0
Author: Ajit Kumar, 2014-12-16 18:16:06