2016-12-03 141 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()是一個非常,非常糟糕的隨機數生成器,你永遠不會用這個東西在那裏實際的獎品或獎金就行了。這只是爲了簡單起見。對於一場真正的比賽,你會使用一個密碼安全的隨機數生成器。

相關問題