2017-06-22 1 views
-1

J'écris un petit morceau de code pour le jeu où les utilisateurs peuvent enchérir et la plus grande enchère gagne le tour (comme la vente aux enchères). Il y a une minuterie d'une minute et quand elle se termine, certaines actions se produisent. Je vais écrire tous les détails ci-dessous.PHP s'il exécute deux fois et génère des enregistrements en double à la base de données MySQL

script Timer:

$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); 
} 

Quelque chose est mauvais avec le if ($current_time > $target_time && $ragr1['count'] >= 1) { chèque:

$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(); 
} 

Je suppose que je ne devrais pas poster des requêtes PDO parce que le problème est pas SQL, il est sur PHP. Si vous ne vous trouvez pas sur cette page (.../enchère, par exemple), lorsque la minuterie d'une minute se termine, elle ne fait rien du tout. Vous devez retourner à la .../enchère, par exemple, pour obtenir une récompense. Dois-je utiliser JavaScript pour vérifier si la minuterie s'est terminée et ensuite exécuter le fichier?

Voici comment il ressemble (vidéo): https://www.youtube.com/watch?v=_CZcnd3RTNw

Aussi, je reçois

"SQLSTATE [23000]: Intégrité violation de contrainte: 1048 Colonne 'post' ne peut pas être nulle" erreur et je regardais dans ce fil: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'post' cannot be null

mais il n'a pas aidé. Le $r1['aukciono_id'] est défini également comme une autre variable mais seul le $r1['aukciono_id'] donne une erreur.

if ($current_time > $target_time && $ragr1['count'] >= 1) { ne doit s'exécuter qu'une seule fois mais il s'exécute deux fois et génère des enregistrements MySQL en double. Peut-être que c'est à cause de cette erreur PDO? Quelqu'un peut-il m'aider, s'il vous plaît?

+1

Il n'y a pas de '$ stmt9' dans votre requête. –

+1

ni '$ stmt6' –

+0

Désolé, édité ma question. –

Répondre

0

J'ai trouvé le problème moi-même :) Merci pour vos idées, le problème était avec la boucle while. Je devrais utiliser une autre requête à la place.

Alors, j'ai ajouté:

$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"); 

Et au lieu de:

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'] 
    )); 
} 

Utilisez celui-ci:

$stmt7->execute(); 

Une seule ligne de code. Cool :)