Есть задача.
Нужно писать двоичные данные в BLOB поля базы MySQL. Данные берутся из файлана диске.
Сложность заключается в том, что двоичные данные перед их вставкой в SQL запрос к базе данных должны специальным образом обрабатываться (это как я понял заменяться символы кавычек, переносов каретки, итд...).
В инетрнете инфа по этому крайне скудная, но описывается 3 способа.
1. Цитата
SELECT QUOTE("$jpg")
, где $jpg это переменная с бинарными данными, а потом результаты этого запроса вставляем в запрос с занесением данных. Ну или может как-то попроще но суть такова что свма БД готовид данные для занесения в БЛОБ.
2.
Цитатаmy $sql = "UPDATE `m_snif` SET pic1=? WHERE id=$id";
my $sth = $db->prepare($sql) or do {
die "It didn't work. [$DBI::errstr]\n";
};
$sth->bind_param(1, $jpg);$sth->execute or do {
die "It didn't work. [$DBI::errstr]\n";
};
Так называемый способ bind_param после prepare.
и
3. это просто самому заменять спец символы через регулярные выражения
Цитата$jpg =~ s///g;
$jpg =~ s/00//g;
$jpg =~ s/'/'/g;
$jpg =~ s/"/"/g;
$jpg =~ s/\t/\\t/g;
$jpg =~ s/\n/\\n/g;
$jpg =~ s/\r/\\r/g;
$jpg =~ s/\b/\\b/g;
$jpg =~ s/\0/\\0/g;
Это конечно все очень замечательно, что так много способов существует. Но они все не работают!!!
Помогите! Как? Может кто делал?Да к стати. Чтение из файла происходит вот так:
Исходный кодopen JPG, "</usr/home/Osirix/pics/00000001.jpg" or die "$!";
binmode (JPG); # Только ли в Windows нужа эта строка?
$jpg = <JPG>;
close JPG;
Ну и сответственно все это крутится не под виндами, а под Фрей.
Привет,Занесение картинок в БД - само по себе неправильно. Суть БД состоит в том, чтобы иметь мссив данных, в котором можно вести поиски. Вески (смысленный) поиск в двоичных данных картинки, конечно, невозможно. На все остальные случаи жизни есть файловая система.
Поэтому если вам нужно связать объект в БД с картинкой, просто занесите в БД путь к этой картинке - сэкономите массу времени и ресурсов.
WWell,
>Привет,
>
>Занесение картинок в БД - само по себе неправильно. Суть БД состоит
>в том, чтобы иметь мссив данных, в котором можно вести поиски.
>Вески (смысленный) поиск в двоичных данных картинки, конечно, невозможно. На все
>остальные случаи жизни есть файловая система.
>
>Поэтому если вам нужно связать объект в БД с картинкой, просто занесите
>в БД путь к этой картинке - сэкономите массу времени и
>ресурсов.
Зато удобно сделав дамп базы иметь в нем весь сайт.
Не нужно думать о правах на дирректории куда эти файлы в вашем случае должны будут писаться.
Вообщем в этом тоже что-то есть.
>Занесение картинок в БД - само по себе неправильно. Суть БД состоит
>в том, чтобы иметь мссив данных, в котором можно вести поиски.
>Вески (смысленный) поиск в двоичных данных картинки, конечно, невозможно. На все
>остальные случаи жизни есть файловая система.
>
>Поэтому если вам нужно связать объект в БД с картинкой, просто занесите
>в БД путь к этой картинке - сэкономите массу времени и
>ресурсов.Если бы мне этго было не нужно, я бы не спрашивал.
Мне проще держать сотню картинок в БД, чем поднимать лишние сервисы на удаленных серверах что бы апач смог до них добраться.К тому же в Mysql специально придуман тип данных BLOB, так почему туда нельзя записать то для чего он предназначен?
Я придумал способ как это обойти. Перекодировать картинки допустим в base64 и запихать их в BLOB как текстовую информацию, но мне это решение не нравится, в подобном случае я могу их и в TEXT запихать...
Чушь какая-то...
Все я сам разобрался. =)
Вся проблема была ы считывании из файла в переменную.
Надо делать вот так:
open JPG, "</usr/home/Osirix/pics/00000001.jpg" or die "$!";
$doc_len = read JPG, $jpg, 999999;
close JPG;ну и потом:
$sth=$db->prepare("UPDATE `m_snif` SET pic1=? WHERE id = $id") || die "$dbh->errstr\n";
$sth->execute($jpg) || die "$sth->errstr\n";
>Все я сам разобрался. =)
>Вся проблема была ы считывании из файла в переменную.
>Надо делать вот так:
>open JPG, "</usr>$doc_len = read JPG, $jpg, 999999;
>close JPG;
>
>ну и потом:
>$sth=$db->prepare("UPDATE `m_snif` SET pic1=? WHERE id = $id") || die "$dbh->errstr\n";
>$sth->execute($jpg) || die "$sth->errstr\n";$qjpg = $dbh->quote($jpg);
$dbh->do("UPDATE m_snif SET pic=$qjpg WHERE id=$id")