2013-10-13 3 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; 
    } 
} 

당신은 결코 SELECT 그러나 $row['itemName']$row['userId']을 꺼내 그 쿼리에 itemName 열을 시도하지 않습니다. 정보를 원하면 select 먼저해야합니다. 그 외에는 execute 쿼리를 사용하지만 결코 정보가있는 행 fetch이 아닙니다.

두 번째 부분이 원하는 방식으로 작동하지 않는 이유는 기본입니다.

이제 더 큰 그림을보실 수 있습니다. 사용자가 제공하는 대부분의 코드 블록은 처음 $stmt->execute()에 대해 if을 중첩 한 다음 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 : 존에 의해 지적, 내 대답은 (사용하는) PDOStatement에 Zend_Db_Adapter에 적용되지 여기

내가 함께 일하고 코드입니다. 내 사과.

문제는 아마도 두 번째 SQL 쿼리에서 $stmt->execute()을 수행하고있는 것입니다. execute()이 결과를 반환하지 않으면 결과를 반환하는 fetch()으로하고 싶습니다.

+0

첫 번째 쿼리는 현재 두 번 실행됩니다. execute()는 한 번 실행되고'fetch() '는 두 번째 쿼리를 실행하기 때문입니다. –

+0

루프 내에서'fetch()'를 사용하고 싶지는 않습니다 ...'$ results = $ stmt-> fetch();'와 같은 일을 한 번하고 $ 결과로 작업하십시오. 'fetch()'는 질의를 실행하고 단일 행이 아닌 여러 행을 반환합니다. –

+3

먼저 여러 의견을 추가하는 대신 답변을 편집해야합니다. 둘째, 유효한 정보를 제공하기 위해 자신의 답변을 조사해야합니다. ['PDOStatement :: fetch()'] (http://www.php.net/manual/en/pdostatement.fetch.php)는 다음 행을 반환하지만 ** 쿼리를 실행하지 않습니다 **. – Jon