Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[Perl] images naar MySQL blob

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik heb een scriptje geschreven om heel veel jpg-plaatjes in een MySQL database te zetten, maar dit gaat niet helemaal goed. Ten eerste krijg ik bij sommige jpg'jes een mysql-foutmelding:

code:
1
2
3
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds toDyour MySQL server version for the right syntax to use near 'Þ¾H¸³
Cã
ÔÛç7$b¨¾VeA}Kh«AQSÚØtÁ¥GOÆõß|1ÊGV'' at line 2 at ./todb.pl line 45.


Daarnaast, bij de foto's waar ik geen foutmelding krijg, krijg ik een vaag plaatje als resultaat, zie: http://severjanin.nl/photos/1/tn_6.jpg

Kan iemand mij vertellen wat ik verkeerd doe?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/perl -w
use strict;
use DBI;
use YAML qw(LoadFile);;

our $conf = LoadFile("../../config.yaml");
my $driver = 'mysql';
my $database = $conf->{mysql}{db};
my $host = $conf->{mysql}{host} || "localhost";
my $MySQLport = $conf->{mysql}{port} || '3306';
my $dsn = "DBI:$driver:database=$database;host=$host;port=$MySQLport";
our $dbh = DBI->connect($dsn, $conf->{mysql}{user}, $conf->{mysql}{pass});

$dbh->do("DROP TABLE fotos");
$dbh->do("create table fotos (album int, foto int, name varchar(150), description text, part int, file mediumblob, tn blob, primary key(album, foto))");

opendir(DIR, ".");
while (my $d = readdir(DIR)) {
  next if ($d =~ /^\.\.?$/);
  next if (!-d $d);
  next if ($d =~ /\D/);
  my $album = $d;
  opendir(DIR2, "$album");
  while (my $p = readdir(DIR2)) {
    next if ($p =~ /^\.\.?$/);
    next if ($p !~ /^(\d+)\.jpg/);
    my $photo = $1;
    print "$album/$photo.jpg\n";

    open (FILE, "$album/$photo.jpg") || die $!;
    my $file = "";
    binmode FILE;
    $file .= $_ while (<FILE>);
    close FILE;
    $file =~ s/"/\\"/g;

    open (TN, "$album/tn_$photo.jpg") || die $!;
    my $tn = "";
    binmode TN;
    $tn .= $_ while (<TN>);
    close TN;
    $tn =~ s/"/\\"/g;

    $dbh->do("INSERT INTO fotos (album, foto, name, description, part, file, tn)
      VALUES ($album, $photo, '', '', 0, \"$file\", \"$tn\")");
  }
  closedir(DIR2);
  
}
closedir(DIR);

  • Japidoff
  • Registratie: November 2001
  • Laatst online: 28-09 09:54
ik spreek geen perl, maar aan de " ' " in de foutmelding te zien moet je je foto's escapen.

enne foto's in een db? je zal er vast een hele goede reden voor hebben, maar een db als filesystem gebruiken is meestal af te raden...

dat wisten ze zelf in 2000 al:
http://gathering.tweakers.net/forum/list_messages/53624


edit:

zijn dit ook niet een beetje basisfouten?

[ Voor 26% gewijzigd door Japidoff op 11-07-2008 17:28 ]

gang is alles


Verwijderd

Topicstarter
Japidoff schreef op vrijdag 11 juli 2008 @ 17:24:
ik spreek geen perl, maar aan de " ' " in de foutmelding te zien moet je je foto's escapen.

enne foto's in een db? je zal er vast een hele goede reden voor hebben, maar een db als filesystem gebruiken is meestal af te raden...

edit:

zijn dit ook niet een beetje basisfouten?
foto's zijn geescaped met de regel '$file =~ s/"/\\"/g'.

Over foto's in een db: het is aanzienlijk makkelijker te onderhouden. En dit artikel zegt dat het geen probleem hoeft te zijn. http://www.phpriot.com/articles/images-in-mysql

  • Japidoff
  • Registratie: November 2001
  • Laatst online: 28-09 09:54
ik spreek geen perl, dus wat die regel doet zegt me niks maar let je ook op de enkele aanhalingstekens of backtick of "hoe dat ding heet waarmee je sql commando's doet..."

` of ' was t geloof ik

[ Voor 7% gewijzigd door Japidoff op 11-07-2008 17:31 ]

gang is alles


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
Je moet blijkbaar meer escapen dan alleen dubbele quotes. Google zegt dat MySQLs eigen functie daarvoor het volgende escapet:
\x00
\n
\r
\
'
"
\x1a

Verwijderd

Topicstarter
Japidoff schreef op vrijdag 11 juli 2008 @ 17:31:
ik spreek geen perl, dus wat die regel doet zegt me niks maar let je ook op de enkele aanhalingstekens of backtick of "hoe dat ding heet waarmee je sql commando's doet..."

` of ' was t geloof ik
Je hoeft toch maar 1 van de quotesoorten te escapen - die die je gebruikt in je insert?
Als ik die s///g regel weghaal loopt het helemaal in de soep iig...

Verwijderd

Topicstarter
_js_ schreef op vrijdag 11 juli 2008 @ 17:33:
Je moet blijkbaar meer escapen dan alleen dubbele quotes. Google zegt dat MySQLs eigen functie daarvoor het volgende escapet:
\x00
\n
\r
\
'
"
\x1a
_/-\o_

$file =~ s/"/\\"/g;

vervangen door

$file =~ s/(["'\x00\n\r\\\x1a])/\\$1/g;

werkt prima nu! Bedankt!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom heb je gekozen om je images op te slaan in een database ipv je filesystem?
Pagina: 1