2011-08-25 56 views
0

我有以下代碼:使用fetchall陷入

$sql = "SELECT table.field, table2.field2 FROM 
       table, table2"; 
    $stmt = $this->db->prepare($sql); 
    $stmt->execute(); 

    $x = $stmt->fetchAll(PDO::FETCH_ASSOC); 

我知道這是沒有足夠的信息,但我不明白爲什麼代碼執行只有當我評論的使用fetchall線。當該行執行時,我什麼都沒有,只是空白的瀏覽器,沒有任何錯誤或任何東西。在螢火蟲的迴應是空白的...它可能是什麼?

+0

你期望在瀏覽器中看到什麼?檢查是否在php.ini中打開了錯誤報告。另外,你在處理MySQL錯誤嗎? – rubayeet

回答

6

您在做笛卡爾產品tabletable2。這可能是大量的數據。

對於表中的每一行,您將獲得table2中的所有行。因此,如果table有100行,而表2有500行,則您的查詢將嘗試獲取50.000行。

你要麼需要一個JOIN:

SELECT table.field, table2.field2 
FROM table 
JOIN table2 
ON table.field3 = table2.field3 

或聯合

SELECT table.field AS FIELDNAME FROM table 
UNION ALL 
SELECT table2.field2 AS FIELDNAME FROM table2 

如果笛卡爾乘積就是你要真的是,嘗試添加一個極限,看看是否可行。然後稍後增加或刪除限制

SELECT table.field, table2.field2 
FROM table, table2 LIMIT 10 

根據您的表包含(您確實沒有提供足夠的信息)。

+0

這是一個很多的數據:p爲什麼這會成爲一個問題? – luqita

+1

@luqita:因爲PHP在存儲最小/最簡單的數據方面存在相當大的內存開銷。你基本上試圖將你的兩個表SQUARED的全部內容加載到內存中。 –

+0

嘗試先獲取較小的數據。如果這樣做,你正在達到一定的限制。也許你的PHP腳本有一個最大執行時間設置,或者你的內存不足,或者你的請求超時... – Konerak

0

對於捕獲錯誤,您應該啓用error_reporting和display_errors。 我認爲這種行爲的原因是你得到'允許的內存限制'​​。也許你從db中得到了太多的行。

嘗試添加ini_set('memory_limit','256M')並檢查工作。