【问题标题】:Php lottery issues multi winner problemsPHP彩票问题多中奖问题
【发布时间】:2009-12-18 22:05:32
【问题描述】:

我在 php.ini 中创建了一个彩票脚本。我现在的问题是选择一个以上的获胜者。因为玩家的门票上可能有相同的号码。这里我提供了两个表结构和源代码。

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 状态从“活动”更改为“完成”,然后将随机彩票号码添加到每个 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 放入一个数组中。

因此,如果有人对此感到困惑,那么额外的decivers就是金钱。票的状态在这里并不重要,但如果你必须知道它只是确定票状态是“有效”还是“无效”

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我认为您为所选号码选择了错误的存储格式。如果选择了数字 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
    

    【讨论】:

    • 请解释一下您是如何从数字“2 4 5 9 11”中得到“10100011010”的,什么是“设置相应位”?
    【解决方案2】:
    $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'];
      }
    }
    

    $winners 将是一个包含所有获胜者 user_ids 的数组

    【讨论】:

    • 此外,您应该删除您正在使用的所有错误抑制...在关闭错误报告的空结果集上调用 mysql_fetch_array 是不好的做法,您应该使用示例中的条件以上...
    • 谢谢。我会研究条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多