2015-07-21 64 views
2

我一直在研究一個基本的類來處理大多數簡單的MySQLi查詢(例如簡單的選擇),並且遇到了一些與我已經返回的問題有關的問題到目前爲止的數據。這裏是一個問題函數的例子:用MySQLi返回大數據集

public function selectFromWhere($conn, $columns, $table, $where, $vars, $limit) { 
    $sql = "SELECT %s FROM %s WHERE %s%s"; 
    $l = ($limit == 0) ? '' : " LIMIT " . $limit; 
    $sql = sprintf($sql, $columns, $table, $where, $l); 
    if($query = $conn->prepare($sql)) { 
     $a = $this->parameterizeArray($vars); 
     if (call_user_func_array(array($query, "bind_param"), $this->refValues($a))) { 
      $data = array(); 
      $query->execute(); 
      $row = $query->get_result(); 
      while($r = $row->fetch_assoc()) { 
       array_push($data, $r); 
      } 
      if (count($data) == 1 && $limit == 1) { 
       $data = $data[0]; 
      } 
      return $data; 
     }else{ 
      return false; 
     } 
    }else{ 
     return false; 
    } 
} 

功能出色的作品,以一個變量數組和格式化他們bind_param工作。問題是一個相當明顯的問題,我將每行添加到一個數組,然後返回該數組。 (如果限制設置爲1,只是返回一個簡單的關聯數組),我知道這是非常糟糕的做法,並且在創建函數時沒有多少考慮,但是我剛剛遇到了明顯的內存問題。大數據集佔用太多內存並導致問題。 (例如,達到設置的php內存限制)

這個想法是將數組中的每一行返回一個數組作爲數組,以便我可以在需要時簡單地運行foreach。這是爲了避免爲每個單一的查詢必須使用相同的4-5個MySQLi行。

我應該簡單地返回fetch_assoc()響應並在我的代碼中運行while循環而不是foreach循環嗎?這是我看到的唯一解決方案,我只是想在這裏張貼,看看是否有人有類似的冒險,並可以分享一些見解。

回答

0

首先回答你的問題。 http://php.net/manual/en/mysqli-result.fetch-all.php

$row->fetch_all(MYSQLI_ASSOC); 

,或者如果你的問題,你希望它返回一個簡單的數組,而不是關聯數組

$row->fetch_all(MYSQLI_NUM); 

第二你不應該重複的代碼行,有這個功能不存在,或者如果我誤解你的問題

$row = $query->get_result(); 
return arrayMyData($row) 
... 
function arrayMyData($row){ 
    $data = array(); 
    while($r = $row->fetch_assoc()) { 
    array_push($data, $r); 
    } 
    if (count($data) == 1 && $limit == 1) { 
    $data = $data[0]; 
    } 
    return $data; 
} 

應該是你應該做什麼的表示,不要重複yoursel F。

編輯 如果我們想進一步去解決內存問題假設你是在每一行獨立工作

$row = $query->get_result(); 
return arrayMyData($row, 'myNumberCruncher') 
... 
function arrayMyData($row, $func){ 
    $data = array(); 
    while($r = $row->fetch_assoc()) { 
    /*array_push($data,*/ 
    $func($r); 
    /*);*/ 
    } 
    if (count($data) == 1 && $limit == 1) { 
    $data = $data[0]; 
    } 
    return $data; 
} 
function myNumberCruncher{ 
... 
}