Foreach循环中的SQL查询使用数组变量

时间:2013-10-13 00:13:16

标签: php sql arrays loops foreach

更新:
工作代码,感谢jon推动正确的方向。

<?php

     $stmt2 = $conn->prepare("SELECT * FROM userItems WHERE id=:id");

        foreach ($moodItems as $id2)
            {

    // bind the parameters
        $stmt2->bindValue(":id", $id2);    

      if ($stmt2->execute()) {

            if($result = $stmt2->fetch(PDO::FETCH_ASSOC)) {

    // initialise an array for the results 
            $itemName2 = $result['itemName'];
                $name2 = $result['userId'];
              echo $itemName2."<br>";
              echo $name2."<br>";
        }
     }
   }   
      ?>

我在foreach循环中使用SQL查询时遇到问题。我试图使用第一个查询(这是一个数组)的值,并在第二个查询中使用它。

第一个查询正常工作以给我正确的值(数组)。但由于某些原因,当我尝试在foreach中使用数组时它无法正常工作,它没有显示任何错误...它只是不从数据库中获取任何数据。
IE / echo $ itemName2; &lt; ----没有从数据库中获取任何信息

任何帮助都会很棒。感谢。

这是我正在使用的代码:

<?php           
$attrs = array(PDO::ATTR_PERSISTENT => true);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// prepare the statement.
$stmt = $conn->prepare("SELECT * FROM userMoodboard WHERE name=:name");

// bind the parameters
$stmt->bindValue(":name", $loggedInUser->username);

// initialise an array for the results 
if ($stmt->execute()) {

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $imageUrl = $row['imageUrl'];
            $moodItems = $row['moodItems'];
            $moodItems = json_decode($moodItems);

?>
<img src='<?php echo $imageUrl;?>' class="thumbnail"></img>
    <?php
    $stmt = $conn->prepare("SELECT * FROM userItems WHERE id=:id");

        foreach ($moodItems as $id)
               {
    // bind the parameters
        $stmt->bindValue(":id", $id);    

    // initialise an array for the results 
        if($stmt->execute()) {
            $itemName2 = $row['itemName'];
                $name2 = $row['userId'];

              echo $itemName2;
              echo $name2;
        }
        }   

    }

    }
?>

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题,但我们将从您的第二个声明开始。

$stmt = $conn->prepare("SELECT userId FROM userItems WHERE id=:id");

foreach ($moodItems as $id)
{
    // bind the parameters
    $stmt->bindValue(":id", $id);    

    // initialise an array for the results 
    if($stmt->execute()) {
        $itemName2 = $row['itemName'];
        $name2 = $row['userId'];

        echo $itemName2;
        echo $name2;
    }
}

您试图提取$row['itemName']$row['userId'],但是,您从未在该查询中SELECT itemName列。因此,如果您想要这些信息,则必须先select。除此之外,您execute查询,但您永远不会fetch包含信息的行。

这些是为什么第二部分不能按照你想要的方式工作的基础知识。

现在,为了更大的图景。您提供的大多数代码块都是针对您的第一个if的嵌套$stmt->execute(),然后是while($row = ...内的代码,这本身就很好。但是,稍后在同一个块中,您准备另一个语句,这是完全可以接受的,但是您将它分配给您首先用于循环的相同$stmt变量,这也会导致问题。您需要为第二个预准备语句分配一个新变量,以便可以使用新的数据集。另外,回到我发布的上一个块,您需要将其提取到 $row的变量,因为它也是一个使用过的变量。

答案 1 :(得分:0)

更新:正如Jon所指出的,我的答案适用于Zend_Db_Adapter而不适用于PDOStatement(您正在使用)。道歉。

问题可能是你正在对第二个SQL查询进行$stmt->execute()execute()不返回结果,您要做的是fetch(),它会返回结果。