2009-12-18 8 views
3

J'ai créé un script de loterie en PHP. Mon problème est maintenant de sélectionner plus d'un gagnant. Parce qu'il est possible pour les joueurs d'avoir le même numéro sur leurs tickets. Ici, je fournis les deux structures de table et le code source.Problèmes de loterie PHP plusieurs problèmes gagnant

lotto_game { 
    id(int) 
    jackpot(int) 
    status(varchar10) 
    pick_1(int) 
    pick_2(int) 
    pick_3(int) 
    pick_4(int) 
    pick_5(int) 
    tickets_sold(int) 
    winner(text) 
} 

lotto_picks { 
    lotto_id(int) 
    user_id(int) 
    choice_1(int) 
    choice_2(int) 
    choice_3(int) 
    choice_4(int) 
    choice_5(int) 
    ticket_status(int) 
} 

Ce sont mes deux tables avec dans ma base de données. Par exemple, nous allons créer 2 utilisateurs avec les ID 1 et 2. Donc, quand le script s'exécute, il est supposé changer le statut de lotto_game de 'actif' à 'fini' puis ajouter les numéros de loterie aléatoires dans chaque sélection_ * colonne.

$one = rand(1,30); 
$two = rand(1,30); 
$three = rand(1,30); 
$four = rand(1,30); 
$five = rand(1,30); 

mysql_query("UPDATE `lotto_game` SET 
pick_1 = '$one', 
pick_2 = '$two', 
pick_3 = '$three', 
pick_4 = '$four', 
pick_5 = '$five', 
status = 'finished' 

où le statut = « actif » ");..

Ce n'était pas trop dur, je dois admettre Mais cela est juste le début de la fin

$lotto['tickets'] = mysql_query("SELECT ticket_id FROM `lotto_picks` WHERE ticket_status='valid'"); 

@$lotto[winners] = mysql_query("SELECT ticket_id,user_id FROM `lotto_picks` WHERE choice_1 = '$one' AND choice_2 = '$two' AND choice_3 = '$three' AND choice_4 = '$four' AND choice_5 = '$five'"); 

$lotto['num_tickets'] = mysql_num_rows($lotto['tickets']); 
@$lotto[winner_id] = mysql_fetch_array(@$lotto[winners]); 
$lotto['jackpot'] = mysql_query("SELECT jackpot FROM `lotto_game` WHERE status='active'"); 

$lotto['winner_jackpot'] = mysql_fetch_array($lotto['jackpot']); 
$lotto['num_winners'] = mysql_num_rows($lotto['winners']); 
//echo @$lotto['num_tickets']; 
//echo @$lotto['num_winners']; 
$winner = $lotto['num_winners']; 
//echo @$lotto['winner_id']['user_id']; 
$jackpot = $lotto['winner_jackpot']['jackpot']; 
$id = @$lotto[winner_id][user_id]; 
if ($winner == 1) { 
    mysql_query("UPDATE `character` SET 
    decivers = decivers +'$jackpot' 
WHERE user_id='$id'"); 
} 

C'est ce que Je suis venu avec et il semble vraiment fonctionner avec un gagnant.Mais je ne peux pas savoir où aller d'ici.J'ai essayé d'utiliser des tableaux mais rien ne fonctionne.Je sais ce qui doit être fait, mais ne peux pas comprendre comment le faire

Lorsque je cherche des gagnants, je dois mettre dans un tableau tous leurs identifiants.

donc des décombres supplémentaires est de l'argent, si quelqu'un est confus à ce sujet. Le statut sur les billets ne compte pas vraiment ici, mais si vous devez savoir juste détermine si le ticket_status est « valide » ou « invalide »

Répondre

1
$winners_array = array(); 
if(mysql_num_rows($lotto['winners'])!=0){ 
    while($row =mysql_fetch_array($lotto['winners'])){ 
    if(!in_array($row['user_id'],$winners)) $winners[] = $row['user_id']; 
    } 
} 

gagnants $ seront un tableau avec tous les gagnants user_ids

+0

De plus, vous devez supprimer toute la suppression d'erreur que vous utilisez .. L'appel de mysql_fetch_array sur un ensemble de résultats vide avec un rapport d'erreurs désactivé est une mauvaise pratique, vous devriez utiliser des conditions comme dans l'exemple ci-dessus ... – eCaroth

+0

Merci. Je vais regarder dans les conditions. – Jesse

2

Je pense que vous avez choisi les mauvais formats de stockage pour vos numéros choisis. L'approche standard consiste à utiliser des valeurs binaires dont le bit N est défini si le nombre N est choisi.

Considérons cet exemple: l'utilisateur choisit les nombres "2 4 5 9 11". La définition des bits correspondants à 1 donne '10100011010' qui est le nombre décimal 1306. Maintenant, la loterie choisit "4 7 9 12 13" qui est '1100101001000' == 6472. Effectuer un AND bit à bit sur les deux valeurs et compter le nombre de bits résultat:

SELECT BIT_COUNT(1306 & 6472) 

cela nous indique immédiatement que l'utilisateur a 2 choix corrects. Aussi facile que vous pouvez sélectionner « complet » gagnants:

SELECT * FROM tickets WHERE BIT_COUNT(tickets.pick & lotto.pick) = 5 

ou trier les billets par le nombre de bons pronostics

SELECT * FROM tickets ORDER BY BIT_COUNT(tickets.pick & lotto.pick) DESC 
+0

Veuillez expliquer comment avez-vous obtenu '10100011010' à partir du numéro "2 4 5 9 11" qu'est-ce que "Réglage des bits correspondants"? – Shark