2017-06-22 5 views
-1

ユーザーが入札可能な1つのゲーム用のコードを作成しています(オークションなど)。 1分のタイマーがあり、終了すると何らかのアクションが発生します。私は以下のすべての詳細を書きます。PHPが2回実行され、MySQLデータベースに重複レコードが生成される場合

タイマースクリプト:

$auctionTimer = 1; 

$target_time = strtotime('+' . $auctionTimer . 'minutes', strtotime($r1['date'])); 
$current_time = time(); 
$seconds_left = $target_time - $current_time; 
$minutes_left = floor($seconds_left/60); 

if (strlen($minutes_left) != 2) { 
    $minutes_left = sprintf("%02d", $minutes_left); 
} 

$seconds_left -= $minutes_left * 60; 
$seconds_left = floor($seconds_left); 

if (strlen($seconds_left) != 2) { 
    $seconds_left = sprintf("%02d", $seconds_left); 
} 

何かがif ($current_time > $target_time && $ragr1['count'] >= 1) {チェックと悪いです:私はこの問題はSQL話ではありませんので、私はPDOクエリを投稿してはならないと思います

$stmt1 = $pdo->prepare("SELECT id, user_id, user, bid, date FROM 
    tb_auction_bids ORDER BY id DESC"); 
$stmt1_while = $pdo->prepare("SELECT id, user_id, user, bid, date FROM 
    tb_auction_bids"); 
$stmt3 = $pdo->prepare("SELECT id, user_id FROM tb_auction_winners ORDER BY 
    id DESC LIMIT 1"); 
$stmt6 = $pdo->prepare("UPDATE tb_users SET money = money + :win WHERE id = 
    :user_id"); 
$stmt9 = $pdo->prepare("INSERT INTO tb_auction_winners (user_id, user, win) 
    VALUES (:user_id, :user, :win)"); 
$stmt11 = $pdo->prepare("SELECT id, user_id, user FROM tb_auction_bids ORDER 
    BY id DESC LIMIT 1"); 
$stmt12 = $pdo->prepare("TRUNCATE TABLE tb_auction_bids"); 

$agr1 = $pdo->prepare("SELECT COUNT(id) AS count FROM tb_auction_bids"); 
$agr2 = $pdo->prepare("SELECT SUM(bid) AS sum FROM tb_auction_bids"); 


$stmt1->execute(); 
$stmt1_while->execute(); 
$stmt3->execute(); 
$stmt11->execute(); 

$agr1->execute(); 
$agr2->execute(); 

$r1 = $stmt1->fetch(PDO::FETCH_ASSOC); 
$r3 = $stmt3->fetch(PDO::FETCH_ASSOC); 
$r11 = $stmt11->fetch(PDO::FETCH_ASSOC); 

$ragr1 = $agr1->fetch(PDO::FETCH_ASSOC); 
$ragr2 = $agr2->fetch(PDO::FETCH_ASSOC); 

if ($current_time > $target_time && $ragr1['count'] >= 1) { 
    $stmt9->execute(array(
    ':user_id' => $r11['user_id'], 
    ':user' => $r11['user'], 
    ':win' => $ragr2['sum'] 
)); 
    $stmt6->execute(array(
    ':win' => $ragr2['sum'], 
    ':user_id' => $r1['user_id'] 
)); 
    while ($r1 = $stmt1_while->fetch(PDO::FETCH_ASSOC)) { 
    $stmt7->execute(array(
     ':user_id' => $r1['user_id'], 
     ':aukciono_id' => $r3['id'], 
     ':user' => $r1['user'], 
     ':date' => $r1['date'], 
     ':bid' => $r1['bid'] 
    )); 
    } 
    $stmt12->execute(); 
} 

、それはPHPについてです。このページ(... /オークションなど)にいない場合、1分タイマーが終了すると、何もしません。報酬を得るなど、オークションに再度行く必要があります。 JavaScriptを使用してタイマーが終了したことを確認し、ファイルを実行する必要がありますか?また https://www.youtube.com/watch?v=_CZcnd3RTNw

":整合性制約違反:1048列 'ポスト' はNULLにすることはできませんSQLSTATE [23000]"、私が手に:それは(ビデオ)どのように見えるか

はこれがありますエラーと私はこのスレッドを見て: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'post' cannot be null

しかし、それは役に立たなかった。 $r1['aukciono_id']は別の変数としても定義されていますが、$r1['aukciono_id']のみがエラーを示します。

if ($current_time > $target_time && $ragr1['count'] >= 1) {は1回だけ実行する必要がありますが、2回実行され、重複するMySQLレコードが生成されます。多分それはそのPDOエラーのためでしょうか?誰かが私を助けてくれますか?

+1

あなたのクエリには '$ stmt9'はありません。 –

+1

も ​​'$ stmt6' –

+0

申し訳ありません、私の質問を編集しました。 –

答えて

0

私は自分自身で問題を理解しました:)あなたのアイデアをありがとう、問題はwhileループであった。代わりに別のクエリを使用する必要があります。

だから、私が追加:

$stmt7 = $pdo->prepare("INSERT INTO tb_aukciono_istorija (user_id, 
    aukciono_id, user, date, bid) SELECT user_id, aukciono_id, user, date, bid 
    FROM tb_auction_bids"); 

、代わりのを:コードの

$stmt7->execute(); 

のみ1行:

while ($r1 = $stmt1_while->fetch(PDO::FETCH_ASSOC)) { 
    $stmt7->execute(array(
     ':user_id' => $r1['user_id'], 
     ':aukciono_id' => $r3['id'], 
     ':user' => $r1['user'], 
     ':date' => $r1['date'], 
     ':bid' => $r1['bid'] 
    )); 
} 

、このいずれかを使用します。クール:)

関連する問題