2

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

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

1 回答 1

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 变量的表单,当您提交表单时,它将创建一个名为[X] 的文件chatroom_[X].json,其中 [X] 是<input type="text" name="id" ... />字段中的值。

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

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

我在您的代码中没有看到任何实际发布变量的内容: chattextclientidupdateChatRoom.php

据我所知:

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

将只发布id=X(其中 X 是聊天室 ID 号)以updateChatRoom.php没有任何其他变量。

于 2013-11-11T21:42:51.303 回答