【问题标题】:FOREACH not preparing PDO statement at each iterationFOREACH 没有在每次迭代时准备 PDO 语句
【发布时间】:2012-08-17 00:40:43
【问题描述】:

我正在尝试使用 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 包含超过 1 种从复选框和 jquery 获得的不同颜色。

谢谢!

【问题讨论】:

  • 我认为它更有可能是最后一个值而不是第一个值。您基本上是在每次迭代中覆盖您的绑定。

标签: php sql foreach pdo


【解决方案1】:

您的代码嵌套错误:您想准备一次查询,然后多次执行它,但您的做法恰恰相反。

而不是:

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

你需要:

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

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

【讨论】:

  • 带有 IN 的 SQL 看起来如何?另外,我知道我必须将 PREPARE 带出 FOREACH,但为什么我必须在循环内部而不是之后执行?
  • 因为每次绑定参数,都要执行查询才能得到对应的数据。此外,您犯的另一个错误是在您应该使用 bindParam 时使用了 bindValue。
  • 想想bindValue 就像分配一个变量:每次循环时,您都在为:colorbase1 参数设置一个新值,但您并没有对它做任何事情。您需要每次运行execute 才能将其实际发送到数据库,然后再用不同的值覆盖它。
  • 至于IN,我会把PHP留给你或其他好心人,但你最终得到的SQL看起来像SELECT * FROM item_descr WHERE color_base1 IN ('blue', 'green', 'red')
  • @IMSoP - 问题是我有多个 IF,每次都准备不同的 SQL 查询。最后,在展示结果之前,我正在执行之前准备的所有内容。所以你的意思是我应该在每个 IF 中独立执行?
【解决方案2】:

您可以提供print_r$_GET['color'] 吗?

原因 - 我认为如果您在 q 字符串中有空格,则第一个空格将不会进一步发展,因此 foreach 只会运行一次。

【讨论】:

    【解决方案3】:

    在这里试试这个:

    <?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
    }
    ?>
    

    【讨论】:

    • 这看起来是一个很好的解决方案,但是(恕我直言)最好给出一个简化的解释,而不是提问者可能无法完全理解的完整代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多