0

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

3 回答 3

3

如果正在处理字符串,您需要$colors使用引号转义项目以适应语句:IN()

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

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

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

var_dump($con -> errorInfo());

它将显示如下内容:

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

所以你可以修复你的查询。

于 2012-08-22T02:57:13.287 回答
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'];
}

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

于 2012-08-22T03:56:43.860 回答
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
于 2012-08-22T03:37:58.190 回答