2013-10-13 48 views
1

更新:
工作代码,感谢jon推动正确的方向。使用数组变量的Foreach循环中的SQL查询

<?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; < ----没有从数据库中得到任何信息

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

这里是我一起工作的代码:

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

    } 

    } 
?> 

回答

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,因为这也是一个使用的变量。

+0

感谢您的详细解答...我已经试过这段代码,但仍然没有运气,任何想法,我的语法出错了? 'code' $ stmt2 = $ conn-> prepare(“SELECT * FROM userItems WHERE id =:id”); foreach($ moodItems as $ id) { //绑定参数 $ stmt2-> bindValue(“:id”,$ id); //初始化一个数组对结果 \t如果($导致= $ stmt2->取(PDO :: FETCH_ASSOC)){ \t $ itemName2 = $导致[ 'ITEMNAME']; \t $ name2 = $ result ['userId']; \t \t \t echo $ itemName2; echo $ name2; } } – JustAnotherDude

+0

从我所看到的看来,在使用'$ stmt2-> fetch'之前,您需要'$ stmt2-> execute',否则在绑定参数后您的查询还没有运行。 – Jon

0

UPDATE:由于乔恩指出的那样,我的回答适用于和Zend_Db_Adapter会不PDOStatement对象(您正在使用)。我很抱歉。

这个问题可能是因为你正在对第二个SQL查询执行$stmt->execute()。​​不返回结果,你想要做的是fetch(),它返回结果。

+0

此外,您的第一个查询当前正在运行两次,因为'execute()'运行一次,'fetch()'第二次运行它。 –

+0

你不想在循环中使用'fetch()',你想要做一些类似'$ results = $ stmt-> fetch();'的操作,然后使用$ results。 'fetch()'执行查询并返回多行,而不是单行。 –

+3

首先,你应该编辑你的答案,而不是添加多个评论。其次,你应该研究你自己的答案,以确保你提供的是有效的信息。 ['PDOStatement :: fetch()'](http://www.php.net/manual/en/pdostatement.fetch.php)返回下一行,它不执行查询。 – Jon