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

时间:2013-11-11 16:00:40

标签: javascript php ajax

我有一个更新聊天室的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";
}

在我提交新的chattext之后,文本被写入并在第一次更新时显示,然后在下次更新时,它将从保存聊天内容的.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:

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");
}

1 个答案:

答案 0 :(得分:0)

这还不是答案(但是评论已经失控,我需要能够放下一些代码)......但我不认为这是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')形式的数组扩展。

我在代码中没有看到的是实际上POST变量的任何内容: chattext clientid updateChatRoom.php

据我所知:

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

只需将id=X(其中X是聊天室ID号)发送到 updateChatRoom.php ,而不使用其他任何变量。