<?php // Полная загрузка сервисных книжек, создан 2024-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='\
Нуууу, безделушка полезная, но зачем писать обычным перебором? Переделать бы на запросы — было бы слаще 🙂
ну так в запросы пришлось каждый раз вставлять в запрос, а тут все тупо, и думать не надо)))
кстати, с запросом было бы быстрей…
ну в общем может быть на досуге сделаю)))
Для каждого Справочник из Метаданные.Справочники Цикл
ИмяСправочника = Справочник.Имя;
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ «+ИмяСправочника+».Ссылка) КАК КоличествоЭлементов
|ИЗ
| Справочник.»+ИмяСправочника+» КАК «+ИмяСправочника;
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Сообщить(«Справочник.»+ИмяСправочника + «: «+ Выборка.КоличествоЭлементов + » элементов»);
КонецЦикла;
Для каждого Документ из Метаданные.Документы Цикл
ИмяДокумента = Документ.Имя;
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ «+ИмяДокумента+».Ссылка) КАК КоличествоЭлементов
|ИЗ
| Документ.»+ИмяДокумента+» КАК «+ИмяДокумента;
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Сообщить(«Документ.»+ИмяДокумента + «: «+ Выборка.КоличествоЭлементов + » элементов»);
КонецЦикла;
(3) Улыбнуло 🙂 Объясни пожалуйста, зачем в цикле каждый раз писать «Запрос = Новый Запрос;» и зачем в запросе слово «РАЗЛИЧНЫЕ»?
так приятно, что столько умных решений и мнений, от всяких гениальных ребят пришло, очень интересно, что такие умные ребята, сами не брались за решение такой задачи, тем не менее рецензий куча)))
а вообще, спасибо за коменты, тот вариант давно переработан)))
но всё же лежит, чтобы задавали вопросы)))
кстати, текст запроса можно было бы один раз присвоить…
потом только значение встриваемой переменной изменять)))
(4) полгода прошло уж
а. написал за минуту для примера.
б. Запрос = Новый Запрос; и т.д. — потому что пользуюсь «Ctrl + Q» и шаблонами.
в. Различные по-приколу, никто даже не отметил эту фишку — ты первый соображающий человек
г. теперь знаю более простой способ получить необходимое
так мне в личку до сих пор пишут :):):)
как не странно :):):)
(5) Самому писать смысла нету, зачем тратить время на то, что уже милионы раз решалось 🙂 А переработанный вариант зря не выкладываете, могли бы отхватить пару плюсов 🙂
(7) Извините, на дату конечно не посмотрел, просто надо было, вот и просматривал существующие решения.