我有一个更新聊天室的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而没有其他变量。