Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3317[/thread]

MySQL + Transaktion -> funktioniert nicht (Seite 2)



<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
SirLant
 2003-08-25 18:58
#31882 #31882
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Danke, habe ich doch glatt (und das trotz Syntax-Highlighting) nicht gesehen.

Edit:
Kannst du zu dem Problem mit dem Fehlschlagen der Transaktion, das ich oben ansprach noch was sagen?

Edit2:
Das geht leider nicht, da schwerer_fehler ja das skript beendet
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
sub schwerer_fehler {

        my $text = shift;
        my $seite;
        my $self;

        if (ref ($text)){
                $self = $text ;
        }
        $text = shift;
        
        $seite .= p ("Ein Fehler ist aufgetreten.")
                 . p (escapeHTML ($text))
                 . p ("Zurück zur PseudEcom "  . $self->home_link ("Homepage"));
                 
        print header (),
                start_html (-title => "PseudEcom Corporation", -bgcolor => "white"),
                $self->standardlayout ($seite),
                end_html ();
        exit (0);

}

Und ich habe noch nen kleines Problem, mit folgender Abfrage überprüfe ich ob die Angaben richtig sind:
Code (perl): (dl )
1
2
3
$dbh->selectrow_array ("SELECT doku_id FROM doku_posten WHERE bestell_id = ? AND "
                                . "doku_id = ? AND passwort = ?", undef, $bestell_id, $doku_id, $pwd)
                or $peh->schwerer_fehler ("Dokument/Passwort stimmt nicht");

Die Werte gebe ich über GET an das Skript, welches sie mit param() extrahiert und die Werte stimmen auch, aber es heißt immer "Dokument/Passwort stimmt nicht".
Ist da nen Fehler in der Abfrage?\n\n

<!--EDIT|SirLant|1061824415-->
--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!
SirLant
 2003-08-25 19:32
#31883 #31883
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Schaut euch das Posting darüber mal bitte an, wird ja leider nicht angezeigt, wenn man editiert(in der übersicht).
--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 19:55
#31884 #31884
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
1. Deine Funktion rewrite erfüllt das, was Du willst.
2. Du fragst, ob die Abfrage richtig ist. Leider gibst Du wieder nur Deine Standardfehlermeldung aus und läßt das DB-Interface "nicht zu Wort kommen" ($dbh->errstr zumindestens in der Testphase; Anwender können später eh nix damit anfangen, also baust Du es dann wieder aus).
3. Eventuell werden hierbei noch Konvertierungen vorgenommen, während die Werte in der Datenbank in einem "unescaped"en Zustand vorliegen.
Code (perl): (dl )
1
2
3
4
5
6
#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)
);
SirLant
 2003-08-25 23:04
#31885 #31885
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Hm, wenn ich or $dbh->errstr (); schreibe, geht es, schreibe ich
$peh->schwerer_fehler ("Dokument/Passwort stimmt nicht"); ,dann geht es nicht.
--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-26 00:08
#31886 #31886
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=SirLant,25.08.2003, 21:04]Hm, wenn ich or $dbh->errstr ();  schreibe, geht es, schreibe ich
$peh->schwerer_fehler ("Dokument/Passwort stimmt nicht"); ,dann geht es nicht.[/quote]
Das zeigt doch schon mal, daß Dein SQL-Befehl syntaktisch richtig ist. Du bekommst also als Ergebnismenge 0 Einträge, worauf in den or-Zweig geschalten wird.
Hast Du die Datenbankänderung committed und das Datenbankhandle geschlossen?
Kannst Du die Abfrage mal in einem DB-Admin-Tool wie phpMyAdmin absetzen?
SirLant
 2003-08-26 00:15
#31887 #31887
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Das "geht es", heißt es geht alles, die pdf-dateien werden dem Browser geschickt, also das Skript läuft einwandfrei, aber schaltet in den or-Zwei wenn ich schwerer_fehler dort stehen habe.

Die Übersetzung von MySQL&Perl Developpers Guide ist ja wirklich gelungen, aber die Sourcecodes sind eine Katastrophe, teilweise mit den Namen im Buch 3-4 Unterschiedliche Namen für die gleiche Funktion, dann funktioniert einiges nicht, die hälfte der englischen Kommentare wurde nicht übersetzt usw.
Da wäre ich mit den englischen sources besser bedient gewesen(habe das bis jetzt mit dem Buch,den Sources und kleine Veränderungen von mir gemacht).
Aber egal, noch 20Seiten ,dann ist die Anwendung fertig und ich kann mich auf meine eigene projekte konzentrieren(bei eigenen Dingen habe ich schon lange kein Problem mehr gehabt, erst jetzt bei diesem wieder, wo ich mir nicht selbst helfen konnte)
--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-26 00:27
#31888 #31888
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
or $dbh->errstr (); macht ja auch nicht viel.
or die $dbh->errstr (); beendet das Script.
SirLant
 2003-08-26 00:32
#31889 #31889
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Kann es sein, dass die Abfrage immer "stirbt", da die doku_id != 1 ist?Und alles was nicht 1 ist als false gilt?
Ich versuche mal den Rückgabewert in ne Variable zu packen.

edit:

Code (perl): (dl )
1
2
3
4
5
6
7
my $doku_result = $dbh->selectrow_array ("SELECT doku_id FROM doku_posten WHERE bestell_id = ? AND "
                                . "doku_id = ? AND passwort = ?", undef, $bestell_id, $doku_id, $pwd);
if ($doku_result){
        
        $peh->schwerer_fehler ("Dokument/Passwort stimmt nicht");

}


läuft :)

Und das Problem mit der Transaktion oben habe ich jetzt auch hinbekommen (bindet and/or mehr als &&/|| ? Dachte immer wäre umgekehrt)\n\n

<!--EDIT|SirLant|1061844027-->
--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-26 00:51
#31890 #31890
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein and/or hat eine niedrigere Priorität als &&/||.
Ich habe selectrow_array() noch nicht verwendet, sondern fast nur prepare, execute und fetch...
Deshalb sollte man wissen, welche Werte zurückgeliefert werden können. Deshalb ein Blick in die Doku:
Quote
   "selectrow_array"
         @row_ary = $dbh->selectrow_array($statement);
         @row_ary = $dbh->selectrow_array($statement, \%attr);
         @row_ary = $dbh->selectrow_array($statement, \%attr, @bind_values);

       This utility method combines the prepare, execute, and
       fetchrow_array entries elsewhere in this document into a single
       call. If called in a list context, it returns the first row of data
       from the statement. If called in a scalar context, it returns the
       first field of the first row. The "$statement" parameter can be a
       previously prepared statement handle, in which case the "prepare" is
       skipped.

       If any method fails, and the RaiseError entry elsewhere in this
       document is not set, "selectrow_array" will return an empty list.

       In a scalar context, "selectrow_array" returns the value of the
       first field. An "undef" is returned if there are no matching rows or
       an error occurred. Since that "undef" can't be distinguished from an
       "undef" returned because the first field value was NULL, calling
       "selectrow_array" in a scalar context should be used with caution.
SirLant
 2003-08-26 01:00
#31891 #31891
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Das heißt, mein Skript läuft im mom nur, weil ich oben vergessen habe die Abfrage zu negieren, aber es muss etwas zurückliefern, die werte stimmen doch.
Habe es in mysql getestet und es scheint an dem "id" in doku_id zu liegen, mit Backticks geht es, mal im skript testen.

Edit:
Im Skript selbst geht es nicht.\n\n

<!--EDIT|SirLant|1061845423-->
--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!
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



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