Schrift
[thread]3317[/thread]

MySQL + Transaktion -> funktioniert nicht



<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
SirLant
 2003-08-25 16:00
#31872 #31872
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Nachdem ich nun meine Tabellen als BDB Tabellen habe, funktioniert meine Transaktion weiterhin nicht.
Hier mal der code, vllt. findet wer von euch den Fehler, es wird immer "Ein Problem mit der Datenbank ist aufgetreten.Bitte versuchen sie es noch einmal."

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
$dbh->{AutoCommit}= 0;  #Für Transaktion

        eval {  bestellung_speichern ($dbh, $bestell_info) and $dbh->commit (); };

        if ($@) { #hat nicht Funktioniert
        
                $dbh->rollback ();
                $dbh->disconnect ();
                $peh->schwerer_fehler ("Ein Problem mit der Datenbank ist aufgetreten.Bitte versuchen sie es noch einmal.");
                
        }
        $dbh->{AutoCommit} = 1; #Transaktion abgeschlossen


Die Funktion bestellung_speichern:
Code (perl): (dl )
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
sub bestellung_speichern {

        my ($dbh, $bestell_info) = @_;
        #Datensatz in doku_bestell
        
        $dbh->do ("INSERT INTO doku_bestell (bestell_datum, bestell_preis, aut_id, kunden_name,
                        kunden_email) VALUES (CURRENT_DATE,?,?,?,?)", undef,
                        $bestell_info->{gesamtpreis},
                        $bestell_info->{aut_id},
                        $bestell_info->{kunden_name},
                        $bestell_info->{kunden_email}
                        );
        #Bestell_id ist der Auto_Increment wert von eben
        $bestell_info->{bestell_id} = $dbh->{mysql_insertid};
        #für jedes Dokument einen Datensatz in doku_posten
        
        for (@{$bestell_info->{posten}}) {
        
        #Passwort für das Dokument erzeugen und speichern 
                my $passwort = passwort ();
                my $a;
        #Erzeugt die Links zu den Dokumenten
                $a = sprintf ("dokument.cgi?bestellung=%s;doku=%s;password=%s",
                                   escape ($bestell_info->{bestell_id}),
                                   escape ($_->{doku_id}),
                                   escape ($passwort)
                                );
                $_->{url} = $peh->haupt_url () . $a;
                $dbh->do ("INSERT INTO doku_posten (bestell_id, doku_id, preis, passwort)
                                VALUES (?,?,?,?)",undef,
                                $bestell_info->{bestell_id},
                                $_->{doku_id},
                                $_->{preis},
                                $passwort
                                );
        
        }
        
}
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
macMeck
 2003-08-25 16:15
#31873 #31873
User since
2003-08-04
162 Artikel
BenutzerIn
[default_avatar]
Was hast du denn für Error-Optionen beim Datenbank-connect? Versuch mal
Code (perl): (dl )
{PrintError => 0, RaiseError => 1}


macMeck
It all works, as long as it's documented!
SirLant
 2003-08-25 16:24
#31874 #31874
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
{PrintError => 0, RaiseError => 1}
habe ich schon
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Shagreen
 2003-08-25 17:14
#31875 #31875
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
Statt mit eval die korrekte Ausführung der DB-Transaktion auszuwerten, würde ich die Methoden errstr() und errno() des DBIs verwenden.
Wie schaut den das Create Table-Statement für die beiden Tabellen aus?
SirLant
 2003-08-25 17:24
#31876 #31876
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Die Tables sehen so aus:
[sql]CREATE TABLE doku_bestell (
bestell_id bigint(20) NOT NULL auto_increment,
bestell_datum date NOT NULL default '0000-00 -00',
bestell_preis decimal(10,2) NOT NULL default '0.00',
aut_id varchar(10) NOT NULL default '',
kunden_name varchar(40) NOT NULL default '',
kunden_email varchar(60) NOT NULL default '',
PRIMARY KEY (bestell_id)
) TYPE =BerkeleyDB;

CREATE TABLE doku_posten (
bestell_id bigint(20) unsigned NOT NULL default '0',
doku_id bigint(20) unsigned NOT NULL default '0',
preis decimal(10,2) NOT NULL default '0.00',
passwort char(32) NOT NULL default '',
UNIQUE KEY bestell_id (bestell_id,doku_id)
) TYPE =BerkeleyDB;
[/sql]

Wie funktioniert errstr und erno, bzw. wie muss ich das schreiben?
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Shagreen
 2003-08-25 17:37
#31877 #31877
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=SirLant,25.08.2003, 14:00]...
Code (perl): (dl )
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
sub bestellung_speichern {

        my ($dbh, $bestell_info) = @_;
        #Datensatz in doku_bestell
        
        $dbh->do ("INSERT INTO doku_bestell (bestell_datum, bestell_preis, aut_id, kunden_name,
                        kunden_email) VALUES (CURRENT_DATE,?,?,?,?)", undef,
                        $bestell_info->{gesamtpreis},
                        $bestell_info->{aut_id},
                        $bestell_info->{kunden_name},
                        $bestell_info->{kunden_email}
                        ) or $peh->schwerer_fehler ("INSERT #1: " . $dbh->errstr);
