2013-04-09 79 views
0

我想通過Ajax將最新的mysql表中的條目拖動到div中並將其顯示爲html內容。我有一個Ajax和PHP功能正常,我唯一的問題是,我想查詢新的條目,並在一個循環內的時間間隔堆棧結果,我遇到了兩個問題:獲取數據的行爲像一個正常的JavaScript字符串,並獲得循環只返回唯一的條目。如何通過JQuery/Ajax請求返回最新的Mysql條目

update.php文件

$con=mysqli_connect("mydbhost.com","username","password","database_name"); 
// Check connection 
if (mysqli_connect_errno()) 
{ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$result = mysqli_query($con,"SELECT * FROM conversations"); 
$j = 0; 
while($row = mysqli_fetch_array($result)) 
{ 
$carray[j] = $row['comment']; 
$j++; 
} 
$comment = (array_pop($carray)); 
echo $comment; 
echo "<br>"; 
mysqli_close($con); 

JQuery的Ajax請求循環:

$(document).ready(function(e){ 
    var comment; 
    function commentLoop() { 
    comment = $('#testdiv').load('update.php'); 
    $('#testdiv').append(comment); 
    setTimeout(commentLoop, 6000); 
    } 
    commentLoop(); 

    $(document).focus(); 
}); 
+1

作爲一個以前的答案已經指出,您的SQL返回表中的一切,但你遍歷所有數據,只返回最後在你的回聲中排。此外,您正在使用'$ _POST ['comment']',但沒有任何內容被髮布到腳本中。最重要的是,在您的AJAX中,您將頁面加載到div中,然後將該加載的結果(它是一個非返回函數)附加到同一個div。所以,真的,這裏有很多事情可能會出錯。 – Jon 2013-04-09 23:22:01

+1

我刪除了$ _POST('comment')。這與我的錯誤沒有任何關係。 – Emanegux 2013-04-09 23:28:53

+1

您仍在選擇表格中的所有內容,只將其中一個發送回AJAX呼叫。如果需要,可以使用會話或其他方法,以便知道上次加載的位置,然後將其包含在select語句中,以便選擇實際要處理的正確數量的行並將它們全部輸出AJAX。而且,每次運行'commentLoop()'時,您仍然會替換整個DIV。 – Jon 2013-04-09 23:31:22

回答

1

這將算在表中的意見和選擇最後輸入的註釋,然後把它們傳遞給阿賈克斯json數據僅在接收的計數大於表中的註釋的計數低:

PHP:

if(isset($_GET['data'])) 
{ 
    $con  = new mysqli('host', 'user', 'password', 'database'); 
    $init_count = $_GET['data']; 
    $stmt1  = "SELECT COUNT(*) AS count FROM conversations"; 
    $stmt2  = "SELECT comment FROM conversations ORDER BY date_column DESC LIMIT 1"; 

    $total = $con->prepare($stmt1); 
    $total->execute(); 
    $total->bind_result($count); 
    $total->fetch(); 
    $total->close();  

    if(($init_count != '') && ($init_count < $count)) 
    { 
     $lastComment = $con->prepare($stmt2); 
     $lastComment->execute(); 
     $result = $lastComment->get_result(); 
     $row = $result->fetch_assoc(); 
     $lastComment->close(); 

     $data = array(
       'comment' => $row['comment'], 
       'count' => $count 
       ); 
    } 

    elseif($init_count == '') 
    { 
     $data = array(
     'comment' => '', 
     'count' => $count 
     ); 
    } 
    $pdo->close(); 
    echo json_encode($data); 
} 

HTML:

<input type="hidden" id="count" value="" /> 

JQUERY:

$(document).ready(function(e){ 

    function getComment(){ 
     var count = $('#test').val(); 
     $.ajax({ 
       type: 'get', 
       url: 'update.php?data=' + count, 
       dataType: 'json', 
       success: function(data) 
      { 
      $('#count').val(data.count); 
      if(data.comment) != $('#testdiv').html(data.comment); 
      } 
     }); 
    } 
    getComment(); 
    setInterval(getComment, 6000); 

}); 
3

的問題是這樣做SELECT * FROM conversations你不停地請求整個表 - 儘管你只需要最後一個。

您的代碼需要記住加載了哪條評論,並且只能獲得比此更新的評論。

例如,假設您的主鍵是增量式,請執行SELECT * FROM conversations WHERE convid > ?。將?替換爲已加載的最新評論。如果您是第一次加載,只需做SELECT * FROM conversations

您可以將使用請求參數顯示的最後評論ID傳遞到update.php。此外,我再評JSON格式返回數據,所以你可以返回評論和id的集合,簡單地分析它

+1

不是真的,他只收集最後一個(查看在while循環之後使用的'array_pop'方法)。而且,他每次調用'load'函數時都會替換整個DIV。 – Jon 2013-04-09 23:24:14

+0

我的$ comment變量只存儲數組中最後一個以條目順序存儲所有註釋的元素。 – Emanegux 2013-04-09 23:24:30

+0

@Emanegux是的,但是沒有必要填充一整列的評論,然後只使用其中的一個並放棄其餘的,如果你只需要最後一個,你應該只選擇最後一個。 – Jon 2013-04-09 23:27:41

-1
SELECT * FROM conversations order by insert_date desc limit 10 

insert_date日期時間註釋被插入,我希望你能有一個字段用於存儲,如果不加上現在