PDO bindParam打破了mySQL查询

时间:2014-01-30 20:46:18

标签: php mysql pdo

我有一个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)

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

试,

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