2014-03-28 27 views
0

我只是想知道,有没有什么办法来选择使用PDO bindValue不在数组中的数据。 我的主要目的是防止SQL注入。SELECT不检索数据使用PDO bindValue

我的查询是这样的:

$array_name = array('George', 'Bob', 'Stephanie', 'Erica'); 

$query = $PDO -> prepare("SELECT id FROM table WHERE name NOT IN (:array_name)") 
$query->bindValue(':array_name', implode(",",$array_name), PDO::PARAM_STR); 

我试过上面的代码,但它无法正常工作。

+0

你可以写错误信息或日志吗? – Anri

+0

它没有显示任何错误。但它也没有返回任何数据。 – Bono

+0

尝试var_dump($查询) – Anri

回答

1

PDO不支持绑定就像一个数组,但你可以做什么是动态创建的字符串中的占位符:

$placeholderStr = str_repeat('?, ', count($array_name)-1) . '?'; 
$query = $PDO -> prepare("SELECT id FROM table WHERE name NOT IN ($placeholderStr)"); 
$query->execute($array_name); 

另外,您可以使用具有此功能内置在库中,这样的如Doctrine2 DBAL

+0

这是SQL注入安全吗? – Bono

+0

是的,您可以获得准备好的声明的所有好处,就像您对占位符进行硬编码一样。数组的内容不会进入SQL本身,只有占位符。 – MrCode

+0

我更喜欢使用'join(',',array_fill(1,count($ array_name),'?'))''因为越少错误的机会越少,并且您不必处理最后一个元素不同。 –