2014-12-03 56 views
1

我有一個簡單的問題在這裏,PHP私聊長輪詢整合

Ive得到了我的聊天HTML裏面這種形式多數民衆贊成:

<form action="../addchat.php" method="POST" enctype="multipart/form-data"> 
        <textarea id="textarea" style="border-radius:0px; border:none; background-color:rgb(243,243,243); min-height:100px;"name="comment" rows="4" cols="50"></textarea><br> 
        <input height="25px" width="20px" style="float:right;" type="image" src="../arrow.png" name="submit" value="Comment"> 

</form> 

這種形式對於用戶提交他們的聊天信息。而在此之後,形式職位將直接向addchat.php的信息,其中包含以下代碼:

<?php 
ob_start(); 
session_start(); 
include_once("config.php"); 



$reply=mysqli_real_escape_string($mysqli,$_POST['comment']); 
$cid=mysqli_real_escape_string($mysqli,$_SESSION['cid']); 
$uid=mysqli_real_escape_string($mysqli,$_SESSION['userid']); 
$time=time(); 
$ip=$_SERVER['REMOTE_ADDR']; 
$q= mysqli_query($mysqli,"INSERT INTO conversation_reply (user_id_fk,reply,ip,time,c_id_fk) VALUES ('$uid','$reply','$ip','$time','$cid')") or die(mysqli_error($mysqli)); 

?> 

這個腳本明顯的數據添加到表中,並在此之後,聊天的html頁面上的其他腳本會顯示出來聊天消息。

但是,目前的問題是,首先,用戶點擊提交後,頁面將重定向到另一個空白頁面並顯示成功消息。其次,用戶需要刷新以查看新的聊天消息。

這個聊天應用程序是一個私人聊天(類似Facebook),所以不知道該怎麼做?希望有些幫助:)

+0

我建議你和的NodeJS SocketIO,這裏是基本的聊天例如將覆蓋的基本知識,併爲您的聊天程序的話題。 http://socket.io/demos/chat/ – Kiee 2014-12-03 10:44:50

+0

我對SocketIO和Node進行了檢查,在我看來,它們更適用於羣組聊天應用程序,而在我的情況下,我正在尋找更多的私人聊天(某事像臉書),它會在這種情況下仍然有效嗎? – user4269367 2014-12-03 13:14:12

+0

是的。你可以喜歡......驗證用戶,將他們放入廣播組(聊天室)或讓他們直接對話。節點和php的主要區別是在節點中你總是可以訪問所有的連接。 (你可以很容易地把連接放到一個數組中,並迭代它們來廣播消息)。反正..如果你確實想在php中這樣做,你可以增加時間量,直到php掛起連接。只是睡覺你的PHP腳本,直到有數據可用(例如每秒從數據庫請求新消息),然後迴應ajax請求 – GottZ 2014-12-03 16:33:12

回答

0

如果你不想它重定向。將PHP代碼移到與表單相同的文件中。你可以使用include。 然後使表格action=""。 然後,在PHP附近,您需要檢查POST是否存在,以便僅當表單提交時才運行:

if (!empty($_POST)) 

至於刷新問題。你可能想看看AJAX或甚至socket.io

+0

socket.io需要nodejs,儘管 – GottZ 2014-12-03 10:37:55

+0

是的。但這只是另一個考慮的選擇。 – 2014-12-03 10:38:38

0

標準的html表單提交總是會提交(和重定向)到表單的action屬性中定義的頁面。使用jQuery你可以阻止這種默認行爲加上阿賈克斯發送表單數據:

$("form").on("submit", function(event){ 
    event.preventDefault(); 
    $.ajax({ 
     url: "../addchat.php", 
     type: "POST", 
     cache: false, 
     data: { 
      comment: $("#textarea").text() 
     }, 
     success: function(data){ 
      //something you could do on success of your ajax call. 
      //you might not need it in this case. 
     } 
    }); 
}); 


其次,你需要的是自動刷新你的輸出地區的一些程序。在「chat_output

var refresh_time = 500; // chat refresh time in ms 

setInterval(function(){ 
    $.ajax({ 
     url: "chat_output.php", 
     type: "GET", 
     dataType: "html", 
     cache: false, 
     success: function(data){ 
      $("#chat_content_div").html(data); 
     } 
    }); 
}, refresh_time); 

:創建你的HTML一個div顯示聊天輸出:

<div id="chat_content_div"></div> 

,那麼你就必須做這樣的事情在你的JavaScript自動刷新。 PHP「你只顯示(html)數據從數據庫顯示在這個div。

+0

我會對此進行測試,但其他人指出的一個問題是,使用php ajax的組合會重載apache工作線程,所以我想我會堅持使用node.js。不管怎麼說,還是要謝謝你! – user4269367 2014-12-03 13:18:39

0

回答這個問題並不簡單,因爲它屬於您在聊天應用程序中想要的多麼複雜/複雜。

  1. 如果你不想得到重定向提交的時候,你可以使用AJAX張貼形式Submit a form using jQuery
  2. 如果你不想刷新頁面加載新的聊天信息,你可以使用AJAX呼叫在時間間隔http://www.w3schools.com/jsref/met_win_setinterval.asp中獲取新消息。
  3. 如果您希望在發件人(與當前用戶聊天)發送新聊天消息時,可以考慮使用推送服務器,如NodeJS(http://nodejs.org)或Socket。io(http://socket.io/
0

我不會爲此目的使用PHP,如果我是你,或者如果你這樣做,你需要很多ajax來使這個聊天工作。

ajax請求發送...每隔n毫秒發送一次ajax請求以獲取新消息。你還應該使用API​​而不是網頁來與你的服務器端應用進行交互。您的服務器需要高可用性並且響應速度非常快。

如果你想讓這個聊天非常有效,你應該選擇一種支持websockets的語言(例如pythondjango,或者java,或者其他)。在寫這些代碼時我發現了一些東西(Ratchet library)在php中使用websocket(我不知道它是如何工作的,但是如果你的服務器的max_execution_time與「while true」一起工作,你可能會遇到問題,環)

編輯:作爲疃平陽暗示,是的NodeJS另一個很好的選擇

+0

很適合私人用途的小型私人聊天一些簡單的Ajax聊天就足夠了,恕我直言。 websockets真的很難使用,特別是如果你對網絡編程完全陌生。取決於他是否想要自己做並學習一些東西,或者如果他只想要一個正在進行的聊天。 – 2014-12-03 10:45:27

+0

我想他想學習,如果沒有,有很多隨時可用的php聊天工具 – n00dl3 2014-12-03 10:59:35

+0

哈哈謝謝你們,我是一個初學者,在javascript/ajax/jquery中,我看過Node.Js,唯一擔心的是我是否能夠將其與我當前的PHP(可能是一個問題)集成 – user4269367 2014-12-03 13:17:06