私は本当に役に立つ答えを得ることを望んでいます。私は、2 人のユーザー間のプライベート セッションを許可するチャットボックスを作成する方法に取り組んできました。1 つは、一般的なチャットルームに参加するオプションを使用して 2 人のユーザーのみがチャットするものです。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>
makesend.php ファイルにデータを送信する send() 関数は次のとおりです。
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;
}
}
}
?>"
);
要素のinnerHTMLにphpコードを追加することは合法だと思うので、このコードは存在するファイルのバージョンをロードします。セッションからファイル名を取得するのは、データが makesend.php ファイルに送信された後にコードのこの部分が実行され、セッションが開始されて ($_SESSION['full'] および $_SESSION['str'] ) 値。ファイルをロードするこの部分は、関数 makefile() 内の最後のコード部分です。まず、関数はユーザーがクリックした名前の形式でユーザーからデータを取得し、それらをスクリプト (makesend.php) に送信します。チャット ログ ファイルは、この後、最後の部分で、データを区分 "msgarea" にロードします。次に、ユーザーから送信されたメッセージを表示するために、一定の時間が経過したら、作成されたログ ファイルを更新/再読み込みする必要があるため、2 を使用することにしました。
<?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>';
}
?>
それだけだと思います、システム全体、また、ログアウト呼び出しに問題があります。コードは次のとおりです。ファイルの最後にあります: $("#exit").click(function(){ 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 にあると思いますが、他に何か見つけられることがあれば、とても感謝しています。これを実装するのに役立つ関連する回答。testing.phpとmakesend.phpの両方にあるコード全体を、ここで説明したように分離されていない方法で投稿してほしい場合は、お尋ねくださいそれが役立つなら.iは、他の人を助けるために道を譲るすべての高度なプログラマーに感謝します, 事前に感謝.