2013-01-02 45 views
2

我是相當新的PDO,但我遇到了一些可能有一個簡單的答案。PDO mysql查詢像數組值

我有一個類別編號的數組,我需要通過一個mysql數據庫來搜索所有匹配的類別編號的項目。

我知道我已經正確連接到數據庫,因爲我收到來自不同查詢的類別數組。

$category = Array ([0] => 3259 [1] => 3617 [2] => 3257 [3] => 3258 [4] => 3450 [5] => 3452 [6] => 3478 [7] => 3479 [8] => 3480 [9] => 3448 [10] => 3449 [11] => 3451 [12] => 3456 [13] => 3454 [14] => 3455 [15] => 3459 [16] => 3460 [17] => 3458 [18] => 3453 [19] => 3461 [20] => 3462 [21] => 3457 [22] => 3463 [23] => 3447) 

現在我需要通過項目數據庫來檢查匹配的類別。 每個項目可以有多個類別,每個類別都有4個數字。 多個類別單獨用=

$categoryResults = $conn->prepare('SELECT * FROM items WHERE category like :cats ORDER BY promotions,price ASC'); 
$categoryResults->execute(array(':cats' => '%'.$category.'%')); 
$categoryNumber = $categoryResults->rowCount(); 

這是我似乎已經錯了。與MySQL要求我將使用通過數組的循環手動讓我很長的SQL查詢已經建立起來:

'Select * From items WHERE category like '%3259%' OR WHERE category LIKE '%3617%'........etc 

,但我相信這是使用PDO的優點之一。 只需添加到它,我需要的結果是獨一無二的。 如果項目97在類別3259和類別3617我只想得到一次結果。

在此先感謝。

+1

好問題。我個人在$ category數組的循環中使用PDO :: quote來處理這種SQL查詢。 – Adder

回答

1

我發現它是stange,你正在尋找LIKE聲明的號碼。 Isnt category只是該類別的ID或它是如何存儲的?如果category是CSV列表,我建議您修改它以利用單獨的表進行多對多連接。

如果它已經是一個數值,只需使用IN聲明

$categoryResults = $conn->prepare('SELECT * FROM items WHERE category IN (:cats) ORDER BY promotions,price ASC'); 
$categoryResults->execute(array(':cats' => implode(',', $category)); 
$categoryNumber = $categoryResults->rowCount(); 

更新 甚至更​​好,看看這個問題,這是一樣的。

Can I bind an array to an IN() condition?

+0

每個項目可以有很多不同的類別,因此客戶端添加一個項目並選擇該項目以顯示該項目。這可以是他們認爲想要顯示的項目的多個類別,因此項目實際上已將類別保存到數據庫作爲由a = ie分隔的字符串.. 3617 = 3927 = 4125所以使用an =的imploding類別會給我3617 3927 4125.這就是爲什麼我使用通配符的原因。如果我列出類別3927中的所有項目,則會顯示。 –

+2

這就是我用單獨的表而不是CSV(或在你的情況等於分隔列表,而不是逗號分隔列表)。在你的數據庫上使用規範化,那麼你不會遇到這個問題。 http://databases.about.com/od/specificproducts/a/normalization.htm –

+0

謝謝你的回答。我會看看正常化並回來。 –

-1

做這樣

<?php 
$categoryId = array(1, 21, 63, 171); 
$place_holders = implode(',', categoryId); 


$sth = $dbh->prepare("SELECT * FROM items WHERE category in (?) ORDER BY 
         promotions,price ASC"); 
$sth->bindParam(1, $place_holders, PDO::PARAM_STR, 12); 
$sth->execute($params); 

?>