2013-03-31 146 views
0

我有一個由聯合更小的查詢構建的動態查詢。我使用union,因爲我需要從一個大列表中的幾張表中獲取數據。這些表格有許多共同之處,但我仍然需要單獨表格中的數據。所以我認爲這個解決方案似乎是最好的。 此工作過,到目前爲止好,但今天我加了一些更多的查詢,現在它打破,它給了我這個錯誤:在bind_result上耗盡的字節允許的內存大小

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 150994936 bytes)

錯誤是指這樣的功能:

function selectResults($stmt){ 
    $parameters = array(); 
    $results = array(); 

    $meta = $stmt->result_metadata(); 

    while ($field = $meta->fetch_field()) { 
    $parameters[] = &$row[$field->name]; 
    } 

    //------THIS IS WHERE THE ERROR IS------ 
    call_user_func_array(array($stmt, 'bind_result'), $parameters); 
    //-------------------------------------- 

    while ($stmt->fetch()) { 
     $x = array(); 
     foreach($row as $key => $val) { 
     $x[$key] = $val; 
     } 
     $results[] = $x; 
    } 

    return $results; 

} 

功能被稱爲是這樣的:

$mysqli = new mysqli('localhost', 'username', 'pass', 'db'); 
$stmt = $mysqli -> prepare("some query"); 
$stmt -> execute(); 
$results = selectResults($stmt); 
$stmt -> close(); 
$mysqli -> close(); 

該查詢可以是約1500字,是不是太多了?

將所有的表放入同一個表,並只有一個查詢解決這個問題?

回答

1

我試着用最新的子查詢與另一個,它仍然給了我錯誤。所以我認爲新的子查詢是問題而不是子查詢的數量。 新的子查詢有一箇中文字段,其中另一個具有varchar。我嘗試將mediumtext切換到varchar,現在它工作。我沒有理由使用它作爲中文,所以這解決了它。

0

嘗試增加php配置中的memory_limit。

+0

寧願避免改變php配置中的東西。我還更新了我的問題。 –

+0

儘管這樣可以解決這個錯誤,但拖拽150MB並複製它是一個資源問題。大多數時候,整個結果集不需要駐留內存。我認爲這至少是一個設計問題。無論如何,使用部分結果集而不是整個事情? –

+0

你也可以改變腳本或htaccess中的內存限制(假設httpd.conf允許覆蓋),如果你不想改變它在PHP配置 –

相關問題