2012-11-15 52 views
3

我對MSSQL使用PDO,並且需要運行嵌套查詢。他們都是準備好的陳述。如果我嘗試使用fetch()方法,則內部查詢立即失敗,所以我使用了fetchAll()。所以,我得到這樣的事情,有計劃,產品和預算:PHP,使用嵌套查詢的PDO,結果損壞

$pgm_stmt->execute(); 
$pgm_res = $pgm_stmt->fetchAll(PDO::FETCH_ASSOC); 
foreach ($pgm_res as $pgmrow) { 
    $prod_stmt->execute(array($pgmrow['ID'])); 
    $prod_res = $prod_stmt->fetchAll(PDO::FETCH_ASSOC); 
    foreach ($prod_res as $prodrow) { 
     $bdgt_stmt->execute(array($pgmrow['ID'], $prodrow['ID'])); 
     $bdgt_res = $bdgt_stmt->fetchAll(PDO::FETCH_NUM); 
     foreach ($bdgt_res as $bdgtrow) { 
      ... work here 
     } 
    } 
} 

OK,一切通過作品的第一次,但是當它循環回第二個程序,該產品的結果集被莫名其妙地損壞。當我在fetchAll()之後立即轉儲$ prod_res變量時,這些值是從內存的其他部分,其他數組的位等隨機分配的。當然,它因爲$ prodrow ['ID']值未定義而失敗,因爲整個結果集被破壞。

有人可以幫我解決這個問題嗎?我很難過。

謝謝。

+4

你確定你需要嵌套的東西,而不是一些聯接嗎? – PeeHaa

+2

如果沒有看到查詢就很困難。 –

+0

是的,我需要嵌套的東西。查詢實際上非常複雜,結構非常規範。試圖把所有這些放在一起將是可怕的。 –

回答

1

不是一個錯誤,而是一個功能,請參閱:https://bugs.php.net/bug.php?id=65945

這是MSSQL(TDS),DBLIB和freetds的行爲。每個連接規則一個語句。如果您啓動另一個聲明,則先前的聲明將被取消。

以前的版本將整個結果集緩衝在內存中,導致大型結果集上出現OOM錯誤。

如果需要,可以使用fetchAll()和循環來複制以前的行爲。另一個解決方法是打開2個連接對象,每個語句一個。

+0

仍然無法弄清楚爲什麼這是一個功能。煩人。 – Raptor