我有一个更新聊天室的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");
}
答案 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 ,而不使用其他任何变量。