Игра "Цифры"




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

15 Comments

  1. ASDF2

    а куда пропали бонусы из 8.1?:)

    Reply
  2. Cube_krsk

    Какие бонусы?

    Reply
  3. ASDF2

    а куда пропали бонусы из 8.1?:) Выглядит неплохо, жаль 8.2 под рукой нет.

    Reply
  4. zuza

    (0) помниться в универе на парах игрались в такую…, только на тетрадных листах в клетку :)))

    Reply
  5. Широкий

    Много глюков

    Reply
  6. Cube_krsk

    (5) Монитор включать в розетку пробовал? 🙂

    Reply
  7. Широкий

    (6) Раз уж выложил игруху — так доведи ее до ума.. остряк

    Reply
  8. Cube_krsk

    (7) Раз хочешь что-то сказать, то говори, чтоб тебя понимали. Какие запросы кидаешь, такие ответы и получаешь, умник…

    У меня всё работает.

    Reply
  9. chipwolt

    А вот современная версия Циферок! В ней в дополнение к классическому варианту, есть еще и несколько новых типов игры и дополнительные возможности. Мне очень понравилось: http://udigits.com/

    Reply
  10. PanKir

    обожаю эту игру…

    помнится даже один раз закончил её с минимальным количеством строк, толи 6 толи 7, уже не помню…

    правда вот как это сделал — тоже не помню и даже сразу после такого выигрыша не смог уже повторить его (((

    Reply
  11. PanKir

    немного тормознуто всё проделывает, но на работе спешить некуда, поэтому не так это и страшно…

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

    хороший плюс — есть история ходов аж с самого начала — можно вернуться на спорный вариант…

    Reply
  12. Cube_krsk

    (10) PanKir, у меня есть сейв, где я выиграл за 10 ходов. Давно уже не играл, но, кажется, меньше не получалось…

    Reply
  13. Cube_krsk

    (11) PanKir, Это был мой первый опыт работы с управляемыми формами, так что вполне возможно, что где-то сделано не оптимально… 🙂

    Reply
  14. PanKir

    (12) ну может и 10, я уже не помню…

    недавно сделал за 11 кажись, но не сохранил 🙂

    (13) ну я вообще пока боюсь к тонкому клиенту подходить… как-то решил на фри-лансе сделать задание, так только красивую оболочку сделал и на этом застопорился…

    так а для толстого клиента вариант игры есть? ну или хотя бы может в планах?.. :-[

    Reply
  15. Cube_krsk

    (14) PanKir, всё равно все перейдут на управляемые формы, вопрос времени.

    А игру под обычные формы я уж точно переписывать не буду, т.к. времени совсем нет, да и смысла особого не вижу 🙂

    Я под УФ-то написал только потому, что хотел получить опыт в управляемых формах, а два года назад реальных задач под УФ вообще не было… Вот и пришлось придумать себе задачу)

    Reply

Leave a Comment

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