2012-06-10 24 views
2

有一個POST請求將一組用戶ID傳遞給PHP腳本。此集合正在與'user_table'中的現有ID進行比較。MySQL - 高效地交叉引用一組ID

這是通過將一個ID數組連接到一個字符串中實現的,並且在查詢中直接使用由逗號分隔的id的結果字符串。

我擔心這不會很好地擴展,並可能是一場災難!任何人都可以分享一些關於這種問題的傳統方法的智慧嗎?

$id_json_array = postVar('u'); 
$user_ids = json_decode($id_json_array); 
$str_ids = join(',', $user_ids); 

$result = mysql_query(
    "SELECT u.user_id AS i 
      , u.user_name AS u 
    FROM user_table u 
    WHERE u.user_id IN ($str_ids)" 
) or die (mysql_error()); 

的ID陣列將可能幾千,而「USER_TABLE」大(幾萬或幾十萬,索引等)

在此先感謝。

+1

到目前爲止,您最*的問題是SQL注入的風險!你真的應該使用[prepared statements](http://stackoverflow.com/a/60496/623041),將你的變量作爲參數傳遞給它,而這些參數不會被SQL評估。如果你不知道我在說什麼,或者如何解決它,請閱讀[Bobby Tables]的故事(http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) 。 – eggyal

+0

另外,請停止使用古老的MySQL擴展來編寫新代碼:它不再被維護,並且社區已經開始[棄用過程](http://news.php.net/php.internals/53799);您可以使用改進的[MySQLi](http://php.net/mysqli)擴展或[PDO](http://php.net/pdo)抽象層。 – eggyal

+0

儘管代碼中其他地方正在對輸入進行消毒,但我同意使用準備好的語句是最佳做法。 – pjama

回答

1

只要user_id被索引,我在這裏看到沒有問題。

在一個類似的例子中,我曾經構建過一個臨時的MEMORY表,它包含了你的$str_ids的內容,並且與這個臨時表進行了聯接。對於這一招的原因是:

  • (主要原因)名單是相當大的,我怕我會打在查詢legth一些限制
  • (側原因),我不得不使用這個列表中的一些在我的腳本過程中的時間

構建(也許索引)這樣的臨時表的開銷可能會或可能不會抵消使用它的可能的好處。在我的情況下,它沒有。

編輯:哦,this thread提出了一個優雅的選擇,如果你事先知道你的列表中的元素的最大數量。