2011-07-11 3 views
0

リアルタイムループのアーカイブに問題があります。次の反復に行く前に、次の反復に進む前に、最初にstatusの更新(status= 0)をチェックする必要があります。リアルタイムループの問題

ステータスフィールドは、例えば

...どこかに更新されることがあります:

<?php 
$SQL = "SELECT * FROM data WHERE status = 0"; 
$query = $db->prepare($SQL); 
$query->execute(); 

while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
    print_r($row); 
    print("\n\n"); 
    sleep(5); 
} 
?> 

PHPスクリプトは、MySQLのコンソールでは、ループ/実行されている間、私はすぐにやった:

UPDATE data SET status = 1 

ステータスを更新しても、まだすべてのレコードが表示されています。どのようにして問題を解決できますか?

+0

不可能...! 'LIMIT OFFSET、COUNT'で複数のクエリを実行することを検討してください – phant0m

答えて

2

結果セットは1回だけ計算されます。中間更新を表示するには、別のSELECTステートメントを発行する必要があります。

+0

whileループの別のSELECT文? – user622378

+0

少し待ってから変更されたレコードを探す場合は、クエリー/フェッチのサイクル全体をやり直す必要があります。 – awm

+0

$ query-> execute();を追加します。フェッチループでは正常に動作します – user622378

0

あなたが長い間あなたのDBを見てきたwhileループに入ると、返されたものを単に表示するだけです。

+0

はい、私の質問は中間的な更新を見るためにどのように解決できるのか理解しています。 – user622378

+0

が好きで、スーパーセット(表示したいアイテムのID)を取得し、それらをループして、それぞれを再クエリします。いい方法ではありません。これは、あなたが表示した後でも誰かが更新される可能性があることを意味します。あなたはあなたのやり方でそれを行うこともできますが、jqueryを使って定期的に更新することもできます。 – Brian

0

フレッシュデータを取得するたびにデータベースを再クエリーする必要があります。それ以外の場合は、古いフェッチされたデータだけを反復処理します。

<?php 
$SQL = "SELECT * FROM data WHERE status = 0"; 

while (true) { // set the condition you need here (eg: time) 

    // I don't know PDO enough to know if prepare can be executed out of the loop 
    $query = $db->prepare($SQL); 

    // re-query the database to get the new statuses 
    $query->execute(); 

    // process the data 
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
     print_r($row); 
     print("\n\n"); 
    } 

    // sleep when all the row have been processed 
    sleep(5); 
} 
?> 
+0

それは実際に私の要件のために働いていない。それはフェッチループを何度も繰り返すでしょう。私は同時に複数のスクリプトを実行するつもりです。私は$ query-> execute();を入れました。フェッチループでそれが動作するようです。 – user622378