Функция 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)
делает именно то, что должна.
Что я делаю не так?
3 answers
Вы не перемотали файл назад:
- вы открываете свой файл для записи
- вы выписываете какой-то текстовый файл, указатель находится в КОНЦЕ файла
- вы пытаетесь прочитать некоторый текст из файла, но указатель находится в КОНЦЕ файла
- данные не считываются, поэтому вы выводите пустую строку
Почему бы не использовать что-то более похожее на это:
file_put_contents('preview/preview.html', $_POST['text'], FILE_APPEND);
readfile('preview/preview.html');
"Файл не может быть прочитан" - это все прекрасно и здорово, но все операции открытия/записи/чтения избыточны и могут быть сведено к приведенным выше двум строкам кода.
Вместо этого вы могли бы использовать $filetext = file_get_contents($filename);
. Я думаю, что вы переместили указатель файла в конец после записи в него, поэтому вы видите только символ конца файла.
Вы можете использовать file_get_contents($имя_файла)