Игра "Пятнадцать спичек" (разновидность игры "Ним")




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

36 Comments

  1. salexdv

    В обед погонять — самое то! 🙂 +

    Reply
  2. venger

    (0) Буду благодарен за тестирование алгоритма игры компа, писал на скорую руку, мог что-то и не учесть… Выиграть реально, если ходишь первым…

    Reply
  3. Tatitutu

    чуть не убил компьютер. А чего он все время побеждает )))

    (1) коротковат у тебя обед

    Reply
  4. salexdv

    (3) Ну эт смотря как гонять :))))

    Reply
  5. Tatitutu

    (4) Согласен. Не поспоришь.

    » — А ты кто ?

    — Говорящий пес Артемон. Гав !

    — Так говорите у Вас нет коробка — боробка ?!?!!!» (с) КВН

    Reply
  6. Ёпрст

    Да… убери ты к едрени фени Это:

    «Примечание: отчет/обработка всегда должен быть внешним.»

    И встроенный отчет можно открывать модально.

    Reply
  7. venger

    (6) Как узнать «свое» имя во встроенном отчете/обработке? Я не в курсе просто… Подскажи, в общем, чего уж там…

    Reply
  8. seven77782

    Все время выигрывает компьютер

    Reply
  9. Ёпрст

    (7) Если нет ВК, то тупо прописать его в самом отчете.

    А дальше проверять на Форма.МодальныйРежим()

    Reply
  10. Ёпрст

    +9 аналогично работают все кнопки «Обновить» и «Настройка» во всех типовых отчетах — тупо передается имя отчета, как из метаданных.

    Reply
  11. Ёпрст

    (8) я пока тоже не выиграл..

    лень смотреть…

    Reply
  12. Ёпрст

    +11 но чуствую — глобальное наипалово на всех уровнях общества :))

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

    (8) Ходи первым!

    Reply
  14. Ёпрст

    (13) не спасает.

    Reply
  15. venger

    (9) Вот и я к тому, что если вставили в конфу с другим именем — то привет…

    Reply
  16. Ёпрст

    (15) ну дык с умом нужно вставлять..

    Reply
  17. venger

    (16) Со знанием, скорее:-) А кто просто чуток пользователь или админ, и особо не в курсе тонкостей 1С и конфигуратора, тому не лишне будет и написать, чтоб не парился, а тот, кто знает, тому оно не помешает…. ИМХО, конечно. Но все-равно спасибо, ибо не оскуднеет источник мастерства твоего, чтоб было всегда чему поучиться у тебя!

    Reply
  18. Tatitutu

    Шурик на как вариант ))))

    Процедура ПриОткрытии()

    Если Форма.МодальныйРежим()=0 Тогда

    Для Сч=1 По Метаданные.Отчет() Цикл

    Если Прав(Метаданные.Отчет(Сч).Комментарий,6)=»Венгер» Тогда

    ОткрытьФормуМодально(«Отчет.»+Метаданные.Отчет(Сч).Идентификатор);

    СтатусВозврата(0);

    Прервать;

    КонецЕсли;

    КонецЦикла;

    Для Сч=1 По Метаданные.Обработка() Цикл

    Если Прав(Метаданные.Отчет(Сч).Комментарий,6)=»Венгер» Тогда

    ОткрытьФормуМодально(«Обработка.»+Метаданные.Отчет(Сч).Идентификатор);

    СтатусВозврата(0);

    Прервать;

    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры

    Reply
  19. Ёпрст

    (18) И откуда Комментарий брать во внешнем отчете ?…

    Reply
  20. venger

    (18) Комментарий и синоним во внешнем не остается… Если его вставить в конфу, то комментарий будет пуст…. только что пробовал… Но юмор заценил…:-)))

    Reply
  21. Tatitutu

    (19) )))) молодца — быстро мышей ловишь. Как вариант )))

    Reply
  22. Tatitutu

    (6) Сань конечно у тебя самомнение — Высший класс !!!

    Или на лоха расчитано.

    Я бы хотел посмотреть тому в глаза, кто бы твои «спички» прикрутил бы к конфигурации ЗИК или ПУБ.Я бы ему их в глаза бы и вставил )))

    Reply
  23. venger

    (22) Грубоватая провокация:-)))) Но мож кто и клюнет:-))))

    Reply
  24. venger

    +23, или я не догнал, короче не важно, кто куда чего вставит:-)))

    Reply
  25. venger

    +24, главное наперед предусмотреть все возможные действия пользователя — это и есть мастерство:-))

    Reply
  26. СССР

    Молодец ! А я пока «лузер»…до по следующей среды. Проект сдаю — времени нет на «игрушечки»,хотя пару интересных идей есть в голове.Моего ПЕРЕВЕРТЫША осилил или несмотрел даже ?

    Reply
  27. venger

    (26) > Проект сдаю — времени нет на «игрушечки»

    Без проблем, понятно, что время не резиновое, да и помимо работы еще куча всего есть, так что тут без напрягов.

    > хотя пару интересных идей есть в голове

    Как-нибудь, как появится время, в фоновом режиме, и главное желание, то будет классно, если чего еще релизуете в удовольствие.

    > Моего ПЕРЕВЕРТЫША осилил или несмотрел даже ?

    У меня боролись два желания (тоже из-за ограниченности по времени) — погонять в Ваши или сваять свои, вот разрываюсь надвое:-)

    Да и все-равно было приятно, а победила дружба, что самое главное!

    Reply
  28. Lexus

    я знаю другую версию, там нет разбивки по рядам и ограничения в количестве спичек.

    в таком варианте чтобы выиграть надо всегда оставлять противнику количество спичек равное степени двойки за вычетом единицы, т.е. (2#k8SjZc9Dxk2-1), (2#k8SjZc9Dxk3-1), (2#k8SjZc9Dxk4-1) и т.п.

    Reply
  29. Abadonna

    ХЗ, как работает движок? Плюс, чтобв не пакостили

    Reply
  30. CheBurator

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

    Reply
  31. CheBurator

    а вот еще раньше без всяких компов, на спичечных коробках была самообучаемая машина по игре в крестики-нулики…

    Reply
  32. Shaman100M

    на пальцах можно выйграть если знать секрет

    Reply
  33. venger

    (28),(32) Можно усложнить, добавить еще ряд с 11-й спичками, т.е. 4 ряда — 3,5,7,11 и т.д. Простые числа в рядах должны быть, вроде как, т.е. 5-й ряд если добавлять, то 13 спичек и т.д. Можно поменять условие — побеждает тот, кто последний взял. В общем, как-нибудь, надо будет развить идею…

    Reply
  34. venger

    (31) Ух-ты, где бы поподробнее об этом узнать? Про такую самообучаемую машину, да еще на спичечных коробках…..

    Reply
  35. Shaman100M

    (34) без разницы, сколько рядов, какое количество, главное, правильно выбрать, кому первым ходить.

    Reply
  36. lilly

    Забавная игра))) Раньше такую не встречала)))

    Reply

Leave a Comment

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