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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *