Markus Trusk: unlogische Fehlermeldung im Errlog?

Hallo,
Ich überprüfe zwischen Session und Datenbankeintrag, ob diese beiden übereinstimmen. Das Passwort in der Session is zur Sicherheit mit crypt verschlüsselt worden. Wenn ich jetzt die Datenbank nach diesem Namen und Passwort auslesen will.... (hier)

my $dbh = DBI->connect("DBI:mysql:$database:$dbserver", $dbuser, $dbpass, {AutoCommit => 0}) or die $DBI::errstr;
my $checkpwd = $dbh->prepare("SELECT nick, pass FROM users WHERE nick = ? AND pass = ?") or die $dbh->errstr;
   $checkpwd->execute($nick,$pass);
my ($readnick,$readpwd) = $checkpwd->fetchrow_array;
   $checkpwd->finish;
   $readpwd = crypt($readpwd, $crypt);

...passiert folgendes.
So funktioniert es zwar, aber im Errorlog steht folgendes:

[Sun Apr  4 13:46:13 2004] index.pl: Use of uninitialized value in crypt at /home/www/doc/1264/www.meinedomain.com/index.pl line 409.

dann habe ich die Variable auf existenz geprüft:

if ($readpwd)   {
$readpwd = crypt($readpwd, $crypt);
}

Aber mache ich es so, bricht das Script ab, weil die Überprüfung zw. Pwd aus der Session und aus der DB logischerweise nicht mehr übereinstimmt.

Weiters habe ich es noch so versucht:

.
.
my ($readnick,$readpwd) = ('','');
($readnick,$readpwd) = $checkpwd->fetchrow_array;
.
.
So funktioniert es zwar wieder, nur bekomme ich wieder die Fehlermeldung im Errorlog. Was soll ich nur tun?

Markus Trusk.

  1. Hi,

    $readpwd = crypt($readpwd, $crypt);
    So funktioniert es zwar, aber im Errorlog steht folgendes:

    ja, das ist eine Warnung. Zu Recht, wie ich bemerken darf.

    dann habe ich die Variable auf existenz geprüft:
    if ($readpwd)   {

    Das prüft nicht auf Existenz, sondern auf Enthalten eines im boole'schen Sinne wahren Wertes. Hierzu wird die Variable verwendet, d.h. wäre sie noch nicht existent (lies: undefined), würde es die gleiche Warnung geben.

    $readpwd = crypt($readpwd, $crypt);

    Wie kommst Du eigentlich darauf, es ginge um $readpwd?

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      $readpwd = crypt($readpwd, $crypt);
      Wie kommst Du eigentlich darauf, es ginge um $readpwd?

      Weil $readpwd der aus der Db ausgelesene Wert in der Spalte 'pass' ist und ich diesen mit dem PW aus der Session vergleichen muss.

      Wie kann ich jetzt eigentlich überprüfen, ohne eine undefined Error Message zu bekommen und warum funktioniert es nicht mal dann, wenn ich zuerst
      my($readnick,$readpwd) = ('','');
      schreibe?

      Ich sehe die Logik dahinter nicht. Warum ist die Variable dann noch imemr undefined, nachdem '' zugewiesen wurde?
      Hat es irgendwie damit zu tun?

      ($readnick,$readpwd) = $checkpwd->fetchrow_array;

      Wie kann ich das Problem also umgehen?

      Markus Trusk.

      1. Hi,

        $readpwd = crypt($readpwd, $crypt);
        Wie kommst Du eigentlich darauf, es ginge um $readpwd?
        Weil $readpwd der aus der Db ausgelesene Wert in der Spalte 'pass' ist und ich diesen mit dem PW aus der Session vergleichen muss.

        die Bedeutung und der Ursprung des Inhalts der Variable hat nichts damit zu tun, ob die Warnmeldung auch tatsächlich diese Variable meint.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. die Bedeutung und der Ursprung des Inhalts der Variable hat nichts damit zu tun, ob die Warnmeldung auch tatsächlich diese Variable meint.

          Aha, und was könnte die Ursache dafür sein? Es kann nur irgendetwas damit zu tun haben, was im ersten Posting steht?

          Markus Trusk.

          1. Ich glaube ich weiß, wo der Fehler ist. Ich suche in der Datenbank nach dem verschlüsselten Passwort, weil das Pwd aus der Session doch verschlüsselt ist, und dort ist natürlich solche ein Eintrag nicht vorhanden, da es dort unverschlüsselt ist.

            Markus Trusk.

            1. Ja, daran lag es.

              Markus Trusk.

  2. my ($readnick,$readpwd) = $checkpwd->fetchrow_array;

    wenn hier entweder das Feld nick oder pass NULL ist, dann ist der Wert von $readpwd undefined.

    $checkpwd->finish;
       $readpwd = crypt($readpwd, $crypt);

    $crypt ist definiert?

    dann habe ich die Variable auf existenz geprüft:

    if ($readpwd)   {

    Du prüfst lediglich ob der Wert wahr ist, aber nicht auf Existenz.
    auf Existenz prüfen wäre so:

    if(defined $readpwd)   {

    Struppi.