如何使用ajax和php在聊天和消息系统中创建用户文件

时间:2012-10-16 16:09:01

标签: php javascript ajax

我真的希望得到一个有用的答案。我一直在努力建立一个允许两个用户之间私人会话的聊天框,一个只有两个用户聊天加入一般聊天室的选项,我这样做没有任何xmpp,套接字等,我是只使用可以作为日志的文件,我将解释这个概念: 用户已登录,他们被定向到聊天页面,其中存储在数据库中的朋友列表被加载到他们的右侧,这部分工作正常:

//i've declared all the variables previously
//skip to the part that loads the names:   
 while($rowb=mysql_fetch_array($done))
{
$rafiki=$rowb['name'];
//show the names,when the user clicks on any of them, the name(variable $jina) of the user
//and the friend's name are sent to the function makefile()
echo "<a href='Javascript:makefile(".$jina.",".$rafiki.")'>"."$rafiki"."</a>"."<br/>";
}

当用户点击任何名称时,它们被发送到javascript函数,该函数接受两个参数,用户的名字和朋友的名字,然后在末尾添加一个扩展名,以创建一个日志文件作为两者之间的聊天记录:

function makefile(username,friendname)
{
//add file extension
var ext=".html";
//concatenate
var dash="-";
var full=username.concat(dash,friendname,dash,ext);
var str=friendname.concat(dash,username,dash,ext);

所以每对都有自己的文件,变量full通过ajax发送到脚本以使进程无缝,脚本做了很多事情: 它首先检查是否存在带有从客户端发送的数据的日志文件,以用户名或朋友的名字开头,如果存在任何一个文件,它会检查是否有任何消息已发送并写入到文件,如果两个文件都不存在,它会创建一个新文件,并提示用户朋友想要开始聊天,当朋友点击用户名时,第一个条件会成功,因为文件已经存在制成:

<?php
session_start();
$full=$_POST['full'];
//first, check to see if variations of the file already exist
//start by exploding the sent data
$result=explode("-",$full);
$usrnme=$result[0];
$frndnme=$result[1];
$ext=$result[2];
//make varied names for comparison
$vrdfull=array($result[1],$result[0],$result[2]);
$str=implode("-",$vrdfull);
$_SESSION['str']=$str;
$_SESSION['full']=$full;
//start actual comparison
if(file_exists($full)||file_exists($str))
{
//stuff to do if first file exists
if(file_exists($full))
{
//check to see if message has been sent
if (isset($_POST['message']))
{
$message=$_POST['message'];
//update existing file with message
$fp=fopen($full,'a');
fwrite($fp, "<div id=\"sent\">".$usrnme." :"." ".$message."<br/>"."</div>");
//close the file
fclose($fp);
}
}
else
//stuff to do if second file exists
{if(file_exists($str))
{
//check to see if message has been sent
if (isset($_POST['message']))
{
$message=$_POST['message'];
//update existing file with message
$fpp=fopen($str,'a');
fwrite($fpp, "<div id=\"sent\">".$usrname." :"." ".$message."<br/>"."</div>");
//close the file
fclose($fpp);
}
}
}
}
else
{
//create file, since neither files exist
$fhandel=fopen($full,'a');
//check if message has been sent
if(isset($_POST['message']))
{
$messssage=$_POST['message'];
fwrite($fhandel,"<div id=\"sent\">".$usrname." "." : ".$messssage."<br/>"."</div>");
}
fclose($fhandel);
//send msg to friend, incurring them to accept
$ext=".html";
$frrnme=$frndnme.$ext;
$fpp=fopen($frrnme,'a');
//prompt the user to initiate chat by opening file,by clicking on the name he/she would see
fwrite($fpp,"<div id=\"msg\">".$frndnme." wants to chat, click on their name to accept"."</div>");
fclose($fpp);
}
?>

我不认为这部分有任何问题,只是发布它以帮助传达这个想法。这里是将字符串发送到脚本的ajax(我认为这可能是错误的):

$.ajax({
type:'POST',
url:'makesend.php',
data: {full:full},
//what to do if data was sent:
success: function(full){
$('#myResponse').html(full);


}
});
return false;

没有数据显示在div“myresponse”中,所以我觉得这里有问题,我不知道是什么。接下来的事情是处理用户发送的消息,这里是获取输入的表单:

<form name="message" action="">
    <input name="message" type="text" id="usermsg" size="63" />
    <input name="submitmsg" type="submit" onclick="send()"  id="submitmsg" value="Send" />
</form>

这里是send()函数,它将数据发送到makesend.php文件:

function send(){
var clientmsg = $("#usermsg").val();
    $.post("makesend.php", {message: clientmsg});               
    $("#usermsg").attr("value", "");
    return false;
}

再次,当我测试这个并写了一条消息时,页面重新加载,没有数据发送到脚本!这里也有问题,我不知道它是什么。继续,在创建文件和用户开始交互之后,需要将其上传到用户可以看到的消息区域,这里是消息区域div:

记住我需要加载一个存在的文件,所以在将它加载到这个区域之前,我需要使用php查看哪个版本存在,要么首先使用用户名,要么使用朋友的名字($ full或$ str):

$("#msgarea").html(
"<?php
    //check to see if either file exists
if(file_exists($_SESSION['full'])||file_exists($_SESSION['str'])){
    //check to see if the first file exists:
            if(file_exists($_SESSION['full']))
    {
    $full=$_SESSION['full'];
    $handlle = fopen($full, "r");
    $contents = fread($handlle, filesize($full));
    fclose($handlle);
    //load it's contents to the division if it does
    echo $contents;}
    else
    { 
            //if first file doesn't exist, load the second one:
    $str=$_SESSION['str'];
            //check to see if it exists before loading it
    if(file_exists($str))
    {
    $handle = fopen($str, 'r');
    $contents = fread($handle, filesize($str));
    fclose($handle);
    //load it to the division
    echo $contents;
    }
    }
}
?>"
 );

我认为这样做是合法的,将php代码添加到元素的innerHTML中,因此这段代码会加载存在的任何版本的文件。我从会话中获取文件名,因为这部分代码在数据发送到makesend.php文件后执行,该文件启动会话并给出它们($ _SESSION ['full']和$ _SESSION ['str'] )价值观。加载文件的这部分是函数makefile()中的最后一段代码,首先,该函数以他们点击的名称的形式从用户获取数据,然后将它们发送到脚本(makesend.php),该脚本创建了聊天日志文件,在此之后,是最后一部分,它将数据加载到分区“msgarea”。接下来,我需要刷新/重新加载创建的日志文件一段时间后显示用户发送的消息,我选择使用2.5秒,这部分是在函数makefile()之外,我不得不使用在jquery中的php首先检查哪个文件存在,然后我在php中使用jquery重新加载和动画(自动滚动)现有的,这个php在'javascript'标签内:

 <?php
//set up the conditions

$full=$_SESSION['full'];
$str=$_SESSION['str'];
//check whether either file exists
if(file_exists($full)||file_exists($str))
{
 //reload the first file if it exists
if(file_exists($full)){
//this is the jquery inside the php(which is also in javascript tags)
echo '<script type="text/javascript" src="jquery-1.8.0.min (1).js"></script>';
echo '<script type="text/javascript">';
echo
'function loadLog(){        
    var oldscrollHeight = $("#msgarea").attr("scrollHeight") - 20;
    $.ajax({
        url: <?php session_start(); echo $_SESSION[\'full\']?>,
        cache: false,
        success: function(html){        
            $("#msgarea").html(html); //Insert chat log into the #msgarea div               
            var newscrollHeight = $("#msgarea").attr("scrollHeight") - 20;
            if(newscrollHeight > oldscrollHeight){
                $("#msgarea").animate({ scrollTop: newscrollHeight  }, \'normal\'); //Autoscroll to bottom of div
            }               
        },
    });
}
setInterval (loadLog, 2500);    //Reload file every 2.5 seconds';
}
else{
    //this will reload the second file since the first doesn't exist:
echo 
'function lloadLog(){       
    var oldscrollHeight = $("#msgarea").attr("scrollHeight") - 20;
    $.ajax({
        url: <?php session_start(); echo $_SESSION[\'str\']?>,
        cache: false,
        success: function(html){        
            $("#msgarea").html(html); //Insert chat log into the  #msgarea div              
            var newscrollHeight = $("#msgarea").attr("scrollHeight") -  20;
            if(newscrollHeight > oldscrollHeight){
                $("#msgarea").animate({ scrollTop: newscrollHeight }, \'normal\'); //Autoscroll to bottom of div
            }               
        },
    });
}
setInterval (lloadLog, 2500);   //Reload file every 2.5 secsonds';

}
echo '</script>';
}
?>

我认为就是这样,整个系统,退出调用也有问题,这里是代码,它位于文件的最后:      $( “#退出”)。点击(函数(){         var exit = confirm(“你确定要结束会话吗?”);         if(exit == true){window.location ='testing.php?logout = true';}
    }); 这是它的标记:

<p class="logout"><a id="exit" href="#">Exit Chat</a></p>

并且在文件的顶部,这是检查它是否设置为true的部分:

session_start();
//logout function
if(isset($_GET['logout']))
{
if(file_exists($_SESSION['full'])||file_exists($_SESSION['str']))
{
if(file_exists($_SESSION['full']))
{
$full=$_SESSION['full'];
$flogout=fopen($full,'a');
fwrite($flogout, $_SESSION['username']." has left the anichat!!!  "."<br>");
fclose($flogout);
}
else
{
$str=$_SESSION['str'];
if(file_exists($str))
{
$flogoout=fopen($str,'a');
fwrite($flogoout, $_SESSION['username']." has left the chat  "."<br>");
fclose($flogoout);
}
}
}
session_destroy();
header("Location:testing.php");//user redircect.
}

用户的页面甚至没有刷新,因此会话被销毁,它只是刷新并且会话数据仍然存在(这是因为登录表单没有显示,如果$ _SESSION ['应该显示它) name']为空)。我知道这是一个很长的问题,但我是一个初学者,我真的需要帮助,我认为主要问题是ajax,但如果你能发现任何其他我会非常感激,我请求一个相关的答案将帮助我实现这一点,如果你希望我发布test.php和makesend.php中存在的整个代码,方式不像我在这里做的那样分开,请问如果它有所帮助。我感谢所有高级程序员,他们不顾一切地帮助他人,提前谢谢。

1 个答案:

答案 0 :(得分:0)

我猜是处理页面makesend.php没有检索到请求的任何内容。您可以使用firebug来确定它是否写入了某些东西。我之所以这么说是因为你在更新后没有读取文件(没看到它)你可以创建一个新的ajax请求,在一段时间后定期调用,并在会话中加载日志文件中的内容。