PHP Sqlite3 множественная выборка

Появилась странная проблема при запросе:

$result = $this->conn->query("SELECT student_id as id, avg(mark) as average FROM marks GROUP BY student_id ORDER BY avg(mark) DESC LIMIT 15;")->fetchArray(SQLITE3_ASSOC);

В $result я получаю Array ( [id] => 1 [average] => 3.1739130434783 ), хотя при запросе напрямую
(через утилиту sqlite3.exe)
я получаю полный список:

SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> SELECT student_id as id, avg(mark) as average FROM marks GROUP BY student_id ORDER BY avg(mark) DESC LIMIT 15;
1|3.17391304347826
2|3.0
7|1.0
6|1.0
5|1.0
4|1.0
3|1.0
sqlite>

Не знаю в чем проблема.

Updates

Нашел, кажется, решение, но оно мне абсолютно не нравится.

while($row=$result->fetchArray()){
   // Do Something with $row
   print_r($row);
}

Есть ли способ в одну строку?


Ответы (1 шт):

Автор решения: Ипатьев

В общем, вопрос из тех, на которые ответ находится за 5 секунд в документации, но по правилам Stack Overflow на него все равно надо давать ответ.

Как видно из документации, готового метода чтобы получить массив строк в php_sqlite нет

То есть у нас два пути

Первый - вместо php_sqlite использовать PDO. Там такой метод есть.
Второй - вспомнить что мы программисты, а не просто складываем сайт из готовых кубиков, и написать такую функцию самостоятельно

function sqlite_array($result, $mode = SQLITE3_ASSOC) {
    $data = [];
    while($row = $result->fetchArray($mode)){
        $data[] = $row;
    }
    return $data;
}

и потом использовать её невозбранно для получения "в одну строчку", но при этом не растягивая код как резинку от трусов

$sql = "SELECT student_id as id, avg(mark) as average FROM marks 
        GROUP BY student_id ORDER BY avg(mark) DESC LIMIT 15;"
$result = sqlite_array($this->conn->query($sql));
→ Ссылка