2009-09-29 44 views
0

我試圖建立使用PHP和MySQL查詢內容的SQL查詢,介紹如何使用的變量

$query = "select * from products where product_name = '$item_name'"; 

這個工程時$ ITEM_NAME認爲只有一個名字,而是$ ITEM_NAME是數組和基於用戶的交互可以包含多個名稱,我怎樣才能使查詢運行多個名稱並獲取結果行。

在此先感謝

回答

6

這裏是你如何可以建立名稱的安全列表插入IN子句...

if (is_array($names) && count($names)) 
{ 
    $filter="('".implode("','" array_map('mysql_real_escape_string', $names))."')"; 
    $sql="select * from products where product_name in $filter"; 

    //go fetch the results 
} 
else 
{ 
    //input was empty or not an array - you might want to throw an 
    //an error, or show 'no results' 
} 

array_map在通過mysql_real_escape_string運行每個名稱以清理它之後返回名稱的輸入數組。我們使用這個數組來創建一個好的列表來使用IN子句。

您應該始終確保任何數據(特別是直接來自客戶端的數據)在查詢中正確轉義以防止SQL injection攻擊。

+0

+1,最後一個完整的解決方案。 ;-) – 2009-09-29 13:34:07

+0

爲了讓它更具啓發性,我建議使用'else'從而避免意外;-) – 2009-09-29 13:47:24

+0

好點,完成! – 2009-09-29 14:11:05

3
$vals = implode(',',$item_name); 
$query = "select * from products where product_name in (".$vals.");"; 

給一個嘗試。

+2

應該是$瓦爾斯= ' 「' .implode( ' 」「',$ ITEM_NAME)。」';爲了有引用值 – Eineki 2009-09-29 13:31:31

+1

+1,但是,鴿子,是正確的消毒數據將是非常有益的。 – 2009-09-29 13:31:41

+1

這不是一個如何構建查詢的好例子 - 對數據進行santizing應該永遠不會被事後考慮,甚至從有啓發性的例子中刪除,以使它們更清晰。 – 2009-09-29 13:42:07

-1
foreach($item_name as $name) { 
$query = "select * from products where product_name = '$name'"; 
//whatever you want to do with the query here 
} 

這樣的事情應該這樣做。

+1

這是一個效率低下的解決方案,因爲它需要數組中每個元素的數據庫的往返行程。我的解決方案一舉成功。 – inkedmn 2009-09-29 13:30:15

+0

嗯,真的......愚蠢的回答:-p – user97410 2009-09-29 13:43:45

0
$query = "select * from products where product_name in("; 
foreach($item_name as $name) 
{ 
    $query .= "'" . $item_name . "', "; 
} 

$query = substr($query, 0, strlen$query) - 2); 
$query .= ");"; 

第一個答案(由inkedmn)真的是最好的一個,雖然

+0

你有一個很好的機會逃離這裏的字符串;-)然後關閉')'。 – 2009-09-29 13:32:38

+0

是的,不是列表中的最佳答案。 – Natrium 2009-09-29 13:34:44

-1

基於inkedmn的迴應(這並沒有引述的項目名稱):

$query = 'select * from products where product_name in ("' . implode('", "', $item_name) . '")'; 

儘管你可以使用一個全文搜索更好。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

+0

太多雙引號 – Natrium 2009-09-29 13:44:42

+0

太多雙引號?你什麼意思?它會變成這樣:'select * from product_name in(「shoes」,「shirts」,「hats」)' – voidstate 2009-09-29 14:38:06