Корпоративный слон




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

21 Comments

  1. alexey_kurdyukov

    Хронологии-то почему нет!

    Reply
  2. manlak

    Грустная история, я ожидал более грандиозной развязки

    Reply
  3. piskunov.maksim.a

    Поучительно и интересно, только наверное не хватает какой то концовки-результата.

    Reply
  4. Aggressorak

    (3) Ну дык результат как бэ есть. Кредит на тачку диреку платить придёться из своих по ходу…

    Reply
  5. piskunov.maksim.a

    (4)Ахах, ну если за результатом считать недалекость руководства той компании, то да, результат есть. Хотя признаюсь, по прошлым статьям у меня о Светлане было лучшее мнение)

    Reply
  6. Silenser

    (4)В реальном мире директор получит премию.

    Reply
  7. KapasMordorov

    Программист здесь неуправляем.

    Захочет — сделает следующего слона, не захочет — не сделает.

    А директор хочет премию, будет стараться — вот её и надо мотивировать, машина должна быть её.

    Но ситуация сложилась против неё, и виноват в этом программист — устроил в организации личные эксперименты, никого не известив. А если бы не сложилось, убыток он компенсировал?

    В крупных конторах кстати, никаких колонок с процентом Виллера появиться без заказчика со стороны бизнеса не может.

    Так что слон получился не корпоративный, а ларёчный.

    Reply
  8. 1c-intelligence

    (6) так директор и получил.

    Reply
  9. 1c-intelligence

    (7)

    В крупных конторах кстати, никаких колонок с процентом Виллера появиться без заказчика со стороны бизнеса не может.

    насколько крупной должна быть контора, чтобы это правило действовало?

    Reply
  10. dlebedev8

    (9) уже почти трупом. Из-за бюрократии.

    Reply
  11. dlebedev8

    Все грустно и красиво было, пока программисту слово не дали. То, что он описал, к работе программиста никакого отношения не имеет. Это работа системного архитектора, методолога, если хотите попроще. А программист, как и все остальные — простой исполнитель, причем чаще всего не самой высокой квалификации!

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

    Reply
  12. 1c-intelligence

    (11) он директор по развитию и бывший программист.

    Reply
  13. user1274438

    Отсыпьте и мне таких грибов!

    Reply
  14. 1c-intelligence

    (13) так вам уже отсыпали, судя по аватарке 🙂

    Reply
  15. galich

    Да, Серега, с таким настроем ты слона не продашь… (с) Старый анекдот

    Выставлять всех директоров идиотами, которые настолько тупы, что им ничего и рассказывать не надо — согласен с предыдущими ораторами, контора уровня ларька. В серьезных конторах директора в большинстве своем прекрасно знают тонкие места своих и смежных процессов + понимают масштаб изменений. А уж по пятидесятому разу рассказывать им про теорию ограничений, которую с середины девяностых только из утюга не транслируют, это вообще за гранью добра и зла.

    Ситуация больше похожа на планерку программеров, где три джуниора, один мидл и Серега в роли тупого, заносчивого сеньора.

    Reply
  16. user1274438

    (14) Мне разных отсыпали. Но таких еще не пробовал.

    P.S.

    Если здесь всерьез кто-то пытается это обсуждать, то это или «так тонко, что даже толсто», или одно из двух.

    Reply
  17. vursan

    (4) Она премию уже получила и потратила. Поэтому замолчать и хотела. У нас так тоже было..

    Reply
  18. vursan

    И собственник такой в конце:»Теперь сверх того что вы сделали с этого момента является новой нормой» 🙂

    Reply
  19. Glebis

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

    Reply
  20. Glebis

    (18) Дык этож разовое закрытие долгокомпануюшихся висяков.

    Reply
  21. dlebedev8

    (12) Сразу не приметил. Ок 🙂

    Reply

Leave a Comment

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