2013-01-19 91 views
0

我想創建一個從MySQL數據庫中選擇一個隨機記錄的PHP頁面(一個字符串,它將用作唯一的「標記」)。我只想選擇這個隨機記錄一次,之後再也不會。如何從數據庫中只選擇一次隨機記錄一次

爲了做到這一點,我在表中添加了一個額外的字段(名爲'numberfield',其中包含數字0),該字段在選擇特定記錄時遞增。這樣,只能選擇號碼字段表字段中值爲0的記錄。只要選擇了隨機記錄,數字段字段就會增加到1,不能再選擇。我正在考慮使用以下PHP代碼:

$result = mysql_query("SELECT token FROM table WHERE numberfield < **1** ORDER BY RAND() LIMIT 0,1"); 

if (!$result) { 
    echo 'Could not run query: ' . mysql_error(); 
    exit; 
} 

$row = mysql_fetch_row($result); 
echo $row[0]; 
mysql_query("UPDATE table SET numberfield=numberfield+1 WHERE token=" + $row[0] + ""); 

這是正確的方法嗎?有什麼想法嗎 ?

此外,我想避免不同的隨機記錄被選中在頁面刷新。將「標記」保存在緩存中的正確且最簡單的方法是什麼?例如,是否可以將「標記」保留在頁面刷新期間不會被覆蓋的會話中,或者是否必須使用其他技術(如Ajax等)。您的幫助和意見非常感謝!

+0

你的桌子有多大?如果它會變得很大,你可能要考慮不使用'ORDER BY RAND()'。 –

+0

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。 – Kermit

回答

0
  1. 您應該停止使用mysql_函數,因爲它們已被棄用。
  2. 你應該避免在更大的表中使用ORDER BY RAND(),因爲尋找一個隨機數會產生開銷。
  3. 要完成SELECT ... UPDATE,您需要某種鎖定。有一個渺茫的機會,可能是隨機選擇兩次。這可以通過使用存儲過程來防止。
  4. 您可以使用由PHP或其一部分生成的會話標識。 This topic討論了會話ID的唯一性,this topic討論了不同的長度。
  5. 您也可以在PHP端創建一個隨機字符串,以節省連接數據庫的開銷。
+0

偉大的建議!非常感謝您的幫助 –

相關問題