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 に答える