2013-10-13 68 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