do...while produziert Endlosschleife

  • Hallo :shinner: ,
    ich habe hier ein 'kleines' Problem mit folgender do...while-Schleife

    PHP
    $pwh = NULL;
    do {
    	$pwh = gen_pw();
    	echo "Passwort generiert<br>";
    } while (check_pw($pwh) == false);

    Diese produziert mir eine Endlosschleife, wenn die Bedingung von while erfüllt ist(?).
    Ich hab schon sonstwas versucht und komme nicht dahinter.

    Die Schleife soll eigentlich folgendes leisten:

    1. Ein Passwort generieren mit Hilfe der Funktion gen_pw, was auch funktioniert.
    2. Mit Hilfe der Funktion check_pw herausfinden, ob das Passwort (bzw. der Hash) schon in der Datenbank existiert, was auch funktioniert.
    3. Wenn das Passwort in der DB gefunden wird (check_pw == false), den Zufallsgenerator erneut starten, was nicht richtig funktioniert.

    Ich habe natürlich, um zu überprüfen, ob check_pw korrekt arbeitet, den Zufallswert (Passwort) in gen_pw durch ein festes Passwort ersetzt, was schon in der DB liegt.
    Wie gesagt: check_pw an sich funktioniert.
    Aber: Die do...while-Struktur produziert in diesem Szenario eine Endlosschleife. Das verrückte dabei ist, dass nicht einmal mehr die Fehlermeldungen aus der Funktion check_pw ausgegeben werden, obwohl diese ja den Wert der while-Bedingung erzeugt.
    Die Fehlermeldungen werden im Quelltext sogar noch vor dem Setzen der Rückgabevariable auf false ausgegeben.

    Ich habe auch schon versucht, das ganze mit einer if-Anweisung zu lösen.


    Das ist natürlich Schwachsinn, weil ich mich ja nicht darauf verlassen kann, dass der Zufallsgenerator bei zweiten Versuch nicht das selbe Passwort ausspuckt (oder doch??).
    Aber: Da hat alles funktioniert.
    Wo könnte denn mein Fehler liegen?

  • Hallo :shinner: ,
    ich habe hier ein 'kleines' Problem mit folgender do...while-Schleife

    PHP
    $pwh = NULL;
    do {
        $pwh = gen_pw();
        echo "Passwort generiert<br>";
    } while (check_pw($pwh) == false);

    Diese produziert mir eine Endlosschleife, wenn die Bedingung von while erfüllt ist(?).
    Ich hab schon sonstwas versucht und komme nicht dahinter.

    Die Schleife soll eigentlich folgendes leisten:

    1. Ein Passwort generieren mit Hilfe der Funktion gen_pw, was auch funktioniert.
    2. Mit Hilfe der Funktion check_pw herausfinden, ob das Passwort (bzw. der Hash) schon in der Datenbank existiert, was auch funktioniert.
    3. Wenn das Passwort in der DB gefunden wird (check_pw == false), den Zufallsgenerator erneut starten, was nicht richtig funktioniert.

    ich will ja nichts sagen aber mit einer zufallsfunktion wirst nie auf das richtige passwort kommen - oder?
    und will jetzt nicht fragen welche absichten du mit so einem programm hast nur wird das einfach vom webserver so schnell hintereinander ausgeführt dass dir es vorkommt wie eine endlosschleife in wirklichkeit aber abbricht... irgendwann mal..

  • Vielleicht hab ich mich hier etwas ungut ausgedrückt oder es einfach nicht dazu gesagt:

    Hier geht es um die Erzeugung eines Passwotres für einen neuen User und nicht um den Abgleich beim Login.
    Es geht also eigentlich darum ein "flasches" Passwort, das eben noch ihct in der DB liegt zu erhalten.
    Deshalb der Zufall. Und weil der Zufall ja manchmal zufällig zweimal das gleiche produziert soll es da eine Sicherung geben, die das verhindert. Und die funktioniert nicht.

    Also check_pw($pwh) == false bedeutet, dass das PW in der Datenbank gefunden wurde.

  • Hab ich schon ausprobiert.
    Das Passwort wird gar nicht ausgegeben, was vermuten lässt, dass das Skript gar nicht bis dahin ausgefügrt wird.

    Aber eine Endlosschleife entsteht trotzdem.

  • Hab ich schon ausprobiert.
    Das Passwort wird gar nicht ausgegeben, was vermuten lässt, dass das Skript gar nicht bis dahin ausgefügrt wird.

    Aber eine Endlosschleife entsteht trotzdem.

    dann macht die gen_pw-prozedur vielleicht doch nicht, was sie soll?

    einfach nur genial: wenn man im wort "Mama" 4 buchstaben ändert, dann hat man auf einmal "Bier"

  • Hab ich schon ausprobiert.
    Das Passwort wird gar nicht ausgegeben, was vermuten lässt, dass das Skript gar nicht bis dahin ausgefügrt wird.

    Aber eine Endlosschleife entsteht trotzdem.

    Wenn kein Passwort ausgegeben wird, würde ich meinen, dass gen_pw nicht richtig funktioniert - kein Passwort generiert. Die check-Funktion gibt wahrscheinlich immer false zurück, wenn ein leerer String als Passwort übergeben wurde.

  • Wie gesagt: Ich habe in gen_pw den Zufallsgenerator durch ein festes Passwort ersetzt um auch testen zu können, was passiert, wenn das Passwort schon in der DB liegt (also immer das gleiche verwendet wird).
    Das heißt also, theoretisch auch, dass man eine Endlosschleife programmiert, denn das funktioniert ja nach dem Schema:

    wenn Passwort schon in der DB --> generiere neues -- > schon in der DB --> generiere neues.....
    Wobei eben nichts generiert wird, sondern immer der selbe Wert ausgegeben, weil ich den Zufallsgenerator komplett auskommentiert habe.

    ABER: Normalerweise müsste dann ja auch laufend die Fehlermeldung kommen, dass das Passwort schon existiert. Die kommt aber nicht und auch das Passwort selbst lässt sich da nicht ausgeben.

    Das ist das eigentliche Kuriosum an der ganzen Sache.
    Eigentlich funktioniert ja auch alles wunderbar. Ich wollte eben bloß sichergehen und wissen, was im Falle eines Falles (Passwort existiert schon) passiert.

  • Hallo,
    ich glaube, ich habe die Lösung des Problems jetzt gefunden:

    PHP schient das echo in Schleifen immer erst auszugeben, wenn die Schleife verlassen wird(?).

    Denn folgender Code

    PHP
    $count = 0;
    do {
    $pwh = gen_pw();
    echo "<br>Passworthash: ";
    echo $pwh; 		
    $count = $count + 1;
    } while (check_pw($pwh) == true AND $count <= 10);

    Gibt das hier aus:

    Das heißt, dass das Skript schon so funktioniert, wie ich mir das gedacht habe. Es werden bei einer Endlosschleife (die durch das Festsetzen des Passwortes entsteht) eben nur keine Meldungen ausgegeben, weil die Schleife nicht verlassen wird.
    Der User wird dann bei der Arbeit mit dem Zufallsgenerator logischerweise nur hinzugefügt, wenn auch wirklich ein neues Passwort erstellt wurde, weil erst dann die Schleife verlassen wird.

  • du kannst den output/buffer auch flushen. bei php duerfte das ein wenig problematisch sein, weil der webserver mehr oder weniger machen kann was er will. hier wird das ganze beschrieben.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!