MV framework logo
  • Архитектура
    • Философия
    • Технологии
    • CMF
    • История версий
  • Админ панель
  • Поддержка
  • Обратная связь
  • Примеры кода
    • Новостная лента
    • Слайдер с баннерами
    • Список с фильтрацией
    • Форма с загрузкой файла
    • AJAX форма на jQuery
    • Вопросы и ответы
    • Каталог с товарами
    • Авторизация пользователя
    • Регистрация пользователя
    • Личный кабинет пользователя
Скачать Версия 2.7 от 06.06.2023
Документация
  • Архитектура
    • Философия
    • Технологии
    • CMF
    • История версий
  • Админ панель
  • Поддержка
  • Обратная связь
  • Примеры кода
    • Новостная лента
    • Слайдер с баннерами
    • Список с фильтрацией
    • Форма с загрузкой файла
    • AJAX форма на jQuery
    • Вопросы и ответы
    • Каталог с товарами
    • Авторизация пользователя
    • Регистрация пользователя
    • Личный кабинет пользователя
Начало работы
  • Установка и запуск
  • Структура папок
  • Запуск простого сайта
  • Предустановленные модели
  • SQLite начало работы
  • Системные настройки
  • Миграции
Модели (models)
  • Общие принципы моделей
  • Типы данных
  • Настройка модели
  • Простые модели
  • Внешние ключи
  • Деревья
  • Многие ко многим
  • Группа
  • Управление записями
  • Управление простыми моделями
  • Дополнительные возможности
Шаблоны (views) и маршрутизация (routes)
  • Общие принципы шаблонов
  • Объект класса Router
  • Объект MV
  • Index, default и 404 шаблоны
  • Создание нового шаблона
  • Вывод данных в шаблоне
  • Объект класса Record
  • Файлы и изображения
  • Дата и время
  • Редиректы
  • Отправка email
  • Специальные методы
Формы
  • Создание форм
  • Настройка полей формы
  • Правила проверки полей формы
  • Проверка полей формы
  • Работа с данными формы
  • Использование данных из моделей
  • Методы форм
SQL запросы
  • Конструктор запросов
  • Прямые запросы
  • Постраничная разбивка
  • Сортировка
  • Фильтрация
  • Загрузка из csv файлов
Сессии и безопасность
  • Работа с сессиями
  • AJAX
  • Кэширование
  • Безопасность
  • Отладка
Плагины
  • Общие принципы плагинов
  • Дополнения к административной панели
Документация
Начало работы
  • Установка и запуск
  • Структура папок
  • Запуск простого сайта
  • Предустановленные модели
  • SQLite начало работы
  • Системные настройки
  • Миграции
Модели (models)
  • Общие принципы моделей
  • Типы данных
  • Настройка модели
  • Простые модели
  • Внешние ключи
  • Деревья
  • Многие ко многим
  • Группа
  • Управление записями
  • Управление простыми моделями
  • Дополнительные возможности
Шаблоны (views) и маршрутизация (routes)
  • Общие принципы шаблонов
  • Объект класса Router
  • Объект MV
  • Index, default и 404 шаблоны
  • Создание нового шаблона
  • Вывод данных в шаблоне
  • Объект класса Record
  • Файлы и изображения
  • Дата и время
  • Редиректы
  • Отправка email
  • Специальные методы
Формы
  • Создание форм
  • Настройка полей формы
  • Правила проверки полей формы
  • Проверка полей формы
  • Работа с данными формы
  • Использование данных из моделей
  • Методы форм
SQL запросы
  • Конструктор запросов
  • Прямые запросы
  • Постраничная разбивка
  • Сортировка
  • Фильтрация
  • Загрузка из csv файлов
Сессии и безопасность
  • Работа с сессиями
  • 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 где-то отсекаются данные. Лично мне такой объем выводимой информации не понадобится, и запрос был тестовым, а с ограниченным набором данных судя по всему работает как надо, но пишу, чтобы были в курсе ситуации.

Тэги: SQL запросы

Прочтений: 128
Ответов: 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

© 2012-2023, MV framework team

English MV task tracker system Лицензия

Поделиться