2010-05-20 2 views
0

중첩 루프에서 준비된 명령문의 결과를 두 번 이상 사용하려는 경우가 있습니다. 외부 루프는 다른 쿼리의 결과를 처리하고 내부 루프는 준비된 명령문 쿼리의 결과입니다. 그래서 코드는이 (그냥 "pseudoish"개념을 설명하기) 같은 것입니다 : 내가 경험 것으로 보인다PHP, MySQL prepared statements - data_seek (0)을 호출하여 두 번 이상 실행 한 결과를 사용할 수 있습니까?

// not showing the outer query, it is just a basic SELECT, not prepared statement 
// we'll call it $outer_query 

$obj_array = array(); // going to save objects in this 
$ids = array(18,19,20); // just example id numbers 

$query = "SELECT field1, field2 FROM table1 WHERE id=?"; 
$stmt = $db->prepare($query); 

foreach ($ids as $id) { 
    $stmt->bind_param("i", $id); 
    $stmt->execute(); 
    $stmt->bind_result($var1, $var2); 
    $stmt->store_result(); // I think I need this for data_seek 

    while ($q1 = $outer_query->fetch_object()) { 
     while ($stmt->fetch()) { 
      if ($q1->field1 == $var1) { // looking for a match 
       $obj = new stdClass(); 
       $obj->var1 = $var1; 
       $obj->var2 = $var2; 

       $obj_array[] = $obj; 
       $stmt->data_seek(0); // reset for outer loop 
       break;    // found match, so leave inner     
      } 
     } 
    } 
} 

문제 것은 값이 난 후 예상하는대로 변수에 바인딩되지 않아요이다 처음에는 내부 루프에서 가져 오기를 사용합니다. 특히 foreach에 대해 3 개의 id를 사용하여 실행 한 경우 첫 번째 ID가 올바르게 처리되고 두 번째 ID가 잘못 처리되었으며 (존재하는 경우에도 내부 루프에서는 일치하지 않음) 세 번째 ID가 올바르게 처리되었습니다.

위에서 수행 한 시퀀스에서 준비된 statment 함수 호출에 문제가 있습니까? 아니면 준비된 명령문의 결과를 사용할 수없는 잘못된 방법입니까?

감사합니다.

당신은 더 나은 사용을 거라고

답변

0

이 코드가 잘못되어있는 부분을 발견했습니다. 그것은 준비된 명령문 함수를 사용하여 data_seek를 배치 한 것과 아무런 관련이 없습니다. 나는 너무 빨리 SO 약간의 도움을 추구 :)

다음과

지금 내가 원하는대로 정확하게 작동하는 루프 코드가 될 때 :

while ($q1 = $outer_query->fetch_object()) { 
    while ($stmt->fetch()) { 
     if ($q1->field1 == $var1) { // looking for a match 
      $obj = new stdClass(); 
      $obj->var1 = $var1; 
      $obj->var2 = $var2; 
      $obj_array[] = $obj; 
      break;    // found match, so leave inner     
     } 
    } 
    $stmt->data_seek(0); // reset for outer loop 
} 
// this was always here, forgot it in original post 
$outer_query->data_seek(0) // reset for next iteration of foreach 

나는 준비된 한 Statment 결과를 재설정 조건 내에서 data_seek 호출 할 때 일치가 발견 된 경우에만 리셋이 발생했습니다. 이로 인해 준비된 명령문 결과가 재설정되지 않은 특정 상황에서 외부 루프가 실행됩니다. 때로는 숲이 나무에 숨겨져 있습니다.)

그래서 분명히 내가 기대했던 것처럼 data_seek를 사용하여 준비된 명령문 결과를 여러 번 쉽게 처리 할 수 ​​있습니다.

감사합니다.

0

는 단일 쿼리없이 루프

로를 만들기 위해 가입 그리고 당신은 어차피 data_seek 필요하지 않습니다.

+0

실제 상황은 위에서 설명한 것보다 더 복잡하며 단일 쿼리를 만들기위한 JOIN이 작동하지 않습니다. 위의 내용을 알고 싶다면 위의 루프 에서처럼 준비된 문을 사용하는 개념에 문제가 있거나 동일한 결과를 여러 번 다시 설정하거나 가져올 수없는 이유가 분명하지 않은 것입니다. 제안 주셔서 감사하지만 그것은 내 질문에 정말로 대답하지 않습니다. –

+0

죄송합니다 @ 카르벨하지만 그건 불가능합니다. JOIN을 사용하면 쿼리가 작동하지 않을 수 있습니다. 경험이 부족해서 잘못 가고있는 것뿐입니다. 잘못된 방법을 고수하는 대신 올바른 방법을 배우는 것이 좋습니다. 그것은 인생입니다. 때때로 우리가 가진 대답은 우리가 묻는 대답이 아닙니다. –

+0

나는 당신과 나는 의사 소통에 실패하고 있다고 생각한다. 나는 내가 가진 문제를 발견했다. (아래 참조). 나는 하나의 쿼리에서 필요한 결과를 얻을 수있는 방법이 있는지 재검토했지만,이 경우에는 작동하지 않을 것이라고 생각합니다. 나는 실제 상황의 모든 복잡성에 들어가기를 원하지 않았다. 문제가 너무 길어서 모든 세부 사항을 갖추지 못하는 단점이 있었기 때문이다. 미안합니다. 입력 해 주셔서 다시 한 번 감사드립니다. 매우 감사. –

0

mysql 결과를 배열로 변환 한 다음 배열 함수를 사용하여 배열을 탐색 할 수 있습니다. Data_seek은 매우 우아하지 않습니다.

+0

실제 질문에서 너무 멀리 떨어져 있습니다 :) –

+0

결과를 배열로 변환하는 추가 작업을 수행해야하는 이유는 무엇입니까? 또한, data_seek이 우아하지 않다는 당신의 논리는 무엇입니까? 그것은 내가 그것을 사용하고있는 것을 정확하게하기 위해 설계된 것이 아닌가? 포인터를 다시 결과 집합의 시작 부분 (또는 특정 위치)으로 재설정 하시겠습니까? –

관련 문제