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




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

26 Comments

  1. Vladimir Litvinenko

    Полезная статья. Вроде бы интуитивно понятные вещи написаны, но, как было верно замечено, применяют их обычно не анализируя и не рассматривая как часть общей системы работы/обучения. Всегда полезно разложить всё по полочкам и посмотреть «сверху».

    Уже не в первый раз встречаю совет ознакомиться с GTD. Надо будет выйти за пределы Вики и книжки почитать.

    Reply
  2. Franco

    Благодарю!

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

    Reply
  3. kirmancino

    Интересная статья.

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

    Как говорится — за деревьями видишь лес.

    Reply
  4. Bukaska

    (3) kirmancino, Это как? Сто верст до небес… и все лесом-лесом…

    Reply
  5. Flashback1979SE

    (2) Franco, запостой решение приходит во время езды между клиентами))))) или домой, но чаще по дороге к клиенту))))). Ведь частенько времени в обрез)

    Reply
  6. makc2k

    Замечательная статья! Концепция обучения новичка подразумевает лишь подачу основ. То есть говорят — учи, но странно, что вооще никто не хочет научить человека учиться, это считается должно прийти с опытом. Если бы детям в школе давали материал по способам запоминания, алгоритмике решений, и т. д. у нас бы интелект нации был бы на очень высоком уровне.

    Reply
  7. LexSeIch

    Мир этому дому!

    Статья интересная и полезная (и не только для программистов). Жду продолжения.

    Reply
  8. DragonAgo

    Хорошие идея по работе программиста. Раньше переживала, а сейчас беру себя в руки, выслушиваю всех и пишу, рисую на бумаге, затем анализирую, и лишь потом начинаю творить. Но лучше всего всегда иметь ТЗ, чтобы сто раз не приходилось изменять наработанное, у пользователей хотелки постоянно растут. А в большинстве случае они просят такое, что волосы дыбом. Фильм Профессионал нарисуйте мне 9 перпендикулярных линий прозрачным цветом =)))

    Reply
  9. DAnry

    Спасибо за статью. Безусловно она имеет право на существование. Так сказать научная организация интелектуального труда програмиста. Плюс элементы психологического тренинга.

    Но мне кажется не следует усложнять.

    Reply
  10. SinglCOOLer

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

    Reply
  11. DoctorRoza

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

    Reply
  12. andmakarov

    Спасибо за комментарии!

    В статье нет особо глубоких идей или техник. Все достаточно знакомо.

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

    Причем человек вроде как все понимает, но в нужный момент начинает делать все не так.

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

    Reply
  13. OneS

    Статья ни о чем, самое главное в ней подпись с указанием фирмы.

    Ступор начинающего одноэсника порождается не знанием предметной области, объектно-ориентированного программирования вообще и реализации в конкретной платформе в частности и неумением пользоваться отладчиком. Поэтому и рецепт один: много работать над своими знаниями и умениями.

    Reply
  14. andmakarov

    (13) OneS, спасибо за ваш комментарий.

    Но проблема, которая рассматривается, как раз и написана про ту ситуацию, когда, цитирую: «по какой-то .. причине мы не можем пробежаться по коду отладчиком и понять весь алгоритм».

    Это чаще всего как раз проблемы платформы.

    Reply
  15. OneS

    (14) andmakarov, а теперь процитируем всю фразу:

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

    Вот неумение в купе с незнанием и отбивает всё желание.

    Проблемы платформы ищутся в доступном информационном поле: коллеги, интернет. У Вас как бы есть про изучение, но для начинающего реально важно научиться постановке правильного вопроса, что бы получить внятный ответ.

    Reply
  16. Spacer

    (11) DoctorRoza, вот с этим согласен. Не нашел в статье того что ожидал увидеть прочитав название.

    Автор заметил проблему, хорошо ее описал, и на этом фактически остановился приведя лишь общие рекомендации.

    Reply
  17. andmakarov

    (15) OneS, да, про ситуации, когда не рентабельно пробегаться по всему коду с отладчиком, возможно я зря написал 🙂 В этом случае правильнее всегда пробивать заказчика на, то чтобы разобраться до конца в коде.

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

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

    Спасибо за указание на этот момент!

    За умение задавать вопросы отдельное спасибо. Да, это я не описал.

    Reply
  18. andmakarov

    (16) Spacer, это первая часть статьи.

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

    Надеюсь там необходимой информации будет больше 🙂

    Reply
  19. alex_shkut

    А мне статья понравилась. Это как-раз опыт человека, который видит и понимает весь комплекс решения задачи. Взгляд глобально на процесс. Способ мышления топ-менеджера. Прочитав статью до конца люди теряют смысл заголовка, а ведь без этой преамбулы основной смысл этой книги будет во много непонятен… Да, книги. Потому как это только вступление.

    Reply
  20. mr.Kot

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

    Reply
  21. OneS

    Кстати, очень полезно не замыкаться только на 1С. ООП изучить на питон и C#, запросы по классическим учебникам по SQL. Вместо механического запоминания тут нужно писать вот так, придёт ясность и понимание физики процесса. Что, опять же, избавит от ошибок и стресса. 🙂

    Reply
  22. oleg212

    от общего к частному.

    Reply
  23. laf

    +Спасибо за статью. Подписываюсь на продолжение.

    Reply
  24. ula1c

    А мне очень понравилось — дать проблеме имя. Точно работает на успокоение, т.к. имя очерчивает границы проблемы в твоей жизни.

    Reply
  25. tisas77

    Спасибо за статью.

    Reply
  26. v3rter

    Программирование — это инструмент. Конечному потребителю интересно то, что вы этим инструментом умеете.

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

    Учите предметную область. Ту самую, с которой предполагаете работать — продажи, бухгалтерия, складской учет, производство и т.д.

    Reply

Leave a Comment

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