Арканоид для 7.7




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

27 Comments

  1. salexdv

    Круто! 🙂

    Reply
  2. Арчибальд

    (1) Как всегда ;))

    Reply
  3. Ish_2

    Страстно !

    Reply
  4. Noy

    Монстр! (в хорошем смысле этого слова)

    Reply
  5. Altair777

    Не знаю как кому, а мне в разработках Ёпрста(!) код смотреть гораздо интереснее 🙂

    Много нового и полезного можно узнать.

    Reply
  6. venger

    А ВК используются? Еще из прикольных пакмэн был, бегал кушал точки по лабиринтам, вдруг когда накатит написать.

    Reply
  7. Noy

    (6) Formex обязателен, класс привязок (1С++) по желанию.

    (0) Как элементы формы посмотреть?

    Reply
  8. venger

    (7) Небось пустой слой стоит для элементов формы;) В конфигураторе по крайней мере в меню «Диалог->Настройка порядка обхода…» можно увидеть список элементов формы с типами и идетификаторами, если галка «Автомат. порядок обхода» снята в том же меню.

    Reply
  9. Noy

    (8) это понятно, но я до сих пор не понял, как их посмотреть (поменять слой). Понимаю что можно компаунд поправить ручками, но знаний не хватает. Может есть более штатный способ?

    Reply
  10. Noy

    Кто уже прошел все уровни, прошу сюда: http://infostart.ru/projects/6081/

    🙂

    Reply
  11. Noy

    (0) Надеюсь автор не против?

    Reply
  12. Ёпрст

    (9) ну не знаю… текстовый файл + Ctrl+H куды уж проще…

    А все контролы создаются обработкой — на выходе обычный текст, далее, дело техники.

    Ну не руками же 200-300 атрибутов рисовать 🙂

    (11) нет..

    Reply
  13. Noy

    (0) Подправь, плиз, строчку

    СоздатьУровень(Мин(НомерУровня,3),НомерУровня);

    а то дальше третьего уровня никак не могу пройти 🙁

    Reply
  14. Ёпрст

    (13) поправил..

    Reply
  15. jhfrek

    Круто! Ёпрст истинный Гений!

    Reply
  16. CheBurator

    Прикольно!

    сделай еще чтобы если мышь за пределами формы НО ДВИЖЕТСЯ — чтобы ракетка тоже двигалась! а то ракетка не двигается пока курсор в форму не попадет! и даешь полноэкранный режим!!

    Reply
  17. CheBurator

    А почему нет решалки от Арчибальда? Т.е. за какое минимальное число ходов можно выбить весь уровень ? (базируемся только на правилах геометрической оптики) — вот это было бы интересно!

    Reply
  18. support

    Прикольно!

    Есть небольшой нюанс, когда мячик начинает двигать ровно по-горизонтали, то он так может двигаться до бесконечности.

    Reply
  19. Ёпрст

    (18) Есть такое, пока лечится изменением размеров формы, если есть Общие.Форма.Привязки..

    поправлю попозжее.

    Reply
  20. support

    (20) Кстати, а где призы, который выбиваются из кирпичей? Замедлитель, ускоритель, жизнь, смерть, расширитель, уменьшитель, прилипалка и т.д вплоть до бомбы и пулемета. Еще есть кирпичи повышенной прочности, который разбиваются после двух, трех ударов, на них еще либо счетчик или изображение меняется.

    Reply
  21. Ёпрст

    (20) да можно всё прилепить… Время только..

    Да и с «Рикошетом» бодаться тяжело..

    А вот кирпичи (количество ударов задается) и так присутствуют уже..

    Reply
  22. Ёпрст

    +21 Вот хотя-бы пару «шариков» , можно приклеить.. как бонус.

    Reply
  23. McSeem

    Еще бы кнопку выхода из игры сделать. Пользователям без нее неудобно. 🙂

    Reply
  24. trdm

    Вау, круто 🙂

    Reply
  25. Ёпрст

    (24) Где ты был 4 года ?

    :))

    Reply
  26. trdm

    (25) жил своим умом, а тут понадобился файло с инфостарта, вот зашел.

    Reply
  27. Ёпрст

    (26) ну ясно.. просто поделке 4 года ужо

    🙂

    Reply

Leave a Comment

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