kantor: Über Perl-Script Daten in Mysql eingeben

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

  1. 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

    --
    no strict;
    no warnings;
    man google
  2. 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

    1. Hallo,

      Kann es sein, dass in der WHERE Klausel nur folgendes stehen muss: id=$i (ohne ')?

      das ist mysql wurscht :)

      Bert

      --
      E492: Not an editor command: Wq
      ln -s /dev/brain