Синхронизация измененных файлов между флэшкой и жеским диском ets.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

8 Comments

  1. iov

    хм…. ну да ладно может кому и пригодится ..

    Имеет место быть..

    Ну как альтернативу посмотрите http://www.xstarter.com/rus/index.html (там задачу можно по втыканию флешки организовать и сообщением типа «доставай хозяина я синхронизировалась») короч много там чего.

    Reply
  2. SiAl

    Запускается самостоятельно или при «втыкании» флэшки?

    Reply
  3. J7ReW

    (1) Спасибо, посмотрю

    (2) Запуск производится вручную, т.к. предполагается, что программа постоянно находится на флэшке и не делает записей в реестре, не висит в процессах. Схема такая: воткнул флэшку, запустил программу, выбрал настройку, запустил синхронизацию, просмотрел отчет, закрыл.

    Reply
  4. tandy82

    Начиная с Windows 95 существует встроенные в систему средство синхронизации, которое называется Портфель (Briefcase).

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

    Я так синхронизирую флешку уже несколько лет.

    Справка windows xp:

    Общие сведения о портфеле

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

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

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

    Reply
  5. tandy82

    + как включить портфель, можно прочитать в справке windows

    Reply
  6. FIGOR

    Хотелось бы еще иметь возможность зиповать данные и уже потом копировать на флешку, а потом раззиповывать в указанный каталог на диске с флешки. 💡 Возможно ли подключение архиватора какого? 😳

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

    обратную сторону с флешки на диск.


    Reply
  7. J7ReW

    (6) По архивированию можно доработать. Нужна еще будет настройка, какие именно файлы/папки архивировать, так ведь?

    Как я понял, нужно не затирать имеющиеся файлы, а дописывать переименовывая к уже имеющимся?

    Reply
  8. FIGOR

    Да, было бы неплохо иметь возможность указать после архивирования к примеру таким образом:

    если файл-архив с таким именем существует (на флешке), то при копировании файла с диска на флешку

    либо: удалять исходный файл (на флешке)

    либо: дописать файл на флешку добавив к имени файла номер (001) либо дату создания файла-архива (01_10) (день_месяц)

    причем, количество номеров можно задать к примеру от 1 до 5 и тогда после записи пятого номера будет автоматически удаляться первый и на его место записываться новый первый номер. Таким образом можно иметь возможность получать копии не только текущие, но и предыдущие 5 штук.

    Я это из-за того пишу, что порою не имеет смысла копировать базу не заархивировав её, так как просто флешек не напасешся. Кроме того архив некоторых других вещей куда меньше места занимает чем в оригинале. Да и возможность иметь более ранние копии документов тоже плюс.

    Разворачивать обратно с флешки хотелось бы тоже иметь возможность в новую папку из более нового архива. Так дома уже есть база за предыдущий день и можно её не затирать а развернуть новый архив в новую папку на компьютере, к примеру в папку ..Базы бухгалтерии где уже есть папка с базой предыдущего дня. ..база_01_10 развернуть архив с датой от 02-10-2010 который помечен как 02_10 в папку ..база_02_10 . А если по номеру, то можно так:

    .. база_01 , база__02, а потом затирать имеющиеся на компе, переписывая заново, так как номер файлов-архивов опять начал идти с 01. Таким образом на компе мы будем иметь постоянно определенное количество версий баз, да и других файлов

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *