我应该使用什么PHP功能?

时间:2016-12-03 23:42:23

标签: php mysql

我有一个mysql数据中的名字列表,我想随机排序以进行体育赛事抽奖。使用以下代码。

<?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子句的问题?

提前致谢...

2 个答案:

答案 0 :(得分:1)

在SQL查询中直接实现该条件不是一个好方法,因为它会变得非常复杂,我建议只使用相同的SQL查询获取结果,当返回行时,$ row,使用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 ) )

答案 1 :(得分: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()是一个非常非常糟糕的随机数生成器,你永远不会将它用于实际奖品或金钱就行的东西。它只是用于简单。对于实际比赛,您将使用加密安全的随机数生成器。