2011-12-03 63 views
3

私は友人のためのソーシャルネットワーキングサイトを作っています。私は、新しいレコードがデータベースに追加されたときに、データベースの挿入されたレコードをほとんど含まないDivを更新する方法を知りたいと思っていました。要するに、あなたが何かをしたときにフェードインするFacebookのライブ通知を見たに違いありません。これは、すべてのライブ通知のdivを更新することなく行われます。新しい通知のみがdivの前に追加されます。新しいレコードがMySqlデータベースに追加されたときにJqueryで自動的にDivを更新する

jqueryとAJAXを使って、私はそれらについてよく知っているので、これをしたいと思います。 PHPをサーバー側言語として使用します。

ありがとうございました。

P.S:私は解決策について多くのWebサイトを検索しましたが、どこでも見つけることができませんでした。私もfacebookのソースコードを通過しようとしましたが、couldntもそこにそれを見つける!誰かが私を助けてくれることを願っています* はあなたがPHPのページにアクセスするためにjQueryの$.getJSON()メソッドを使用することができ、指 *

+1

あなたはhttp://dailyjs.com/2010/08/17/polling/のようなものを探しています。 – Treffynnon

+0

[これに関する良いWikipediaのページ](http://en.wikipedia.org/wiki/Comet%5F%28programming%29)があります。 –

+0

いいえ!私はちょうど新しいレコードがデータベースに追加されたときに簡単なjqueryのdivの更新をしたい。リフレッシュは1回だけ行う必要があります。 – Samir

答えて

2

read列を変更します。

phpページにajax呼び出し(jqueryまたはネイティブxhrを使用するかどうか)を行うJavaScript関数をページ上に作成します。 PHPページは「新しいもの」を追跡し、呼び出されたときにそれを返します。 js関数は、データを受け取ると、新しいタグ(divなど)を通知バーに追加します。この関数はjavascriptのsetTimeout関数を使って毎回呼び出されます。

これらの手順のいくつかが混乱している場合は、さらに具体的な質問をしてください。

+0

私はあなたの答えを理解しました。私はPHPファイルを作る場合。データベースに新しく追加されたアイテムだけを選択するクエリをどのように送信すればよいですか? – Samir

+0

「新しく​​追加された」アイテムを判断する要素が分かっている場合は、それらを選択してJSONとして返すだけです。何が新しくなったのかを判断するために、クライアントが最後にアイテムを要求したときを知る必要がある場合は、リクエストとともにタイムスタンプをPHPページに送信する必要があります。 phpページは 'select * where something>?'のようなクエリを実行し、その結果をJSONとしてフォーマットします。 –

+0

これはもっと効果があるようです。ありがとう:) – Samir

1

を渡りました。このPHPページは未読の通知をすべて取得します(通知表に「read」という列を追加し、未読の場合は0、未読の場合は1に設定してJSONフィードとして返します)。

JSONを解析し、各ページをページに表示するdivにします。そして、これをすべてsetInterval()にラップし、ミリ秒ごとに実行します(半分の秒、または1/4秒です。それはあなた次第です)。

また、それらを読み取り済みとしてマークするには、JSON通知フィードから作成したdivのclickイベントを設定します。クリックで、それは別のPHPページに連絡します例えば、通知のidを受け取ることになります(あなたは$.post$.getを使用することができます)、そして基本的にはこのような何かを行く1

+0

ですが、誰かがクリックしない限り、そのPHPファイルはすべてのリフレッシュ時にそれらの通知をリフレッシュするでしょう。 – Samir

+0

正確です。つまり、彼らは未読です。もちろん、一度だけ行うように変更することもできます...データベースから最初に検索される「表示済み」という別の列を1に追加できます。 – Purag

3

ポストが更新されたという通知を送るにはAjaxプッシュを使用するか、プッシュ駆動にすることができます。 PHPを使ってjqueryとAjaxをすでに知っているのであれば、後者のほうが簡単かもしれません。

間隔で新しいレコードが定期的に確認されます(たとえば、setIntervalを使用)。見つかった場合は、それらをDOMにロードしてフェードインします。間隔はあまり小さくなくても、リソースを無駄にする必要はありません。 30秒ごとに何かが行われる限り、おそらく何か。

setInterval('checkForUpdates', 30000); 
var lastTime = (new Date()).getTime(); 
function checkForUpdates() { 
    $.get('/php-page-that-checks-for-updates.php?timestamp=' . lastTime 
     , function (results) { 
     if (results) { /* fade into dom */ } 
     } 
    ); 
    lastTime = (new Date()).getTime(); 
} 

PHPページ:

$timestamp = $_REQUEST['timestamp']; 
$results = query('SELECT post FROM posts WHERE postTime > "$timestamp"'); 
echo fetch($results); 

他の人が示唆したように、あなたは「読み」、代わりにタイムスタンプの指標としてそれを使用し、またしてタイムゾーンの問題を解決しますどのようにポストをもマークすることができます私の例。私はこれを行うために余分な列を追加したくないでしょうが、あなたが既に他の理由でそれを持っていれば良いアイデアでしょう。

編集:これはかなり古い回答ですが、まだそれを行うことができれば、私はどのような種類のajax long pollingではなくWebSocketsを使用します。私はPHPが素晴らしい言語だとは思わない(Node.jsでsocket.ioを使うことをお勧めします)が、これは可能です。

+0

私は前に言ったように '読み込み'方法を使っています。誰かがそれをクリックしない限り、それは爽やかに保たれます。より正確には。 Facebookのホームページは、ページをリフレッシュすることなく、誰かの新しいステータスにフェードインします。ページを更新せずに新しいコメントが表示されます。 – Samir

+0

私のコードは決してページをリフレッシュしません。 –

+0

私は理解しています:)しかし、それは 'read'が '0'である通知で30秒ごとにそれぞれのdivを更新し続けます:)。どのような方法で私はポイントを得た。私はそれを試します:)あなたに感謝:) – Samir

関連する問題