MV framework logo
  • Архитектура
  • Философия
  • Админ панель
  • Поддержка
  • Обратная связь
Документация
Скачать .zip версия 3.2.0 от 25.12.2024
  • Архитектура
  • Философия
  • Админ панель
  • Поддержка
  • Обратная связь
Начало работы
  • Установка и запуск
  • Структура папок
  • Запуск простого сайта
  • Предустановленные модели
  • SQLite начало работы
  • Системные настройки
  • Миграции
  • Отладка
Модели
  • Общие принципы моделей
  • Типы данных
  • Настройка модели
  • Простые модели
  • Внешние ключи
  • Деревья
  • Многие ко многим
  • Группа
  • Управление записями
  • Управление простыми моделями
  • Дополнительные возможности
Шаблоны и маршрутизация
  • Общие принципы шаблонов
  • Объект класса Router
  • Объект MV
  • Создание нового шаблона
  • Вывод данных в шаблоне
  • Объект класса Record
  • Файлы и изображения
  • Дата и время
  • Редиректы и Http
  • Отправка email
  • Специальные методы
Формы
  • Создание форм
  • Настройка полей формы
  • Валидация полей формы
  • Безопасность форм
  • Работа с данными формы
  • Использование данных из моделей
  • Методы форм
SQL запросы
  • Конструктор запросов
  • Прямые запросы
  • Постраничная разбивка
  • Сортировка
  • Фильтрация
Дополнительно
  • AJAX
  • Плагины
  • Кэширование
  • Безопасность
  • Дополнения к административной панели
Документация
Начало работы
  • Установка и запуск
  • Структура папок
  • Запуск простого сайта
  • Предустановленные модели
  • SQLite начало работы
  • Системные настройки
  • Миграции
  • Отладка
Модели
  • Общие принципы моделей
  • Типы данных
  • Настройка модели
  • Простые модели
  • Внешние ключи
  • Деревья
  • Многие ко многим
  • Группа
  • Управление записями
  • Управление простыми моделями
  • Дополнительные возможности
Шаблоны и маршрутизация
  • Общие принципы шаблонов
  • Объект класса Router
  • Объект MV
  • Создание нового шаблона
  • Вывод данных в шаблоне
  • Объект класса Record
  • Файлы и изображения
  • Дата и время
  • Редиректы и Http
  • Отправка email
  • Специальные методы
Формы
  • Создание форм
  • Настройка полей формы
  • Валидация полей формы
  • Безопасность форм
  • Работа с данными формы
  • Использование данных из моделей
  • Методы форм
SQL запросы
  • Конструктор запросов
  • Прямые запросы
  • Постраничная разбивка
  • Сортировка
  • Фильтрация
Дополнительно
  • AJAX
  • Плагины
  • Кэширование
  • Безопасность
  • Дополнения к административной панели
MV tracker

Ошибка при работе с большим объемом данных

Ответов: 3
Иван
11.04.2023 19:44

Судя по всему, наткнулся на баг в работе метода getAll.

База данных sqlite. Есть три таблицы - авторы, книги и промежуточная таблица связей между этими таблицами (и с другими таблицами, но пока не используемыми в рамках тестирования). Прежде чем писать модели и адаптировать таблицы, решил протестировать связи прямым запросом:

$rows = $this -> db -> getAll("
SELECT *
FROM responsability
LEFT OUTER JOIN authors
ON responsability.responsability_author = authors.id
LEFT OUTER JOIN notices
ON responsability.responsability_notice = notices.notice_id");

В результате, получаю массив содержащий 11896 из 33510 содержащихся в БД, более того, выведенные данные из таблицы notices не соответствуют указанным связям. Если установить LIMIT к примеру в 500, то по крайней мере первые записи соответствуют, на счет прочих сказать без сравнения сложно.
Проверяю запрос через прямой коннект к базе

$db = new SQLite3('userfiles/database/sqlite/database.sqlite');

Результат выдает полный набор данных, с правильным соответствием между записями. Такое ощущение, что при формировании массива через метод getAll где-то отсекаются данные. Лично мне такой объем выводимой информации не понадобится, и запрос был тестовым, а с ограниченным набором данных судя по всему работает как надо, но пишу, чтобы были в курсе ситуации.

Прочтений: 1013
Ответов: 3
Иван
11.04.2023 20:20

Поправка. Данные связанных таблиц, все же соответствуют, просто начинаются не с первой записи. Первые выведенные записи ввели в заблуждение, т.к. авторы по списку были первыми, но указанные книги в базе далеко дальше. Но суммарное количество выводимых записей все же меньшее.

Maxim
13.04.2023 10:31

Метод getAll устроен достаточно просто, он использует только функционал PDO для извлечение данных из БД и помещает их в массив с ключами в виде id записи. Возможно в вашем запросе при использовании JOIN конструкций перезаписались id записей т.к. поле id есть у всех таблиц. Если это так, то при указании имен нужных полей и переименовании дублей полей (id) проблема должна уйти.

public function getAll($query)
{
    $mass = array();
    $result = $this -> query($query);

    while($row = $this -> fetch($result, "ASSOC"))
        if(isset($row['id']))
            $mass[$row['id']] = $row;
        else
            $mass[] = $row;

    return $mass;
}
Иван
13.04.2023 13:34

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

public function getAll($query)
{
        $mass = array();
        $result = $this -> db -> query($query);
     
        while($row = $this -> db -> fetch($result, "ASSOC"))
                $mass[] = $row;
             return $mass;
}
Ответить на вопрос
Ответить
MV tracker

© 2014-2025, MV framework team

English MV tracker project Github

Поделиться