我一直在研究一個基本的類來處理大多數簡單的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循環嗎?這是我看到的唯一解決方案,我只是想在這裏張貼,看看是否有人有類似的冒險,並可以分享一些見解。