2011-01-07 27 views
10

Làm cách nào để tôi có thể phát hiện các bản cập nhật mới nhất được thực hiện cho cơ sở dữ liệu và âm thầm làm mới trang khi có thay đổi xảy ra?Làm cách nào để làm mới trang khi cơ sở dữ liệu được cập nhật?

Hãy nói rằng việc tiếp cận cơ sở dữ liệu trông giống như:

$host = "localhost"; 
$username = "root"; 
$password = "root"; 
$db = mysql_connect($host,$username,$password) or die(mysql_error()); 
mysql_select_db('ccr') or die(mysql_error()); 

Bất kỳ ý tưởng và mẫu sẽ được đánh giá. Cảm ơn bạn.

Trả lời

9

Đây là cách gần đây tôi đã triển khai giải pháp bằng jQuery.

PHP tăng một trường trong cơ sở dữ liệu mỗi lần xuất hiện quan trọng.

<?php 

// Call this function when data changes 
function update_clients() 
{ 
    mysql_query("UPDATE pageGen SET id = id + 1 LIMIT 1"); 
} 

// Call this function to get the ID to pass to JavaScript 
function get_update() 
{ 
    $result = mysql_query("SELECT id FROM pageGen LIMIT 1"); 
    $update = mysql_result($result, 0, 'id'); 
    return $update; 
} 

?> 

Khi trang web ban đầu được nạp, cư một biến JavaScript với một số từ cơ sở dữ liệu:

<script type="text/javascript"> 
var pageGenID = 25218603 // generated by PHP 
var processUpdate = function(response) 
{ 
    if (pageGenID < response) 
    { 
     replace_current_data_with_new_via_ajax(); 
     pageGenID = response; 
    } 
} 
// Compare our Page Generate ID against that of the server 
var checkUpdates = function() 
{ 
    serverPoll = setInterval(function() 
    { 
     $.get('script_to_return_latest_pageGenID.php', 
      { lastupdate: 1 }, 
      processUpdate, 'html'); 
    }, 10000) 
}; 

// Check for updates every 10 seconds 
$(document).ready(checkUpdates); 

</script> 
+1

Trước hết, JQuery thêm cách quá nhiều chi phí cho một nhiệm vụ đơn giản như thế này. Nếu bạn đang đi tuyến đường AJAX, chỉ cần sử dụng một đối tượng 'XMLHttpRequest'. Ngoài ra, như tôi đã nói trong bài đăng của tôi, hãy giữ những thứ như 'pageGenID' * phía máy chủ * của bạn do nguy cơ cao của javascript hoặc tiêm MySQL. – Qix

+0

trong php của bạn, bạn cần phải lặp lại nó và không trả lại –

+0

@OfirAttia: Vâng, việc lặp lại được thực hiện bởi tập lệnh PHP đã tạo JavaScript. Tôi nên làm rõ điều đó. – Kalessin

0

Tôi tin rằng bạn sẽ phải thăm dò ý kiến ​​cơ sở dữ liệu khi bạn sử dụng PHP, PHP không tồn tại trong một quá trình chạy dài như trong thùng chứa Java nơi ứng dụng web Java có thể tạo kết nối liên tục (theo lý thuyết)) bạn có thể cần phải sử dụng một số loại cơ chế bỏ phiếu mà theo đó tôi có nghĩa là thiết lập bộ hẹn giờ trong Javascript hoặc bất kỳ mã khách hàng nào của bạn định kỳ thực hiện yêu cầu, về mặt tăng hiệu quả cho điều này nếu cần bảng người dùng và thiết lập cờ để chỉ ra rằng cơ sở dữ liệu đã bị vô hiệu hóa kể từ khi người dùng được thăm dò lần cuối, sau đó kiểm tra đầu tiên của bạn sẽ bị vô hiệu hóa kể từ khi người dùng đó cập nhật lần cuối thay vì gửi mọi thứ cho mọi người mọi lúc. Ngoài ra, tôi nghĩ bạn cần phải từ bỏ PHP cho công việc này.

0

ideea:

Khi bạn render một trang với php, bạn có thể vượt qua một biến phù thủy js đã giữ một "phiên bản cơ sở dữ liệu hiện tại" (một số). Trên trang bạn thực hiện một cuộc gọi ajax một lần mỗi 30 giây một phù thủy recives một bản sửa đổi cơ sở dữ liệu hiện tại mới để nói chuyện. Bạn kiểm tra cho những người 2 và nếu một trong những bạn nhận được từ cuộc gọi ajax là cao hơn thì nó có nghĩa là bạn cần phải tải lại trang.

Ở phía máy chủ, bạn cần một bảng để lưu trữ bản sửa đổi hiện tại, mỗi lần bạn thực hiện truy vấn từ php bạn đặt bản sửa đổi hiện tại +1 (trong bảng cơ sở dữ liệu sửa đổi). Khi bạn nhận được một cuộc gọi ajax từ một khách hàng, bạn đọc số đó từ cơ sở dữ liệu và bạn chuyển nó vào cilent. Bạn có thể thiết lập một cronjob sẽ thiết lập lại bộ đếm mỗi ngày.

1

