<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Вот календарик в диапазоне до 2739 лет.http://www.infostart.ru/public/68269/
Работает значительно быстрее.
(1) замеры в студию ❗ твой слишком громоздкий куча временных таблиц и в зависимости от диапазона дат ( периода ) твой будет выдавать разную скорость, твой смотрел механизмы похожи мне мой больше нравится он проще короче и в нём только одна временная таблица
p.s на практике отчеты с выборкой по дням за период больше года не делаются не читабельно обычно хватает месяца за глаза
(2) Вариант указанный по ссылочке будет стабильно работать от 01.01.0001 по текущую дату ещё 700 лет. В комментариях указаны диапазоны и выбросить «не нужные» таблицы проблем не составляет. Замеры сейчас сделаю.
(3) на полноценную статью пока нет времени сравнить с решением alexk-is сравним
один из худших. — каковы критерии ?
(4) можно пальцем в типовой где посмотреть ( если это зарплата то я с ней не работаю)
(5) Замеры сделанные в ИР
Время формирования результата — 16 мс
Время формирования результата — 15 мс
Время формирования результата — 0 мс
вот такой разброс для обоих запросов
в iE мой показывает 0,1
ваш 0,1 — 0,3 так что где ваш работает значительно быстрее не вижу
(8) для типовой волне нормальное решение, если нужно универсальный внешний запрос то приходится изгалятся
(3) Eugeneer за это пост хочется поставить сразу и + и —
я за критику, но с конкретикой хочется понять по каким критерия оценивается запрос 💡
(9) Расклад такой на 1000 повторов для 3х вариантов:
1. Пример запроса из этой публикации
2. Пример запроса из ссылки (1)
3. Пример запроса из ссылки (1) с ограничениями на 2.5 года как в этой публикации
Период 1 месяц
1 — 5,891
2 — 6,172
3 — 3,391
Период 3 месяца
1 — 6,001
2 — 6,720
3 — 3,688
Период 6 месяцев
1 — 6,077
2 — 7,452
3 — 4,094
Период 12 месяц
1 — 6,173
2 — 8,923
3 — 4,938
Отсюда вывод запрос на 2739 лет (вариант 2) работает медленнее всех. Думаю это понятно, т.к. обрабатывается больше связей. Вариант 3 работает быстрее варианта 1, т.к. выполняется отсечение до соединения и меньше математики в результирующем запросе.
(0) Текст запроса в статье можнораскрасить получше.