Пример работы с Oracle через OracleInProcServer




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

21 Comments

  1. sckif

    В данной статье рассматривается пример работы с СУБД Oracle через OracleInProcServer.

    Перейти к публикации

    Reply
  2. Ish_2

    Всё это хорошо. Но где же анализ ?

    Сравнение с другими способами ? (ВнешниеИсточникиДанных,ADODB)

    Зачем нам нужно такое соединение ? В чем его выигрыш ?

    В клиент-серверном варианте я должен устанавливать клиента Oracle на каждом клиенте 1с Прелприятия ?

    Reply
  3. BRT

    В моем случае такое соединение как раз пригодилось.

    По факту такой способ позволяет формировать запросы с необходимыми параметрами.

    Во вторых, у меня на части машин ODBC не работает.

    Клиент Oracle необходим даже при ODBC коннекте.

    Однозначно необходимая вещь.

    Reply
  4. pri_hod

    валится на строке

    session = Новый COMОбъект(«OracleInProcServer.XOraSession»);

    все установил что только можно

    {Форма.Форма.Форма(4)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса: Недопустимая строка с указанием класса

    Reply
  5. sckif

    (3) pri_hod, он не видит класс OracleInProcServer.XOraSession, попробуй удалить и заново поставить клиент Oracle, если не поможет попробуй на другой машине, возможно винда моросит у тебя.

    Reply
  6. pri_hod

    проблема в клиенте оракл. нужно использовать 32 битную версию

    Reply
  7. rago

    Зачем тут какие-то сравнения с другими способами подключения?

    Вещь действительно необходимая. Я вот использую на данный момент такое же подключение к БД Oracle, только работаю через внешние источники данных (пришлось, конечно, попотеть, чтобы подключить БД — получилось только через клиента Oracle тот, который в Ora92 ставится)

    Reply
  8. jake.cmlt@gmail.com

    Добрый день.

    А что делать, если используется 64-разрядный сервер? Пробую — при создании COMОбъекта 1с рушится. 1с — файловая.

    Reply
  9. Rom_Kat

    добрый день.

    При попытке подключения выдает ошибку ORA-12154: TNS:невозможно разрешить заданный идентификатор соединения

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

    Не подскажете куда копать?

    Reply
  10. BRT
    Затем сконфигурировать файл tnsnames.ora который находится в директории:

    …oracleora92
    etworkadmin

    В основном проблемы могут быть тут.

    Сам провозился с подобной ошибкой неделю.

    Снес «все» оракл настройки, заново сконфигурировал, не работало. При этом на другой машине где только что оракл поставили, завелась без проблем даже на 64 бит.

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

    В инете много статей по этому поводу.

    Reply
  11. freebsdd

    Дополнение есть — Ввиду сложности полноценной настройки С НУЛЯ Оракла, не хватает добавить инструкцию по установке Oracle Objects for OLE и ODBC. Я работал всё время с MS SQL — просто прелесть, с «первой буквы», вышла нужда подключаться к базе Oracle с 1С, для меня это вышла большая ЖОПА, 3-ий день уже долблю долбанный ОРАКЛ, сотни вкладок, часы и тоны инфы (кто то неделю, кто 2 недели). Сложновато с нуля его, вот была бы путная статейка.

    Reply
  12. DenisCh

    Я работал с ораклём через InstantClient’а — на 64 бит повозиться пришлось, но настроил в конце концов…

    Там хитрости в наличии длл, путях (точнее расположении нужных каталогов в порядке указания путей) и настройке TNS

    Reply
  13. freebsdd

    Установил ODAC 11.2, дела продвигаются, кстати, кто нибудь знает, при открытии этой обработки выдаёт сообщение: «Запуск программы невозможен, т.к. на компьютере отсутствует OCI.DLL…» Запускается терминально на Сервере, OCI.DLL Закинул уже и в System32 и в папку 1c, есть у кого нибудь опыт борьбы с этим?

    Reply
  14. freebsdd

    (11) DenisCh, Оо, а какие хитрости?

    Reply
  15. DenisCh

    (13) freebsdd, минимальный клиент не содержит каких-то длл (их я искал через depence browser), пути к бинам должны быть первыми в переменной Path, ну и правильно настроить TNS — но это меньшая из всех проблем…

    Reply
  16. freebsdd

    (14) DenisCh, а правильно настроить TNS, это только файл tnsnames.ora или ещё что то?

    Reply
  17. DenisCh

    (15) freebsdd, он самый, насколько я помню…

    Reply
  18. freebsdd

    (16) DenisCh, Вижу это давно было :))) Буду продолжать настраивать ДОракл! Спасибо Вам за советы!

    Reply
  19. Alex_grem

    Спасибо за статью, очень вовремя нашел!

    Reply
  20. ben_art

    Подскажите какой клиент лучше использовать и будьте так добры выложить его тут.)

    Reply
  21. sckif

    (19) ben_art, Качай с сайта Oracle, там он в свободном доступе есть.

    Reply

Leave a Comment

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