2016-12-03 75 views
-2

我有一个mysql数据中的名称列表,我想随机为一个体育赛事抽签进行排序。使用下面的代码。我应该使用哪些php函数?

<?php 
$user=""; 
$password=""; 
$database=""; 


mysql_connect('localhost',$user,$password); 
@mysql_select_db($database) or die("Unable to select database"); 
$result = mysql_query("SELECT * FROM entries ORDER BY RAND()") 
or die(mysql_error()); 

$rows = mysql_num_rows($result); 

?> 

这通常很适合我不过有次,其中参赛者进入事件两次,即使经过随机排序他的名字出现一个接一个。我应该使用不同的PHP函数吗?或者是添加if子句的问题?

在此先感谢...

+5

如果你正在编写新代码,** _ please _ **不要使用'mysql_ *'函数。它们已经老化并且破损,在PHP 5.5中已经被弃用了(它已经很旧了,它甚至不再接收安全更新),并且在PHP 7中完全删除了。使用PDO或者'mysqli_ *'_with **准备好的语句**和**参数绑定**而不是。有关详细信息,请参阅http://stackoverflow.com/q/12859942/354577。 – Chris

+2

“有时候参赛者进入两次赛事,甚至在随机排序后他的名字会一个接一个地出现”。是的,这是_什么[随机意味着](https://en.wikipedia.org/wiki/Randomness)_:“事件中缺乏模式或可预测性”。有时两个相同的值会彼此相邻。如果这从来没有发生过,你会有一个模式,而不是随机性。 – Chris

+0

你想要的行为是什么?参赛者只能赢得一次吗?他们是否应该只能进入一次?如果他们可以多次进入,这是否会增加他们获奖的机会? – Chris

回答

1

直接实现在SQL查询条件不是很好的方法,因为它会变得非常复杂,我建议简单地用相同的SQL查询获取的结果,当返回的行,$行,您使用PHP array_unique功能,这将删除所有重复的值,这样使用它,

<?php 
    $row_with_no_duplicates = array_unique($rows) 
?> 

希望这有助于该功能的工作原理

例如:

<?php 
    $input = array("a" => "green", "red", "b" => "green", "blue", "red"); 
    $result = array_unique($input); 
    print_r($result); 
?> 

输出:

Array 
(
    [a] => green 
    [0] => red 
    [1] => blue 
) 

,如果你想保留副本,然后

$input = array("a" => "green", "red", "b" => "green", "blue", "red"); 
$unique = array_unique($input); // creating a unique array 
$duplicates = array_unique(array_intersect($input, array_unique(array_diff_key($input, array_unique($input))))); // getting duplicates 

array_push($unique, $duplicates); // inserting duplicates at the end 

print_r($unique); 

输出:

Array ([a] => green [0] => red [1] => blue [3] => Array ([a] => green [0] => red)) 
+0

谢谢塔哈。有没有办法将重复的绿色和红色放在列表的最后? – user2432677

1

有一点要考虑的是你的随机约束选择。如果你需要排除已经获胜的人,那么你需要记录谁赢了,并以某种方式将其添加到WHERE条款。考虑以下方案:

CREATE TABLE tickets (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    user_id INT NOT NULL, 
    winner INT(1) DEFAULT 0 
) 

然后你就可以生成许多门票和填充数据库。 user_id代表潜在赢家的数字ID。这意味着你可以很容易地排除前获奖者:

SELECT id FROM tickets WHERE winner=0 AND user_id NOT IN (
    SELECT user_id FROM tickets WHERE winner=1 
) ORDER BY RAND() 

现在记住RAND()是一个非常,非常糟糕的随机数生成器,你永远不会用这个东西在那里实际的奖品或奖金就行了。这只是为了简单起见。对于一场真正的比赛,你会使用一个密码安全的随机数生成器。