2010-05-20 48 views
0

我有一種情況,我想在嵌套循環中多次使用預處理語句的結果。外部循環處理另一個查詢的結果,內部循環是準備好的語句查詢的結果。因此,代碼會是這樣的(只是「pseudoish」,展示的概念):PHP,MySQL準備好的語句 - 你可以通過調用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     
      } 
     } 
    } 
} 

這個問題我似乎經歷的是價值觀沒有得到在變量的約束,因爲我會後的預期我第一次在內部循環中使用fetch。具體來說,在一個例子中,我用foreach的3個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 

當我打電話data_seek條件內重置準備statment結果,重置僅在發現匹配時發生。這導致外部循環在特定情況下運行,並且準備好的語句結果未被重置。有時,森林是由樹木隱藏;)

所以,很明顯,你可以輕鬆地處理準備好的聲明中使用data_seek,正如我所希望的結果多次。

謝謝。

0

你最好使用JOIN單查詢,沒有循環

做它,你不需要任何data_seek反正。

+0

實際情況比上面我所出更加複雜和JOIN使一個單一的查詢是行不通的。上面我想知道的是,如果在循環中使用準備好的語句的概念有任何問題,以及爲什麼我無法重複執行多次相同結果並獲取()的任何明顯原因。感謝您的建議,但它並沒有真正回答我的問題。 – 2010-05-20 17:40:32

+0

我很抱歉@Carvell,但這是不可能的。沒有JOIN可以使查詢無法正常工作。由於缺乏經驗,你只會走錯路。你最好學習正確的方法,而不是堅持錯誤的方式。這是一種生活。有時我們所得到的答案不是我們所要求的。 – 2010-05-20 17:48:29

+0

我認爲你和我沒有溝通:)我確實發現了我遇到的問題(見下文)。我重新檢查了一下,看看是否有辦法在單個查詢中獲得我需要的結果,但在這種情況下,我認爲這不會起作用。我不想陷入我實際情況的所有複雜情況,因爲它會讓問題太長,所以你有缺乏所有細節的缺點。對於那個很抱歉。再次感謝您的輸入。非常感激。 – 2010-05-20 18:17:33

0

轉換MySQL的結果到一個數組,然後可以用數組函數通過陣列進行導航。 Data_seek不是很優雅,IMO。

+0

這太離實際問題了:) – 2010-05-20 18:05:22

+0

爲什麼要經過額外的工作將結果轉換爲數組?另外,你說data_seek不夠優雅的理由是什麼?它不是專門用來做我正在使用它的嗎?將指針重置回結果集中的開始位置(或任何特定位置)? – 2010-05-20 18:23:12