Php 使用MySQLi返回大型数据集

Php 使用MySQLi返回大型数据集,php,mysqli,Php,Mysqli,我一直在使用一个基本类来处理大多数简单的MySQLi查询(例如,simple select from),并且遇到了一个与我如何返回数据有关的问题。下面是一个有关函数的示例: public function selectFromWhere($conn, $columns, $table, $where, $vars, $limit) { $sql = "SELECT %s FROM %s WHERE %s%s"; $l = ($limit == 0) ? '' : " LIMIT

我一直在使用一个基本类来处理大多数简单的MySQLi查询(例如,simple select from),并且遇到了一个与我如何返回数据有关的问题。下面是一个有关函数的示例:

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循环?这是我看到的唯一解决方案,我只是想在这里发布,看看是否有人有过类似的经历,并能分享一些见解。

首先回答你的问题。

或者,根据您的问题,您希望它作为简单数组而不是关联数组返回

$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;
}
应该是你应该做的事情的表现,不要重复你自己

编辑 如果我们想进一步处理内存问题,假设您独立地处理每一行

$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{
...
}
$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{
...
}