Объекты OLE из MS Access

Goalni

Новичок
Объекты OLE из MS Access

У меня есть база интернет магазина в формате mdb (MS Access, если кто не знает). В таблице с товарами есть поле типа "Поле объекта OLE", в котором хранится картинка. В PHP при выборке из БД данные в этом поле имеют вид: "151C33000200000011000E0014002500... и так ещё 610000 символов". var_dump говорит что это строка.
Соединяюсь с базой так:
PHP:
<? 
$dsn = 'odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\magazin\\db.mdb;Uid=Admin'; 
try { 

  $dbh = new PDO($dsn); 
  $q = $dbh->query('SELECT * FROM VID_TOVARA'); 
  //print_r($dbh->errorInfo()); 
  $q->setFetchMode(PDO::FETCH_ASSOC); 
   
  $one = $q->fetch(); 
  print var_dump($one['Foto']); 

} catch (PDOException $e) { 
  echo 'Connection failed: ' . $e->getMessage(); 
}
Полагаю что это упакованный объект OLE. Возможно нужно вызвать соответствующий COM-объект и передать ему эту строку:
PHP:
<?
//... этот код, конечно же, не работает
$img = new COM('Ole.Image'); 
$img->GetFromString($one['Foto']); 
$img->FetchToOutput();
И всё же, как вытащить картинку из этого поля?

-~{}~ 04.05.09 17:18:

Вот полный текст этого поля: http://narod.ru/disk/8340054000/fucking-ole.txt.html
 

dimagolov

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

Goalni

Новичок
Такой вариант не подойдёт. Мне не в кайф 10000 картинок вручную вытаскивать. Тем более что группа манагеров по отлаженой схеме каждую неделю обновляет ассортимент, в том числе и эти картинки.
Мне нужно полностью автоматизировать операцию "вытащить картинку из базы". В идеале карточка товара должна выглядеть так:

Название: ATmega256
Производитель: Atmel
Семейство: megaAVR
Характеристики: ...
...
Фото: <img src="/image.php?id=3832">

-~{}~ 04.05.09 18:03:

А, собственно, в image.php из БД по идентификатору вытаскивается картинка и выводится в браузер.
 

findnext

Новичок
ну если вариант предложенный dimagolov не подходит, то тогда можно написать небольшую утилиту на каком нибудь системном языке (си или делфи к примеру) и пользоваться этой утилитой. Алгоритм
dimagolov уже описал
 

dimagolov

Новичок
Goalni еще не понял, что держать backend DB на Access это не удачное решение. Видимо, они годами юзади эту хрень для герерации прайсов, а теперь решили сделать для нее web-морду.

Придется делать нормальную DB и писать админку для манагеров, а существующую как-то конвертить. Кстати, VBA Access-овский должен уметь сохранить картинку в файл, пусть даже в .bmp, потом их можно будет пакетно конвертнуть.
 

AmdY

Пью пиво
Команда форума
по ссылке fixxxer уже всё есть, в том числе прога для вытаскивание данных.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
М... я туплю, или BLOB и OLE несколько разные вещи?
т.е. OLE поле в базе я могу понять. С натягом, но могу задней коркой мозка представить. Если это то, о чем я подумал, и для просто бинарных данных есть свой тип поля. Но вот если то что я понял - верно, как можно было туда додуматся картииинки пихать?
 

Goalni

Новичок
Видимо, всех смутило описание гипотетической ситуации. Поэтому спрошу конкретно. Как из строкового представления OLE-объекта получить данные, инкапсулированные в нём?
 

Активист

Активист
Команда форума
Вот этот код

PHP:
<?php
$str = file_get_contents("fucking-ole.txt");
$str = preg_replace_callback ("([a-zA-Z0-9]{2})", create_function ('$matches', 'return chr (hexdec ($matches[0]));'), $str);
file_put_contents("whatisit.txt", $str);
?>
Выдал мне что-то читабельное (вида [bin data]Точечный рисунок Paint.Picture[bin data]), но картинка не открылась.
 

fixxxer

К.О.
Партнер клуба
там кажись ровно та же структура которая в клипборде хранится.
 
Сверху