Über Perl-Script Daten in Mysql eingeben
kantor
- datenbank
Hallo zusammen,
folgendes Problem bereitet mir Kopfschmerzen:
Ich habe ein Perl-Script geschrieben, was meiner Meinung nach fehlerfrei läuft, jedoch kommt in meiner Datenbank nichts von den im mysql-log stehenden UPDATE-Befehlen an. Woran kann das liegen?
Hier das Script:
__________________________________
#!/usr/bin/perl -w
use strict;
use DBI;
use CGI;
use CGI::Carp 'fatalsToBrowser';
print "Content-type:text/html\n\n";
my ($i, $x) = 0;
my (@termine, @zeile1, @zeilen) = "";
my ($z, $line, $termin, $dbh, $sth);
my ($datum1, $zeit1, $kirche, $ort, $titel, $text, $email);
open (DATEI, "< ../../ki-ver.htm") or die "Kann Datei ki-ver.htm nicht öffnen: $!\n";
while ($line=<DATEI>) {
$x++;
$line = "<b>$line</b>" if ($x==2);
$termine[$i] = "$termine[$i] $line"; # Veranstaltungen in @ einlesen
if ($line =~ /^\n/s) {
$i++;
$x = 0;
next
}
}
close DATEI;
$dbh = DBI->connect ("DBI:mysql:host=localhost;database=test", "", "", {PrintError => 1, RaiseError => 1});
#, "irgendwas", "irgendein Passwort", #
$i = 0;
foreach $termin(@termine) {
@zeilen = split(/\n/, $termin);
@zeile1 = split(/, /, $zeilen[0]);
$email = $zeile1[0] if($zeile1[0] =~ m/<*?>/);
$email =~ s/>.*//g;
$email =~ s/<///g;
print "email: $email, ";
$datum1 = substr($zeile1[1], 6, 4);
$datum1 .="-";
$datum1 .= substr($zeile1[1], 3, 2);
$datum1 .="-";
$datum1 .= substr($zeile1[1], 0, 2);
print "datum1: $datum1, \n";
$zeit1 = substr($zeile1[2], 0, 2);
$zeit1 .=":";
$zeit1 .= substr($zeile1[2], 3, 2);
print "zeit1: $zeit1<br>\n";
for ($x=3; $x<=@zeilen; $x++)
{
$zeilen[2] .= "$zeilen[$x]";
}
print "Inhalt: <b>$zeilen[1]</b><br>$zeilen[2]\n<br><br>";
$dbh->do("UPDATE veranstaltungen SET datum1='$datum1', zeit1='$zeit1', kirche='$zeile1[3]', ort='$zeile1[4]', datum2=NULL, zeit2=NULL, titel='$zeilen[1]', text='$zeilen[2]', email='$email' WHERE id='$i'");
$i++;
}
$dbh->disconnect ();
exit(0)
__________________________
Schon im voraus Danke für Eure Hilfe
Regards
Axel
Hallo,
foreach $termin(@termine) {
$dbh->do("UPDATE veranstaltungen SET datum1='$datum1', zeit1='$zeit1', kirche='$zeile1[3]', ort='$zeile1[4]', datum2=NULL, zeit2=NULL, titel='$zeilen[1]', text='$zeilen[2]', email='$email' WHERE id='$i'");
}
das ist sehr ressourcen fressend, ich würde dort dbh->prepare verwenden:
my $q=$dbh->prepare("update veranstaltungen set datum1=?, zeit1=?, kirche=?, ort=?, datum2=NULL, zeit2=NULL, titel=?, text=?, email=? WHERE id=?") or die $dbh->errstr();
foreach(){
[....]
$q->execute($datum1, $zeit1, $zeile1[3], $zeile1[4],$zeilen[1],$zeilen[2],$email,$i) or die $dbh->errstr;
[....]
}
wenn du platzhalter verwendest hast du folgenden vorteil: das query wird in der datenbank vorbereitet und in der schleife fällt dieses vorbereiten weg, was jedesmal mit dem do auftreten würde.
zweitens: $dbh->errstr gaaaaanz wichtig.
gruss
Kann es sein, dass in der WHERE Klausel nur folgendes stehen muss: id=$i (ohne ')?
$dbh->do("UPDATE veranstaltungen SET datum1='$datum1', zeit1='$zeit1', kirche='$zeile1[3]', ort='$zeile1[4]', datum2=NULL, zeit2=NULL, titel='$zeilen[1]', text='$zeilen[2]', email='$email' WHERE id='$i'");
$i++;
Axel
Hallo,
Kann es sein, dass in der WHERE Klausel nur folgendes stehen muss: id=$i (ohne ')?
das ist mysql wurscht :)
Bert