2013-09-25 54 views
0

有一個問題給大家...MYSQL按數組搜索

什麼是最好的方式來搜索我的表的數組,有一個數組在表中。

EG:

$var = (1,4,7,9,14) 

$Query = "SELECT * FROM business_listings WHERE category IN ($var)"; 

'category'將有4,27,89,101

我怎樣才能得到這個匹配,如果在$var中的一個號碼匹配表中的號碼之一。

+0

這不適合你嗎? –

+0

使用php數組我相信你需要使用逗號作爲delimeters的join()方法 –

+0

聲音像你有一個反規範化的問題,你應該正常化... –

回答

0

如果您的數據庫列是逗號分隔值列表,並且您在該列表中搜索一個值,那麼您處於不同的情況。

如果您category列包含文本值410,406,149,152,就像你在下面的評論,你正在尋找其category包含152領域,那麼你就需要使用MySQL的FIND_IN_SET() function

如果您必須檢查多個值,那麼您需要使用多個FIND_IN_SET。如果您閱讀文檔,您會看到FIND_IN_SET的第一個參數必須是單個字符串,而不是字符串列表(不能包含逗號)。改用以下內容:

$var = "401,320,152"; 
$items = explode(",", $var); 
foreach ($items as &$i) { 
    $i = "FIND_IN_SET('" . $i . "', `category`)"; 
} 
$search = implode(" OR ", $items); 
unset($i); 
$query = "SELECT * FROM business_listings WHERE " . $items; 

這將輸出:

SELECT * FROM business_listings WHERE 
    FIND_IN_SET('401', `category`) OR 
    FIND_IN_SET('320', `category`) OR 
    FIND_IN_SET('152', `category`) 

以上腳本將工作,即使$var僅包含一個值。

最後,tadman提到的,因爲我們進入的查詢可能會非常棘手建立與預處理語句,你需要確保你escaping and sanitizing your input properly。舉個例子,如果$var正在從某種程度上用戶檢索,然後你以任何方式修改它之前,你需要mysqli_real_escape_string()逃吧:

$var = $mysqli->real_escape_string($var); 

假設$mysqli是你開的MySQLi連接。

希望這會有所幫助!

+0

所以我的$ var現在讀取'152' 我的表讀取410,406,149,152 但它只適用於152是第一個數字。它看起來像它只看表中的第一個數字,而不是其他 如果$ var = 410它的工作 如果$ var = 152它不起作用 – lithiumdesign

+1

啊!我想我誤解了你想要做的事情。看我的編輯。 – theftprevention

+0

如果您要使用字符串連接撰寫查詢,請**正確地轉義**任何內容。這是一個不好的模式。 – tadman