2009-12-18 20 views
3

我在php中創建了一個彩票腳本。我的問題是現在選擇多個贏家。因爲玩家可以在他們的門票上使用相同的號碼。在這裏,我提供了兩個表結構和源代碼。Php彩票問題多贏家問題

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

這些是我在我的數據庫中的兩個表。舉例來說,我們將創建2個用戶,其id爲1和2.那麼發生的情況是,當腳本運行時,它會將lotto_game狀態從'active'更改爲'finished',然後將隨機抽獎號碼添加到每個pick_ *柱。

$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' 

WHERE狀態=「積極」「);

這是不是太硬,我會承認,但是,這是年底纔剛剛開始

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

這是什麼我已經想出了,它似乎真的和一個贏家一起工作,但我不知道從哪裏開始,我嘗試過使用一些數組,但是沒有任何工作,我知道需要做什麼但是無法弄清楚怎麼辦

當我搜索優勝者時,我需要將所有用戶ID都放入數組中。

所以額外的解決方案就是金錢,如果有人對此感到困惑。在門票的狀態其實並不重要,在這裏,但如果你一定要知道它只是確定是否ticket_status是「有效」或「無效」

回答

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

$獲獎者將與所有獲獎者user_ids

數組
+0

此外排序,您應該刪除您正在使用的所有錯誤抑制.. 。在關閉錯誤報告的空結果集上調用mysql_fetch_array是不好的做法,你應該使用如上例中的條件... – eCaroth

+0

謝謝。我將研究條件。 – Jesse

2

我認爲你選擇了錯誤的存儲格式爲你挑選的數字。標準方法是如果選擇數字N,則使用具有第N位設置的二進制值。

考慮這個例子:用戶選擇數字「2 4 5 9 11」。將相應的位設置爲1給出'10100011010',它是十進制的1306.現在樂透選擇「4 7 9 12 13」,它是'1100101001000'== 6472.對兩個值執行按位與操作,並計算在結果:

SELECT BIT_COUNT(1306 & 6472) 

這立即告訴我們用戶有2個正確的選擇。正如容易,您可以選擇「全」獲獎者:

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

或門票通過正確的選秀權的數量

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

請解釋你是如何從編號「2 4 5 9 11」得到'10100011010'什麼是「設置相應的位」? – Shark