2014-01-30 113 views
0

我有一個MySQL聲明是這樣的:PDO bindParam打破的MySQL查詢

SELECT * 
FROM `events_table` 
WHERE `event_category` NOT IN (:category_ids) 

我使用bindParam到$ category_ids綁定到:category_ids。

category_id是一系列逗號分隔的數字,例如, 1,2,8

然而,一旦執行該語句變成

SELECT * 
FROM `table` 
WHERE `event_category` NOT IN ('1,2,8') 

各地的數字,這些報價打破NOT IN功能。

有沒有辦法使用bindParam沒有插入這些引號?它是安全的,以簡單的寫

SELECT * 
FROM `table` 
WHERE `event_category` NOT IN ($category_ids) 
+0

我沒有想到要尋找在(),我是如此固定在不在()。謝謝。 – ColonelPanik

回答

0

嘗試,

$sth->bindParam(':category_ids', $category_ids, PDO::PARAM_INT); 
+0

只要有一個,在列表中,bindParam似乎在其周圍引用引號。例如,如果列表中只有一個數字,它將轉換爲NOT IN(8)。 – ColonelPanik

1

您可以使用此

$category_ids  = array(1, 2, 8); 
    $inQuery = implode(',', array_fill(0, count($category_ids), '?')); 

    $db = new PDO(...); 
    $stmt = $db->prepare(
    'SELECT * 
    FROM table 
     WHERE `event_category` IN (' . $inQuery . ')' 
    ); 

    // bindvalue is 1-indexed, so $k+1 
    foreach ($category_ids as $k => $id) 
    $stmt->bindValue(($k+1), $id); 

    $stmt->execute(); 
+0

你從http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition? 我一直希望我錯過了一個正確的方法來做到這一點。 – ColonelPanik