2012-08-30 24 views
0

我正在爲一個站點構建動態新聞應用程序。新聞將被分解成可能包含子類別(可能包含子類別)和新聞文章的類別。我創建了一個遞歸函數來返回某個類別的所有子類別的所有類別ID。我想運行一個查詢來獲取遞歸函數返回的集合中的所有新聞帖子。在使用MYSQL IN()函數時遇到問題

當我嘗試使用這個(我使用PEAR DB)

//$myReturnedIDs is a comma delimited list of ids. 5,6,7,8,10,12 

$oPrep = $oConn->prepare("SELECT NewsID FROM SiteNews WHERE NewsCategory IN (?)"); 

$oRes = $oConn->execute($oPrep, array($myReturnedIDs)); 

結果查詢是這樣的:

SELECT NewsID FROM SiteNews WHERE NewsCategory IN('5,6,7,8,10,12') 

,而我需要它看起來像:

SELECT NewsID FROM SiteNews WHERE NewsCategory IN(5,6,7,8,10,12) 

現在,我意識到我可以在prepare語句中填充查詢的那一部分,但我覺得這會導致一些可能的結果一個攻擊的漏洞。我是否過於謹慎,因爲數據不是用戶生成的?有什麼方法可以使這項工作?我的另一個想法是添加一個?對於每個ID,金額將在準備聲明之前(在獲得所有ID之後)確定,但對我來說感覺笨重。有什麼建議麼?

+0

可能重複[PHP的PDO:我可以綁定一個數組到IN()條件?](http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-條件) – 2012-08-30 00:17:22

回答

0

我在猜測$myReturnedIDs是逗號分隔的字符串。所以這樣的:

array($myReturnedIDs) 

產生一個元素的數組:

["5,6,7,8,10,12"] 

如果是這樣的話,那麼你要使用explode讓你想要的數組:

$oRes = $oConn->execute($oPrep, explode(",", $myReturnedIDs)); 

希望這有幫助!

+0

使用PEAR執行時,準備語句中的參數數量必須等於參數數組的數量。這會導致不匹配錯誤。 –

+0

@MichaelWheeler - 我想我誤解了'execute'的論點。嘗試使用'array(explode(「,」,$ myReturnedIDs))'代替。如果這有效,我也會在我的答案中解決它。乾杯! –

+0

我仍然遇到不匹配錯誤。我看通過http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition,因爲它似乎我的問題是重複的。 –