А вот этот тест уже на пределе возможностей




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

39 Comments

  1. venger

    Кстати, дал еще тогда решить ее своей девушке, так она взяв листик и ручку за полчаса таки решила. Был опозорен, короче, дальше некуда;-)))

    Reply
  2. Sergey K

    Старенькая задачка.. Но простой таблички достаточно, чтобы ее решить..

    полчаса это максимум, что потебуется для нее..

    Reply
  3. Ёпрст

    Все баяны будешь постить сюда ?

    Reply
  4. venger

    (3) Больше у меня нет под рукой;-))))

    Эти два, чтоб идею передать, что не только на плюсики и на объем знаний надо внимание обращать:-)))

    Возможно это подвигнет создать рейтинг на сайте на основе IQ, например:-)))

    Reply
  5. venger

    (+4) Тем более далеко не для всех это баян

    Reply
  6. luns

    + За идею.

    Reply
  7. AndrewEv

    Поддерживаю начинание — сделаем библиотеку тестов в 1C!

    Reply
  8. soltik

    несоответствия с задачкой на wiki

    ТУТ Wiki

    9. Немец живет в первом доме Норвежец живет в первом доме.

    сигареты другие больше лень искать, и ничего бы страшного но как проверить разгадку, я на листочке решал 🙂

    Reply
  9. venger

    (9) Ответ по тем условиям, что приведены здесь (в архиве есть картинка, с правильным ответом, помимо исходников):

    http://venger.narod.ru/storage/C_einshtein.zip

    Reply
  10. venger

    (+10) Или скачай прогу, что здесь выложена и там есть кнопка, чтобы получить правильный ответ.

    Reply
  11. venger

    (+11) Или можно скомпилировать исходники С++, что по ссылке, запустить и тоже получить ответ в досовском окне.

    http://venger.narod.ru/storage/C_einshtein.zip

    Хотя там есть и картинка с правильным ответом по этим условиям.

    Reply
  12. soltik

    хорошо 🙂 спасиб, проверился я все нормально 🙂

    Reply
  13. max1c

    prolog

    Reply
  14. vadver

    Решил в свое время за 20 мин. Не особо сложная задачка.

    Reply
  15. venger

    (15) В уме или на листике?

    Reply
  16. CheBurator

    тупая задача…

    5 животных, упомянуты владельцы четырех:

    — собка

    — кошка

    — лощадь

    — птица

    вопрос: Кто содержит рыбок?

    ответ: хз… пятый владелец может содержать рыбок, а может и морских ежиков…

    Reply
  17. Кузьмич

    Фигасе у вас там на работе какие глобальные мега-производственные задачи ставятся :)))

    Reply
  18. rutal

    На листочке решить несложно. Спасибо за развлечение!

    Reply
  19. NoMax

    Стоит четырехэтажный дом, в каждом этаже по восьми окон,

    на крыше — два слуховых окна и две трубы, в каждом этаже по

    два квартиранта. А теперь скажите, господа, в каком году умерла

    у швейцара бабушка?

    🙂

    Reply
  20. sml

    мне удалось решить за 40 минут, потратив 2 листа бумаги.

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

    ИМХОется, если напрячь мозг, то можно составить алгоритм решения подобных задач методом Гаусса.

    Reply
  21. alexpvs

    Года полтора назад ходила эта задачка по Инету. тогда тоже решил не напрягаться с письменным решением, написал прогу на С++

    Reply
  22. Altair777

    (21) > я решал минут 20, потом забил, лень время тратить. 😉

    фиксин, конечно, тебе не стоит браться за такие задачи. Береги себя!

    Попробуй для начала про лодку, капусту, волка и козла 😉

    Reply
  23. defini

    (24) Отжег!!!

    ацкий сотона )))))))))))))))))))

    Reply
  24. Abadonna

    (24)>Попробуй для начала про лодку, капусту, волка и козла 😉

    ……… КОЗЛА…..

    В доме повешенного о веревке не говорят!

    Reply
  25. Altair777

    (26) > В доме повешенного о веревке не говорят!

    Увы, еще не повешенного 🙁

    т.е. повешеннего в виде макарон на наши бедные ушки и еще более бедные глазки



    О Великий и Могучий Support!

    Ниспошли нам, грешным, новую версию сайта без фиксина!

    А хотя, можно и оставить его. В режиме read-only 🙂

    Reply
  26. PeRom

    Задачка конечно непростая, минут 15 заняла на бумажке. Без бумажки думаю попозже попробовать (как я понял там вариантов независимых куча).

    Спасибо за зарядку остатков мозга!

    Reply
  27. Злобный Фей

    Господа! Тренируйте мозги. На кой хрен вам бумажки, если в голове все можно нарисовать, записать и вычислить? Развивайте образное мышление, изучайте мнемонику, и будет ва щастье 🙂

    ЗЫ: сабж — рваный баян, но всё равно +

    Reply
  28. necropunk

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

    Reply
  29. vvv4520

    ту 20

    отлично, Швейк в тему))

    Reply
  30. Душелов

    Уже разбанили? 🙂

    Reply
  31. Altair777

    (33) пустили козла… только не в огород… ммм…

    пустили козла со свиным рылом в калашный ряд 🙂

    Reply
  32. inkko

    До сих поражаюсь танцам вокруг «задачи эйнштейна». Не верю, что задачу придумал Эйнштейн и тем более, что он сказал о 98 процентах, которые её решить не смогут. Задача была решена семью различными молодыми людьми в офисе франчи в возрасте 21-25 лет за 15-30 минут на бумаге. Ни один из тех, кто был насильно посажен за задачу не спасовал. Решить ее не смогут только 2% да и то если они лентяи

    Reply
  33. venger

    (35) За что купил, за то и продал:-)

    Reply
  34. Altair777

    (35) Тем не менее, не существует никаких документальных свидетельств того, что Эйнштейн когда-либо утверждал подобное.

    http://ru.wikipedia.org/wiki/Задача_эйнштейна

    Reply
  35. inkko

    (37) Да, да 🙂 я прочел внимательно Вики после своего сообщения.

    Reply
  36. YuraSt

    Весь смысл в том, что бы в уме решать эту задачу, а не на листке бумаги.

    Reply
  37. marsohod
  38. Art77

    В уме решить не смог. только на листке

    Reply

Leave a Comment

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