2017-10-31 11 views
0

私はphp + ajax + mysqlを使ってチャットシステムを作成しようとしています。ユーザ同士のチャットシステム

<?php 
    session_start(); 
?> 
<html> 
    <head> 
     <title>Live Table Data Edit</title> 
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> 
     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 
    </head> 
    <body> 
     <div class="container"> 
      <br /> 
      <br /> 
      <br /> 
      <div class="table-responsive"> 
       <h3 align="center">You Are : <?php echo $_SESSION['name']; 
       ?></h3><br /> 
       <div id="live_data"></div>     
      </div> 
      <div id="messages"></div> 
      <div class="area" style="display:none"> 
      <textarea id="text" name="text"></textarea> 
      <input type="submit" id="sub" name="sub" value="Send" /> 
      </div> 
     </div> 

    </body> 
    </html> 

    <script> 
$(document).ready(function() { 
    function fetch_data() { 
    $.ajax({ 
     url: "select.php", 
     method: "POST", 
     success: function(data) { 
     $('#live_data').html(data); 
     } 
    }); 
    } 
    fetch_data(); 

    $(document).on('click', '.first_name', function() { 
    var id = $(this).data("id1"); 

    function fetch_chat() { 
     $.ajax({ 
     url: "fetch_chat.php", 
     method: "POST", 
     data: { 
      id: id 
     }, 
     dataType: "text", 
     success: function(data) { 
      $('#messages').html(data); 
      $("div.area").show(); 
     } 

     }); 
    } 

    fetch_chat(); 
    $("#sub").click(function() { 
     var text = $("#text").val(); 
     $.post('insert_chat.php', { 
     id: id, 
     msg: text 
     }, function(data) { 
     $("#messages").append(data); 
     $("#text").val(''); 

     }); 
     alert(text); 
    }); 
    }); 
}); 

が、トラブルは、私は、MySQLのメッセージを新しいメッセージを挿入しようとすると、私がクリックしたしたすべてのユーザーに送信されていることです。

fetch_chat.php

<html> 
<head> 
</head> 
<body> 
<?php 
session_start(); 
$con=mysqli_connect('localhost','root','','test'); 
$id= $_POST['id']; 
$sql="select * from users where id='$id'"; 
$res=mysqli_query($con,$sql); 
$row=mysqli_fetch_array($res); 
$user_to= $row['name']; 
$sql1="select * from chats where user_from='$_SESSION[name]' AND 
user_to='$user_to' OR user_to='$_SESSION[name]' AND user_from='$user_to' 
order by id"; 
$res1=mysqli_query($con,$sql1); 
if(mysqli_num_rows($res1)>0){ 
    while($row=mysqli_fetch_array($res1)){ 
?> 
     <b> <?php echo $row['user_from']; ?>:</b> 
     <?php echo $row['msg']; ?><br /><br /> 
     <?php 
    } 
} 
else 
    echo "No msgs <br />"; 
?> 

</body> 
</html> 

とinsert_chat.phpです:

<html> 
<head> 
</head> 
<body> 
<?php 
session_start(); 
$con=mysqli_connect('localhost','root','','test'); 
$id= $_POST['id']; 
$msg=$_POST['msg']; 
$sql="select * from users where id='$id'"; 
$res=mysqli_query($con,$sql); 
$row=mysqli_fetch_array($res); 
$user_to= $row['name']; 

$sql1="insert into chats(user_from,user_to,msg) 
values('$_SESSION[name]','$user_to','$msg')"; 
$res1=mysqli_query($con,$sql1); 
if($res1){ 
?> 
    <b> <?php echo $_SESSION['name']; ?>:</b> 
    <?php echo $msg; ?><br /><br /> 
<?php 
} 
?> 
</body> 
</html> 

私は私が間違っているつもりですどこか分かりません。これで私を助けてください。

例えば、ユーザのリストである:

(1)ユーザ

(2)ユーザB

(3)ユーザC

したがって、最初に、私はaをクリック私はbを選択し、テキストを送信するように私の心を変えました。しかし、そこに問題が発生します:私は両方の文字を同時に送信しているように、データがaとbの両方に挿入されます。

+0

すべてのチャットにそのメッセージが表示されたら、そのことを意味しますか?どのようにデータベースに挿入されているかを確認しましたか? –

+1

あなたの問題は解決していませんが、セキュリティ上の注意があります:コードはmysql注入に広く開いています! https://secure.php.net/manual/en/security.database.sql-injection.php – Connum

+1

注:mysqliへのオブジェクト指向インターフェイスは、コードの読み込みと監査をより簡単にし、古いmysql_queryインターフェースと簡単に混同しないでください。手続き型スタイルに多額の投資をする前に、それを切り換える価値があります。例: '$ db = new mysqli(...)'と '$ db-> prepare(" ... ")'手続き型インタフェースはmysqli' APIが導入されたPHP 4時代のアーティファクトであり、コード。 – tadman

答えて

0

「first_name」をクリックするたびに、「クリック」イベントハンドラを「サブ」に追加し続けます。したがって、再度subをクリックするたびに、以前のすべてのイベントハンドラが何度も実行されます。したがって、現在のメッセージは表示されますが、ページをロードしてから以前にクリックしたすべてのユーザーに送信されます。

$("#sub").click(function() { 

あなたが新しいデータで新しいバージョンを定義する前に、それは以前のハンドラを削除するよう

$("#sub").off("click").on("click", function() { 

する必要があります。

関連する問題