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));