Почему file_put_contents не работает в моем онлайн-скрипте php? - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь использовать файл. php для редактирования файла .txt на моем веб-сервере http. Я могу вызвать файл. php и заставить его работать (и выводить что-то случайное обратно) просто отлично, но когда я использую file_put_contents, он не работает. Я попытался установить права доступа к файлам 777, 0775, et c, но ничего не происходит. (хотя из того, что я собрал, кажется, что разрешения только для локальных систем). Я знаю, что здесь уже есть некоторые подобные вопросы, но я не могу понять ответы на любой из них.

test PHP. js (обрезано):

function submitData() {
    var data = prompt('Enter data');
    sendToServer(data, 'test.txt');
}

function sendToServer(data, file) {//file is file to write into, not the php file
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
        }
    }
    xmlhttp.open("GET", "editTXT.php?txtFile=file&data=data");
    xmlhttp.send();
    setTimeout(update, 500);
}

function update() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var response = xhttp.responseText;
        console.log(response);
    }
    };
    xhttp.open("GET", "readTxt.php?file=test.txt", true);
    xhttp.send();
}

setInterval(update, 1000);

editTxt . php:

<?php
$txtFile = $_GET["txtFile"];
$data = $_GET["data"];
file_put_contents($txtFile, $data);
?>

readTxt. php:

<?php
$file = $_GET['file'];
$data = file_get_contents($file);
echo $data;
?>

1 Ответ

0 голосов
/ 21 января 2020

Надеюсь, что следующее может помочь - я думаю, что главная проблема в javascript, как ни странно, но я все равно опубликую здесь изменения, которые я сделал для всех файлов. Кстати, постоянный опрос, подобный этому, с использованием Ajax можно вместо этого сделать более чистым способом, используя соединение EventSource и Server Sent Events.

Если текстовый файл должен быть полностью перезаписан при запуске сценария, тогда это работает нормально (в любом случае в тесте), но если данные предназначены для добавления к существующему контенту, вам нужно добавить FILE_APPEND в качестве окончательного аргумента для file_put_contents

editTxt. php

<?php
    if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['txtFile'], $_GET['data'] ) ){

        $file=__DIR__ . '/' . $_GET['txtFile'];
        $data=$_GET['data'];

        $bytes=file_put_contents( $file, $data );
        if( !$bytes )exit('error');

    }
?>

readTxt. php

<?php
    if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['file'] ) ){
        $file=__DIR__ . '/' . $_GET['file'];
        exit( file_get_contents( $file ) );
    }
?>

И HTML & Javascript

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title></title>
    </head>
    <body>
        <script>
            function submitData() {
                var data = prompt('Enter data');

                if( data ){/* only submit if there is data */
                    sendToServer(data, 'test.txt');
                    setInterval(update, 1000);
                    return true;
                }
            }

            function sendToServer(data, file) {//file is file to write into, not the php file
                var xmlhttp = new XMLHttpRequest();
                xmlhttp.onreadystatechange = function() {
                    if (this.readyState == 4 && this.status == 200) {
                    }
                }
                /* the filename and the data need to be escaped in the string */
                xmlhttp.open("GET", "editTXT.php?txtFile="+file+"&data="+data);
                xmlhttp.send();
                setTimeout(update, 500);
            }

            function update() {
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    var response = xhttp.responseText;
                    console.log(response);
                }
                };
                xhttp.open("GET", "readTxt.php?file=test.txt", true);
                xhttp.send();
            }


            /* call the function that prompts for data input */
            submitData();       
        </script>
    </body>
</html>
...