Php 数组使用逗号内爆,并与SQL';在';

Php 数组使用逗号内爆,并与SQL';在';,php,sql,arrays,implode,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->fe

为什么这个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'];
}

如果要处理字符串,则需要使用引号将
$colors
项转义到()语句中的

SELECT * FROM item_descr WHERE color_base1 IN ('blue', 'yellow', '#FF0000')
可能您的
$color
变量只是逗号分隔的-添加引号

顺便说一下,要在运行查询后检查MySQL错误,请执行以下操作:

var_dump($con -> errorInfo());
它将显示如下内容:

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

因此,您可以修复查询。

如果要处理字符串,则需要使用引号将
$colors
项转义到
中()

SELECT * FROM item_descr WHERE color_base1 IN ('blue', 'yellow', '#FF0000')
可能您的
$color
变量只是逗号分隔的-添加引号

顺便说一下,要在运行查询后检查MySQL错误,请执行以下操作:

var_dump($con -> errorInfo());
它将显示如下内容:

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

因此,您可以修复查询。

如果$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

如果$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

您需要退出
$colors
,否则您将受到SQL注入攻击。有一个鲜为人知的PHP函数
array\u 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'];
}


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

您需要避开
$colors
,否则您将受到SQL注入攻击。有一个鲜为人知的PHP函数
array\u 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'];
}


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

您是否添加了var\u dump或其他内容来验证查询字符串是否符合您的要求?color\u base1的数据类型是什么?字符串还是整数?是否添加了var_dump或其他内容来验证查询字符串是否符合预期?color_base1的数据类型是什么?字符串还是整数?