2009-12-18 19 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