没有文件写入的 PHP 脚本正在删除文件信息


PHP script with no file writing is deleting file information

我有一个更新聊天室的JavaScript更新脚本,如下所示:

// Update chat rooms //
if(time > lastchatupdatetime + .4){
    for(var i in this.chatroomlist){
        var chattext = AJAX('server/updateChatRoom.php','id='+i);
        document.getElementById("S3DChatRoom_" + i).innerHTML = chattext;
    }
    lastchatupdatetime = time;
}

AJAX 函数如下所示:

var AJAX = function (page, send, callback){
    if(typeof callback == 'undefined') callback = function() {};
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else { // for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function (){
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            chatresponse = xmlhttp.responseText;
            callback();
        }
    }
    xmlhttp.open("POST",page,true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send(send);
    return chatresponse;
}

PHP 脚本如下所示:

$chatroomid = isset($_POST['id'])?$_POST['id']:0;
$chatroomdir = "../chatrooms/";
$chatroomurl = $chatroomdir . 'chatroom_' . $chatroomid . ".json";
if(file_exists($chatroomurl)){
    $chattext = json_decode(file_get_contents($chatroomurl),TRUE);
    if($chattext == TRUE){
    foreach($chattext as $i){
        echo $i[0] . ": " . $i[1] . "<br>";
    }
    }
} else {
    echo "Chatroom listed does not exist";
}

提交新的聊天文本后,文本被写入并在第一次更新时显示,然后在下次更新时,它会从包含聊天内容的.json文件中删除。这对我来说完全没有意义,我已经编写了类似的聊天应用程序,甚至远程存在这个问题。这发生在WebMatrix的IIS-Express PHP和WAMP的PHP上。

这是聊天提交PHP脚本(其中留下了一些调试代码 - 调试代码工作正常,所有信息都正确编写):

$chatroomid = $_POST['id'];
$chatroomtext = $_POST['chattext'];
$clientid = $_POST['clientid'];
$chatroomdir = "../chatrooms/";
$chatroomurl = $chatroomdir . "chatroom_" . $chatroomid . ".json";
$currentchattext = file_get_contents($chatroomurl);
$currentchattext = json_decode($currentchattext, TRUE);
$currentchattext[] = array($clientid,$chatroomtext);
file_put_contents("debug2",json_encode($currentchattext));

$success = file_put_contents($chatroomurl, json_encode($currentchattext));
file_put_contents("debug",json_encode($currentchattext), FILE_APPEND);
if($success == FALSE){
    echo 0;
} else {
    echo 1;
}

这是用于发布 JavaScript 的 JavaScript:

var submitChatTextconfirm;
document.getElementById("S3DTextInput_"+name).addEventListener("keypress",function(event) {
    if(event.keyCode == 13){
        submitChatTextconfirm = AJAX("server/submitChatText.php", "id=" + name + "&chattext=" + document.getElementById("S3DTextInput_"+name).value + "&clientid=" + this.clientid);
        console.log(document.getElementById("S3DTextInput_"+name).value);
        console.log(submitChatTextconfirm);
    }
},true);
if(submitChatTextconfirm == 1){
    console.log("Chat sent");
} else {
    console.log("ERROR: Chat text failed to send");
}

这还不完全是一个答案(但评论失控了,我需要能够放下一些代码)......但我不认为这是 PHP 本身的问题。我只是稍微重构了一下你的脚本,并通过表单提交将其拼凑成一个文件(暂时删除 AJAX) - 只是为了调试。

制作了一个名为 updateChatRoom.php 的文件并将其放入我的本地主机上的一个文件夹中 - 基本上没有健全性检查、输入过滤或任何内容,所以在现场环境中它会非常非常糟糕,但它证明这个概念并没有真正的问题。

我在 PHP 文件中得到的是这样的:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Chatroom test</title>
</head>
<body>
<form action="updateChatRoom.php" method="post">
<div><textarea name="chattext">Some chat text here</textarea></div>
<div><input type="submit" value="submit" /></div>
<div style="margin-top: 50px;"><label>id: <input type="text" name="id" value="<?php echo !empty($_POST['id']) ? (int) $_POST['id'] : "1"; ?>" /></label></div>
<div><label>clientid: <input type="text" name="clientid" value="<?php echo !empty($_POST['clientid']) ? $_POST['clientid'] : "abc123"; ?>" /></label></div>
</form>
<div>
<?php
if(!empty($_POST)) {
    $chatroomid = (int) $_POST['id'];
    $chatroomtext = $_POST['chattext'];
    $clientid = $_POST['clientid'];
    $chatroomdir = "";
    $chatroomurl = $chatroomdir . "chatroom_" . $chatroomid . ".json";
    echo "<p>'$chatroomurl = {$chatroomurl}</p>'n";
    if(file_exists($chatroomurl)) {
        $currentchattext = file_get_contents($chatroomurl);
        $currentchattext = json_decode($currentchattext, TRUE);
    }
    $currentchattext[] = array($clientid,$chatroomtext);
    file_put_contents($chatroomurl, json_encode($currentchattext));
    echo "<pre>" . file_get_contents($chatroomurl) . "</pre>'n";
}
?>
</div>
</body>
</html>

这会在页面上放置一个表单,其中包含您的 $_POST 变量,当您提交表单时,它将创建一个名为 chatroom_[X].json 的文件,其中 [X] 是<input type="text" name="id" ... />字段中的值。

如果该文件不存在,它将创建它。

这基本上有效,每当您提交表单时,文件中的 JSON 都会由表单 Array('ID_NUMBER', 'TEXT_INPUT') 的另一个数组扩展。

不过,我在您的代码中没有看到任何实际发布变量的内容:聊天文本客户端 ID以更新聊天室.php

据我所知:

var chattext = AJAX('server/updateChatRoom.php','id='+i);

将只发布id=X(其中 X 是聊天室 ID 号)来更新聊天室.php而没有其他变量。