;
        #Bestell_id ist der Auto_Increment wert von eben
        $bestell_info->{bestell_id} = $dbh->{mysql_insertid};
        #für jedes Dokument einen Datensatz in doku_posten
        
        for (@{$bestell_info->{posten}}) {
        
        #Passwort für das Dokument erzeugen und speichern 
                my $passwort = passwort ();
                my $a;
        #Erzeugt die Links zu den Dokumenten
                $a = sprintf ("dokument.cgi?bestellung=%s;doku=%s;password=%s",
                                   escape ($bestell_info->{bestell_id}),
                                   escape ($_->{doku_id}),
                                   escape ($passwort)
                                );
                $_->{url} = $peh->haupt_url () . $a;
                $dbh->do ("INSERT INTO doku_posten (bestell_id, doku_id, preis, passwort)
                                VALUES (?,?,?,?)",undef,
                                $bestell_info->{bestell_id},
                                $_->{doku_id},
                                $_->{preis},
                                $passwort
                                ) or $peh->schwerer_fehler ("INSERT #2: " . $dbh->errstr);
        
        }
        
}
[/quote]
siehe Codeerweiterung bei den INSERTs.
Außerhalb der Sub kannst Du dann abfragen, ob $peh->schwerer_fehler eine Meldung enthält.
bestell_id kannst Du noch in der Tabelle doku_bestell auf unsigned setzen.
Soweit erstmal.

Edit:
Das Leerzeichen im Datumsformat ist doch bestimmt ein Darstellungsfehler?!
bestell_datum date NOT NULL default '0000-00 -00',\n\n

<!--EDIT|Shagreen|1061818911-->
SirLant
 2003-08-25 17:41
#31878 #31878
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Wenn etwas an schwerer_fehler gegeben wird, wird das Script beendet.
Werde das gleich mal testen.

Edit:
Es kommt immernoch die Fehlermeldung aus der darüberliegenden Funktion, das heißt die einzelnen Statements funktionieren, aber denoch gibt es irgendeinen Fehler.
In doku_bestell werden die Bestellungen eingetragen in doku_posten jedoch nicht, da ist dann im zweiten teil von bestellung_speichern irgendwo ein Fehler, vllt. findest du da was.\n\n

<!--EDIT|SirLant|1061819179-->
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Shagreen
 2003-08-25 18:10
#31879 #31879
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hast Du das eval{} und if ($@) ausgebaut?
SirLant
 2003-08-25 18:39
#31880 #31880
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Ne, mach ich aber mal

Edit:
Jetzt erhalte ich folgenden Fehler
Quote
Can't locate auto/Digest/MD5/retunr.al in @INC (@INC contains: e:/WWW/cgi-bin/pseudecom ./WebDB E:/Programme/perl/lib E:/Programme/perl/site/lib .) at E:/WWW/cgi-bin/pseudecom/doku_shop.cgi line 411


Die Funktion:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub passwort {

        my $md5 = Digest::MD5->new ();
        
        $md5->add (rand ());
        $md5->add (localtime (time ()));
        $md5->add ($$);         #Aktuelle Prozess-ID
        
        retunr $md5->hexdigest ();

}


bei mir liegt im verzeichnis perl/lib/digest eine md5.pm ,also ist MD5 ja vorhanden, aber weshalb läuft das nicht?


Durch das ausbauen von eval und if ($@), habe ich ja die Transaktion im grunde deaktiviert, da es bei einem Fehler nichtmehr Rückgängig gemacht wird.

Wenn ich das aber so schreibe, würde das gehen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub rewrite {
                $dbh->rollback ();
                $dbh->disconnect ();
                $peh->schwerer_fehler ("Ein Problem mit der Datenbank ist aufgetreten.Bitte versuchen sie es noch einmal.");
}

$dbh->do ("INSERT INTO doku_bestell (bestell_datum, bestell_preis, aut_id, kunden_name,
                        kunden_email) VALUES (CURRENT_DATE,?,?,?,?)", undef,
                        $bestell_info->{gesamtpreis},
                        $bestell_info->{aut_id},
                        $bestell_info->{kunden_name},
                        $bestell_info->{kunden_email})
or rewrite();

?\n\n

<!--EDIT|SirLant|1061823081-->
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Shagreen
 2003-08-25 18:53
#31881 #31881
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
retunr $md5->hexdigest ();

Soll Doch bestimmt return ... heißen!

Edit:
Quote
Außerhalb der Sub kannst Du dann abfragen, ob $peh->schwerer_fehler eine Meldung enthält.

Setzt Du statt der Abfrage von $@, die Abfrage auf $peh->schwerer_fehler funktioniert Dein Rollback auch.\n\n

<!--EDIT|Shagreen|1061823638-->
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



View all threads created 2003-08-25 16:00.