Сохраняемые дополнительные реквизиты без изменения закрытости конфигурации (доработан другой вариант)




Принцип обмена данными из 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='\

12 Comments

  1. ybatiaev

    (1) ifal, Тоже так думаю. В прикрепленных файлах было бы удобнее с одной стороны, но это дополнительная операция чтение-запись дополнительная. Пока отказался. А что может «почистить» данные хранилища в принципе? Новые формы?

    Reply
  2. ifal

    (2) у вас в любом случае чтение и запись, хранилище настроек тоже в базе хранятся.

    Хранилище настроек по большей части это такие данные, при потере которых целостность базы данных не пострадает, соответственно и требование целостности к этим данным другие. Например, при работе с СУБД Postgres был перепад напряжения и база оказалось поврежденной, после небольшого анализ причина была найдена в таблице пользовательских настроек определенной формы списка документа, решение было простое: очистить записи этой таблицы по определенному документу. Если тоже самое произойдет с настройками формы, где сделано хранение данных как у вас, уже так просто не решишь проблему. Другими словами, всему свое место.

    И еще момент, вы сохраняете данные для пользователя, которого нет в базе, на сколько я понимаю. Вот если сделать тестирование и исправление полное, интересно, удалить ли система эти данные, как записи, для которых нет ключевого объекта-пользователя.

    Reply
  3. ybatiaev

    (3) ifal, Пользователь точно есть. И он с правом администрирования базы данных. Без реального пользователя сохранить нельзя. По поводу второго варианта тоже есть решение уже. Вообще, на мой взгляд, оба решения «по нормальному» не верные и идут от ущербности расширения. Надо потестить 8.3.9.1850 ещё. Спасибо за ответ!

    Reply
  4. ifal

    (4) вот на счет «нормальности» таких решений абсолютно согласен!

    Reply
  5. Омский Домовой

    Иногда приходится чистить настройки пользователей в том числе и форм. В таком случае сохраненные там данные будут потеряны.

    Reply
  6. МимохожийОднако

    Можно попробовать использовать РС «Безопасное хранилище данных»

    Reply
  7. ybatiaev

    (6) Омский Домовой, Да, именно из-за этого и написал тут, хотелки клиента сделал, но и проблемы с формами известны. Тем более формы вообще имеют свойства меняться. Через год поменяются с управляемых на суперуправляемые и вcё. Поэтому этот вариант не хороший. Согласен с Вам. В 8.3.9.* вроде бы что-то обещают сделать

    Reply
  8. nikivr

    (7) МимохожийОднако,

    Подскажите пожалуйста как это правильно сделать или возможно есть готовые примеры разработки?

    Спасибо

    Reply
  9. ybatiaev

    (9) nikivr, так мы сейчас сделали в прикрепляемых файлах, поскольку файлы уже никто не удалит с сервера. Но прикрепляемые файлы и статистика не очень дружат. Сами понимаете, чтобы собрать статистику по 1000 записей нужно столько же раз произвести чтение. Но сейчас ставим 8.3.9.* и там ещё посмотрим варианты. Безопасное хранилище тоже небольшой выход. Напишу, как будет вариант.

    Reply
  10. nikivr

    (10) ybatiaev,

    Я ставил 8.3.9 чтобы полноценно начать пользоваться расширениями конфы. Создавать дополнительные реквизиты в расширении мы не можем.

    А чем вам не нравится РС Безопасное хранилище данных? Будет дольше читать из хранилища, нежели из прикрепленных файлов?

    Reply
  11. ybatiaev

    (11) nikivr, Немного загрузка. Но и это попробую.

    Reply
  12. ybatiaev

    (9) вот выложил реальный пример. Он работает нормально и уже давно. Потерь данных пока не предвидится. Код привёл — проверяйте. Если будут предложения — пишите.

    Reply

Leave a Comment

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