FOREACH在每次迭代时都没有准备PDO语句

时间:2012-08-21 15:57:11

标签: php sql foreach pdo

我正在尝试使用PDO运行FOREACH,但到目前为止,我的代码似乎只为FOREACH迭代一次并且只返回第一个值。

这就是我所拥有的:

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

请注意,$ colors包含从复选框和jquery获得的多种不同颜色。

谢谢!

3 个答案:

答案 0 :(得分:3)

您的代码嵌套错误:您想要准备一次查询,并多次执行它,但您正在做相反的事情。

而不是:

foreach ( ... )
{
    prepare( ... );
    bind( ... );
}
execute();

你需要:

prepare( ... );
foreach ( ... )
{
    bind( ... );
    $results[] = execute();
}

或者,您可以使用SQL IN子句构建一个查询,而不是多次来回数据库的开销。

答案 1 :(得分:1)

这里试试这个:

<?php 
//Check your vars before setting!
$colors = (!empty($_GET['color'])?$_GET['color']:null);
$colors = explode(' ', $colors);

//Prepare the query once
$items = $con->prepare("SELECT * FROM item_descr WHERE color_base1 = :colorbase");
//Use bindParam then you can set $color later on
$items->bindParam(":colorbase", $color);

//Execute the query, iterating over each color
$results=array();
foreach ($colors as $color){
    $items->execute();
    //Fetch the result and store in $results
    $results[] = $items->fetchAll(PDO::FETCH_ASSOC);
}

//Loop through results
if(!empty($results)){
    foreach($results as $result) {
        foreach($result as $row){
            echo $row['color_base1'].'<br />';
        }
    }
}else{
    //empty
}
?>

答案 2 :(得分:0)

您是否可以提供print_r的{​​{1}}?

原因 - 我认为如果你在q字符串中有空格,那么第一个空格就不会再进一步​​了,因此foreach只会运行一次。