• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mysqli_result::fetch_all()

    (PHP 5 >= 5.3.0, PHP 7)

    Fetches all result rows as an associative array, a numeric array, or both

    说明

    面向对象风格
    mysqli_result::fetch_all([int $resulttype= MYSQLI_NUM]): mixed
    过程化风格
    mysqli_fetch_all(mysqli_result$result[,int $resulttype= MYSQLI_NUM]): mixed

    mysqli_fetch_all() fetches all result rows and returns the result set as an associative array, a numeric array, or both.

    参数

    $result

    仅以过程化样式:由mysqli_query(),mysqli_store_result()或mysqli_use_result()返回的结果集标识。

    $resulttype

    This optional parameter is a constant indicating what type of array should be produced from the current row data. The possible values for this parameter are the constants MYSQLI_ASSOC,MYSQLI_NUM, or MYSQLI_BOTH.

    返回值

    Returns an array of associative or numeric arrays holding result rows.

    仅 MySQL 原生驱动

    仅可用于mysqlnd。

    As mysqli_fetch_all() returns all the rows as an array in a single step, it may consume more memory than some similar functions such as mysqli_fetch_array(), which only returns one row at a time from the result set. Further, if you need to iterate over the result set, you will need a looping construct that will further impact performance. For these reasons mysqli_fetch_all() should only be used in those situations where the fetched result set will be sent to another layer for processing.

    参见

    • mysqli_fetch_array() Fetch a result row as an associative, a numeric array, or both
    • mysqli_query() 对数据库执行一次查询
    I tested using "fetch all" versus "while / fetch array" and :
    fetch-all uses less memory (but not for so much).
    In my case (test1 and test2): 147008,262848 bytes (fetch-all) versus 147112,262888 bytes (fetch-array & while.
    So, about the memory, in both cases are the same.
    However, about the performance
    My test takes :350ms (worst case) using fetch-all, while it takes 464ms (worst case) using fetch-array, or about 35% worst using fetch array and a while cycle.
    So, using fetch-all, for a normal code that returns a moderate amount of information is :
    a) cleaner (a single line of code)
    b) uses less memory (about 0.01% less)
    c) faster.
    php 5.6 32bits, windows 8.1 64bits
    By the way, this case pretty work's too:
    $services = $mysqli->query("SELECT * FROM table1");
    if($services && $services->num_rows>0){
      $services->fetch_all(MYSQLI_ASSOC);
    }
    foreach($services as $service){
      echo $service; //work properly, cause it implements Iterator 
    }
    That's mean in this case $services is a valid array (or empty array)
    If you really need this function, you can just extend the mysqli_result class with a function like this one.
    <?php
        public function fetch_all($resulttype = MYSQLI_NUM)
        {
          if (method_exists('mysqli_result', 'fetch_all')) # Compatibility layer with PHP < 5.3
            $res = parent::fetch_all($resulttype);
          else
            for ($res = array(); $tmp = $this->fetch_array($resulttype);) $res[] = $tmp;
          return $res;
        }
    ?>
    
    Return value changed in 5.3.3 - between 5.3.0 and 5.3.2 (incl.) when the result set was empty NULL was returned. 5.3.3+ returns an empty array.
    Also, mysqli_fetch_all works only for buffered result sets, which are the default for mysqli_query. MYSQLI_USE_RESULT will be supported in 5.3.4+
    However, it makes little sense to use it this way, materialising unbuffered sets. In this case choose STORE_RESULT, and fetch_all won't copy the data, but reference it, as it is stored already in mysqlnd.