2016-06-15 183 views
0

我以這種格式在MySQL內部的一個字段中存儲了一些數據:1,5,9,4
我把這個字段命名爲有關。現在我想在IN子句PDO內使用此字段。我將這些字段內容存儲在$related版本中。這是我的下一個代碼:如何使用IN子句使用PDO預處理語句?

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (?) LIMIT 4"; 
$q = $db->prepare($sql); 
$q->execute(array($related)); 
echo $q->rowCount(); 

但這段代碼執行後,而我必須取4條(1,5,9,4),我可以獲取只有一個記錄。我做錯了什麼?

+0

可能重複[FIND \ _IN \ _SET()vs IN()](http://stackoverflow.com/questions/4155873/find-in-set-vs-in) –

+1

常見的路徑是使用關係的額外表格。這是不好的數據庫設計。 –

+0

@GeraldSchneider我知道,這只是我的問題的一個示例。 –

回答

0

您需要儘可能多的?佔位符作爲您的「IN」值。

所以:

$related = array(1,2,3); // your "IN" values 

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN ("; 

$questionmarks = ""; 
for($i=0;$i<count($related);$i++) 
{ 
    $questionmarks .= "?,"; 
} 

$sql .= trim($questionmarks,","); 
$sql .= ") LIMIT 3;"; 

// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3; 

$q = $db->prepare($sql); 
$q->execute($related); // edited this line no need to array($related), since $related is already an array 
echo $q->rowCount(); 

https://3v4l.org/No4h1

(如果你還想要4個返回記錄擺脫LIMIT 3

更優雅,你可以使用str_repeat追加你的佔位符這樣的:

$related = array(1,2,3); // your "IN" values 

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN ("; 
$sql .= trim(str_repeat("?,",count($related)),","); 
$sql .= ") LIMIT 3;"; 

// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3; 

$q = $db->prepare($sql); 
$q->execute($related); // edited this line no need to array($related), since $related is already an array 
echo $q->rowCount(); 

https://3v4l.org/qot2k

而且,通過再次閱讀你的問題,我可以$related變量只是一個string與像1,40,6,99值逗號分隔的數字。如果是這種情況,您需要將其設爲array。做:$related = explode($related,",");使它成爲一個數組數組。然後在您的execute方法中按原樣傳遞$related