2012-10-26 48 views
1

我想運行一個mysql查詢,選擇所有用戶從一個表中排名從5000到15000的所有用戶。這兩個已被放入變量。讓我把它改成代碼,它會更好地解釋它。從1000到2000 php mysql

$user_rank = 10000 //this is actually a $row[''] pulled from a database 
$rank_above = $user_rank + 5000; 
$rank_below = $user_rank - 5000; 

$fetch_users = mysql_query("SELECT * FROM users WHERE rank = '$rank_below' ?to? '$rank_above'"); 

不過,我也想讓結果的LIMIT 1個隨機結果,所以它僅選擇從用戶表中的一個隨機用戶。我甚至會以正確的方式去做這件事嗎? 非常感謝任何幫助,謝謝。

+0

不要使用字符串插值來建立你的SQL字符串。對於這個問題,不要使用'mysql'模塊。永遠。包括遺留代碼。 (至少使用'mysqli'模塊。) – millimoose

+1

是的,我一直在看,那是舊的還是過時的,還是存在安全問題和跨瀏覽器失誤? – VVV

+0

安全問題。字符串連接/插值是結束SQL注入漏洞的最簡單方法。 **最好的避免它們的方法是使用準備好的查詢和參數替換,而這些'mysql'完全沒有。 (雖然'mysqli'可以,使用['mysqli_bind_param'](http://www.php.net/manual/en/mysqli-stmt.bind-param.php)。)使用'mysql'時可以避免SQL注入使用'mysql_real_escape_string',但IMO更容易記住一致地應用參數綁定,而不是記住用該函數包裝所有用戶輸入。 (後者看起來也很可怕。) – millimoose

回答

2

可以使用BETWEEN子句中的MySQL

$sql = "SELECT * FROM users WHERE rank BETWEEN 5000 AND 15000" 

例子:

$sql = "SELECT * FROM users WHERE rank BETWEEN %d AND %d" 
$sql = sprintf($sql,(int)$rank_above,(int)$rank_below); // sanitize user input 
+0

+1擊敗我! – nickhar

+0

我認爲這適用於變量? BETWEEN'$ upvar'和'$ downvar'假設變量在其中有整串字符串? – VVV

+0

你們中的一個人是否知道這是否比'WHERE rank> = 5000 AND rank <= 15000'更有效?只是想知道...... – pebbo

1

試試這個:

SELECT * FROM users 
WHERE rank BETWEEN $rank_below AND $rank_above 
ORDER BY RAND() 
LIMIT 1; 
+0

啊,我猜你不能要求更準確的! – VVV