Hallo,
ich habe Daten aus HTML-Seiten extrahiert und in einer Textdatei abgelegt. Werte sind mit einem Semikolon und Datensätze durch einen Zeilenumbruch getrennt.
Ich will die Daten jetzt mit folgendem Script aus der Textdatei in eine MySQL-Datenbank schreiben.
$sth = $dbh->prepare( "INSERT INTO log (waypoint,date,name,type) VALUES (?,?,?,?)" )
|| die "Statement kann nicht vorbereitet werden! $dbh->errstr \n";
open (CSV, $datei);
while(<CSV>) {
chomp;
my ($wp,$date,$name,$type) = split /;/;
$sth->execute( $wp, $date, $name, $type )
|| die "Kann Datensatz nicht schreiben! $sth->errstr \n";
}
$sth->finish();
$dbh->disconnect();
close (CSV);
Das Script wird auch ohne Fehlermeldung abgearbeitet und man kann die Daten auch über "print" ausgeben. Nur in der Datenbank erscheinen die Datensätze nicht!
Ich weiß jetzt auch nicht mehr wo ich suchen soll, da ich keine Fehlermeldung bekomme obwohl ich alle Möglichkeiten dazu aktiviert habe.
Danke!
Mike
User since
2006-07-05
334
Artikel
BenutzerIn
Guten Abend.
Zum Vergleich ein Codestück aus der Küche des Meisters:
http://www.foo-magazin.de/download.cgi?issue=6 (siehe die Syntax zum SELECT Befehl auf Seite 4)
Im dem Gezeigten scheint nämlich einiges davon zu fehlen...
Gruss MisterL
“Perl is the only language that looks the same before and after RSA encryption.”
User since
2005-08-17
1420
Artikel
BenutzerIn
Hm, für mich sieht der Ausschnitt vom Code absolut ok aus eigentlich.
Kann es sein, dass du eventuell mit Commit arbeiten musst (falls die Tabelle InnoDB oder ähnliches ist, was Transaktionen unterstützt)?
User since
2003-08-04
14371
Artikel
ModeratorIn
Kann es sein, dass das Öffnen der Datei fehlschlägt? Mach mal aus
das hier:
open (CSV,"<", $datei) or die $!;
Hast Du
[tt]strict[/tt] und
warnings drin?
User since
2007-01-23
5
Artikel
BenutzerIn
Hallo,
danke für alle Antworten!
Ja, nepos hat recht. Ich habe beim connecten auf "AutoCommit => 0" gestellt ohne die eigentliche Bedeutung zu erkennen.
Hatte es schon bei "perldoc DBI" gelesen, konnte aber nicht antworten, da es hier Probleme bei der Registrierung gab. Aber Renèe hat es jetzt hinbekommen.
Habe jetzt das Ende so:
$sth->finish();
$dbh->commit();
$dbh->disconnect();
close (CSV);
gestaltet und hoffe die Reihenfolge stimmt so.
Meine auto_increment Spalte wurde übrigens bei jedem Versuch gefüllt.
Mike
User since
2005-08-17
1420
Artikel
BenutzerIn
Hm, normal benutzt MySQL keine Transaktionen, da sollte das auch mit AutoCommit=>0 klappen. Aber 100% sicher bin ich mir da ned.
Ich selbst arbeite meistens mit PostgreSQL.
User since
2003-08-04
12208
Artikel
Admin1
[quote=nepos,24.01.2007, 10:36]Hm, normal benutzt MySQL keine Transaktionen, da sollte das auch mit AutoCommit=>0 klappen.[/quote]
woher hast du denn das?
MyISAM kann keine transaktionen, InnoDB dagegen schon, und das
auch schon länger.
User since
2007-01-23
5
Artikel
BenutzerIn
[quote=pq,24.01.2007, 11:34]MyISAM kann keine transaktionen, InnoDB dagegen schon, und das
auch schon länger.[/quote]
Genauer gesagt seit Version 3.23. Habe ich allerdings gerade erst nachgelesen, da ich mich mit dem Thema noch nicht beschäftigt habe.
Bei den Fehlversuchen hätte ich wohl ein ROLLBACK machen müssen um das AUTO_INCREMENT Feld nicht anwachsen zu lassen. Da ich aber keine Fehlermeldung bekommen habe war mit das nicht klar.
@renee: Ja ich habe alle mir bekannten Fehlerkanäle aktiviert, was man nicht sehen konnte, da ich nur das Ende des Scripts kopiert habe. Obwohl der entscheidende Teil ja nun am Anfang stand. :-)
Mike
User since
2005-08-17
1420
Artikel
BenutzerIn
[quote=pq,24.01.2007, 11:34][quote=nepos,24.01.2007, 10:36]Hm, normal benutzt MySQL keine Transaktionen, da sollte das auch mit AutoCommit=>0 klappen.[/quote]
woher hast du denn das?
MyISAM kann keine transaktionen, InnoDB dagegen schon, und das
auch schon länger.[/quote]
Jaja, nur nutzen soweit ich das sehe die meisten MySQL-Geschichten, zumindest im Webumfeld, doch oft noch MyISAM.
Ich weiß, dass MySQL da mittlerweile mal mehr kann...