Nói đúng ra, điều này là không thể. MySQL không kích hoạt trở lại PHP nếu có gì đó bị thay đổi. Nó chỉ là không thể. Ngoài ra, MySQL hoạt động bằng cách sử dụng phiên, vì vậy ngay cả khi nó có thể báo cáo một sự thay đổi trong cơ sở dữ liệu, bạn sẽ phải sử dụng kết nối liên tục để bạn có thể truy cập vào loại trình kích hoạt đó.

Bây giờ, nếu bạn muốn thực hiện các câu lệnh chọn để phát hiện sự thay đổi trong cơ sở dữ liệu, điều đó khác. Tùy thuộc vào cách "mới" bạn muốn mã của bạn được (tùy thuộc vào cách tương thích bạn muốn nó được), bạn có thể sử dụng bất kỳ một trong những điều sau đây để "thăm dò ý kiến" một trang PHP để kiểm tra các thay đổi: Comet, AJAX, một khung vĩnh viễn hoặc lớp WebSocket mới của HTML5.

Trong khi người khác sử dụng ứng dụng để phát hiện thay đổi thông qua các biến như phiên bản cơ sở dữ liệu được lưu trữ trong javascript, tôi khuyên bạn nên để máy chủ đó đứng đơn giản vì những người biết cách tiêm javascript sẽ có thể thay đổi giá trị đó , có thể tạo ra kết quả không mong muốn hoặc thậm chí độc hại (thậm chí, tùy thuộc vào cách giá trị đó được sử dụng, tiêm MySQL).

2

Đây là những gì tôi đã làm và tôi đã sử dụng câu trả lời bạn đã đánh dấu nhưng tôi nghĩ có một vài điều cần thay đổi ở đó. trong trang chính (mà bạn muốn làm mới nếu có gì đó thay đổi trong cơ sở dữ liệu). tôi đã tạo một bảng trong cơ sở dữ liệu của tôi được gọi là thiết lập, trong bảng này tôi tạo ra một hàng gọi là rowCounter. có rowCounter đang được cập nhật khi số lượng hàng trong bảng bạn kiểm tra đã thay đổi. vì vậy mã của tôi nằm trong hai khối. một trong đó cung cấp cho tôi số từ cài đặt> rowCounter và một là tập lệnh cung cấp cho tôi số hiện tại trong bảng. nếu chúng không bằng nhau thì tôi làm mới trang.

vì vậy đây là tệp đầu tiên bạn cần. gọi nó là
script_to_return_latest_pageGenID.php

// here you will make you connection query. 

$result = mysql_query("SELECT rowCounter FROM setting WHERE `id`='2'"); 
$update = mysql_fetch_assoc($result); 
     echo implode($update); 

    $count=mysql_query("SELECT `id` FROM log_".$datestamp."")or die(mysql_error); 
    $number = mysql_num_rows($count); 
//echo $number; 

    $countFromSetting=mysql_query("SELECT `rowCounter` FROM setting WHERE id='2'")or die(mysql_error); 
    $numberFromSetting=implode(mysql_fetch_assoc($countFromSetting)); 

    if($number != $numberFromSetting) 
     { 
      mysql_query("UPDATE setting SET `rowCounter`='$number' WHERE `id`='2'")or die(mysql_error); 

     } 


Trong trang chính, bạn sẽ viết hai khối mã tôi viết, bạn đặt nó trước khi kịch bản.

$countFromSetting=mysql_query("SELECT `rowCounter` FROM setting WHERE id='2'")or die(mysql_error); 
     $numberFromSetting=implode(mysql_fetch_assoc($countFromSetting)); 

Sau khi mã này bạn đặt các kịch bản đó sẽ truy vấn mỗi vài giây trang php, kiểm tra xem những con số không bằng nhau nó sẽ làm mới trang.

var pageGenID = "<?php echo $numberFromSetting; ?>"; 
var processUpdate = function(response) { 


var x=response; 
//console.log(pageGenID); by removing the remarks you will see the compared numbers all the time. 
//console.log(x); 
if (pageGenID != x) 
{ 
    //replace_current_data_with_new_via_ajax(); 
    pageGenID = response; 

    window.location.reload();  
    } 
} 

var checkUpdates = function() 
{ 
    serverPoll = setInterval(function() 
    { 

$.get('script_to_return_latest_pageGenID.php', 
     { lastupdate: 1 }, 
     processUpdate, 'html'); 
    }, 5000) }; 
    $(document).ready(checkUpdates); 
0

Có vẻ như bạn có thể sử dụng một cái gì đó như thế này, sử dụng một vòng lặp while. Điều này sẽ không làm việc cho số lượng lớn người sử dụng (có thể sẽ sụp đổ PHP hoặc SQL), và tại một số điểm bạn sẽ phải thiết lập lại các biến đếm trong kịch bản của bạn .:

<?PHP 
//initialize the variables somewhere before any of the following. do not use these 
//variables for any other purpose other than the refresh routines: 
$a==0; 
$b==0; 
//First design code within a function to refresh the database a single iteration. 
fuction refresh(){ 
    insert code here to output database; 
     } 

//Now, call function refresh in a loop at the spot in the code 
//where we want to refresh the database. where $b here is equal to 
//the number of times you want the database to automatically refresh 
//before having to reset the variables to 0. 

$b==1 
while ($b!==$a){ 
     refresh(); 
     $a==$a+1; 
     } 

?> 
Các vấn đề liên quan