数组内嵌逗号并与SQL“IN”一起使用

时间:2012-08-22 02:44:34

标签: php sql arrays implode

为什么此PDO查询无法正常工作?

$colors = $_GET['color'];
$colors = explode(' ', $colors);
$colors = implode(',',$colors);
$items = $con -> prepare("SELECT * FROM item_descr WHERE color_base1 IN (".$colors.")");
$items ->execute();
while($info = $items->fetch(PDO::FETCH_ASSOC)) 
{
echo $info['color_base1'];
}

3 个答案:

答案 0 :(得分:3)

如果处理字符串,则需要使用引号转义$colors项以符合IN()语句:

SELECT * FROM item_descr WHERE color_base1 IN ('blue', 'yellow', '#FF0000')

可能您的$color变量只是逗号分隔 - 添加引号。

顺便说一句,在运行查询后使用PDO::errorInfo来检查MySQL错误:

var_dump($con -> errorInfo());

它将显示如下内容:

You have an error in your SQL syntax; [...]

这样您就可以修复查询。

答案 1 :(得分:3)

您需要转义$colors,否则您将受到SQL注入攻击。有一个鲜为人知的PHP函数array_fill对此非常有用:

$colors = explode(' ', $_GET['color']));
$parameters = join(', ', array_fill(0, count($colors), '?');
$items = $con->prepare("SELECT * FROM item_descr WHERE color_base1 IN ({$parameters})");
$items ->execute($colors);
while($info = $items->fetch(PDO::FETCH_ASSOC))  {
    echo $info['color_base1'];
}

看来你的问题是你的颜色没有用引号括起来,但是这个问题在我的代码中消失了,因为它使用了绑定参数。

答案 2 :(得分:0)

如果$ colors可以包含字符串,那么您应该使用

function quote_value(& $value, $key) { $value = "'$value'"; }

$colors = $_GET['color'];
$colors = explode(' ', $colors);
array_walk($colors, 'quote_value');
$colors = implode(',',$colors);
// the rest of your code