#!/usr/bin/perl -w
#use HTML::Template;
use HTML::Template::Compiled;
use CGI::Simple;
use DBI;
use Devel::Peek;
use CGI::Carp qw(fatalsToBrowser carpout);
open(LOG, ">/var/www/utftest/log.txt");
carpout(LOG);
use Encode qw( encode decode );
use utf8;
#binmode(STDIN, ":encoding(utf8)");
#Einem bereits geöffneten Kanal kann nachträglich auch ein Konverter zugewiesen werden_
binmode(STDOUT, ":encoding(UTF-8)");
my $dbh = DBI->connect(
'DBI:mysql:database=testdb'
. ';host=localhost',
'root',
'womex',
{ RaiseError => 1, PrintWarn => 1, Warn => 1, mysql_enable_utf8 => 1}
) or die "Can't connect to database!";
#cgi Objekt für Zugriff auf per GET oder POST erhaltene Formulavariablen
my $cgi = new CGI::Simple;
#Codierung der Daten auf UTF-8 setzen: --> trotzdem werden diese nicht automatisch dekodiert (siehe Dump)
$cgi->charset('utf-8');
#Werte aller Formularelemente in Form eines Hashes
my %cgiHash = $cgi->Vars();
#SQl Statement, welches die Daten der Pflichfelder aus dem Formular speichern läßt.
my $sth = $dbh->prepare(
qq{
INSERT INTO utftbl
SET
spalte = ?
});
#Durchführen des inserts in die Tabelle mit den Pflichtdaten
unless (
$sth->execute(
$cgiHash{'input'}
)
) {
warn sprintf( "[Error]: Reason: [%s].", $dbh->errstr );
}
#Wiederauslesen des zuletzt eingefügten Eintrags aus der DB Tabelle
my ($return_value) = $dbh->last_insert_id( undef, undef, 'utftbl', 'id' );
$sth = $dbh->prepare(
qq{
SELECT spalte from utftbl where id=$return_value
});
#Durchführen des selects in die Tabelle mit den Pflichtdaten
unless (
$sth->execute()
) {
warn sprintf( "[Error]: Reason: [%s].", $dbh->errstr );
}
my @arr = $sth->fetchrow_array();
########################## F A Z I T ##########################################
#Mit dem original HTML::Template klappt dieses Vorgehen allerdings nicht.
# open the html template
#my $template = HTML::Template->new( filename => 'test.tmpl', utf8 => 1 );
###################################### Fazit ##################################
# open the html template
my $template = HTML::Template::Compiled->new( filename => 'test.tmpl', open_mode => ':utf8' );
#Füllen des Templates mit den Daten verschiedener Herkunft
# #hier muss ich trotzdem manuell dekodieren
$template->param( spalte => decode('utf-8',$cgiHash{'input'}) );
$template->param( spalte2 => '5 mal Euro: €€€€€' );
$template->param( spalte3 => $arr[0] );
$template->param( spalte4 => "Präfix€uro:" . $arr[0] );
#Ausgeben an den Server
print( "Content-Type: text/html; charset=UTF-8\n\n", $template->output );
#Dump von Rohdaten
Dump($cgiHash{'input'});
Dump($arr[0]);
foreach($template->param()){
Dump($_);
}
Dump($template);
__END__
SV = PV(0x85ed1b8) at 0x85ca900
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x862a8a8 "Das BU\342\202\254RO"\0
CUR = 11
LEN = 12
SV = PV(0x85de08c) at 0x8674c04
REFCNT = 1
FLAGS = (POK,pPOK,UTF8)
PV = 0x86720e0 "Das BU\342\202\254RO"\0 [UTF8 "Das BU\x{20ac}RO"]
CUR = 11
LEN = 12
[Wed Aug 3 14:25:40 2011] form.cgi: You are using query() but have not specified that you want to use it (specify with use_query => 1) at /var/www/utftest/form.cgi line 111
SV = RV(0x817c3d0) at 0x84efe74
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
RV = 0x85ca8d0
SV = PVAV(0x85bc738) at 0x85ca8d0
REFCNT = 1
FLAGS = (OBJECT)
IV = 0
NV = 0
STASH = 0x8154768 "HTML::Template::Compiled"
ARRAY = 0x862b078
FILL = 30
MAX = 59
ARYLEN = 0x0
FLAGS = (REAL)
Elt No. 0
SV = RV(0x817c3e8) at 0x85ca9d8
REFCNT = 1
FLAGS = (ROK)
RV = 0x85ca840
SV = PVHV(0x8681a38) at 0x85ca840
REFCNT = 1
FLAGS = (SHAREKEYS,HASKFLAGS)
UV = 4
NV = 0
ARRAY = 0x8667c58 (0:5, 1:2, 2:1)
hash quality = 91.7%
KEYS = 4
FILL = 3
MAX = 7
RITER = -1
EITER = 0x0
Elt "spalte4" [UTF8 "spalte4"] HASH = 0xcf2c47e3
SV = PV(0x8665f54) at 0x85cabb8
REFCNT = 1
FLAGS = (POK,pPOK,UTF8)
PV = 0x8632668 "Pr\303\244fix\342\202\254uro:Das BU\342\202\254RO"\0 [UTF8 "Pr\x{e4}fix\x{20ac}uro:Das BU\x{20ac}RO"]
CUR = 25
LEN = 28
Elt No. 1
SV = PVNV(0x85d08b0) at 0x85ca87c
REFCNT = 1
FLAGS = (ROK)
IV = 0
NV = 0
RV = 0x85ca870
SV = PVAV(0x85bc764) at 0x85ca870
REFCNT = 2
FLAGS = ()
IV = 0
NV = 0
ARRAY = 0x0
FILL = -1
MAX = -1
ARYLEN = 0x0
FLAGS = (REAL)
PV = 0x85ca870 ""
CUR = 0
LEN = 0
Elt No. 2
SV = PV(0x85ed254) at 0x85ca864
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x862ac90 "d41d8cd98f00b204e9800998ecf8427e"\0
CUR = 32
LEN = 36
Elt No. 3
SV = PV(0x85ed248) at 0x85ca8c4
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x862ab80 "test.tmpl"\0
CUR = 9
LEN = 12