1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

do...while produziert Endlosschleife

  • osiris
  • 31. März 2008 um 13:14
  • Unerledigt
  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 31. März 2008 um 13:14
    • #1

    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.

    PHP
    function check_pw($pwh) {
    
    
    	$check = true;
    
    	$result = mysql_query("SELECT pwh FROM tabelle");
    
    
    	while ($row = mysql_fetch_assoc($result)) {
    
    
    		if ($pwh == $row['pwh']) {
    
    
    			echo "Das Passwort existiert schon";
    			$check = false;
    			break;
    		}
    	}
    
    
    	return $check;
    }
    Alles anzeigen

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

    PHP
    $pwh = gen_pw();
    echo "Passwort generiert: ".$pwh;
    echo "<br>";
    
    
    if (check_pw($pwh) == false) {
    
    
    	echo "PW existent...generiere neu: ";
    	$pwh = gen_pw();
    	echo $pwh;
    }
    Alles anzeigen


    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?

  • Informatiker08
    9
    Informatiker08
    Mitglied
    Reaktionen
    2
    Punkte
    807
    Beiträge
    156
    • 31. März 2008 um 13:25
    • #2
    Zitat von osiris

    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..

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 31. März 2008 um 13:35
    • #3

    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.

  • Informatiker08
    9
    Informatiker08
    Mitglied
    Reaktionen
    2
    Punkte
    807
    Beiträge
    156
    • 31. März 2008 um 14:08
    • #4
    PHP
    $pwh = NULL;
    do {
        $pwh = gen_pw();
        echo "Passwort generiert<br>";
    } while (check_pw($pwh) == false);

    gib mal im schleifendurchlauf das passwort aus und schau was passiert...

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 31. März 2008 um 14:40
    • #5

    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.

  • Erklärbär
    8
    Erklärbär
    Mitglied
    Reaktionen
    6
    Punkte
    661
    Beiträge
    130
    • 31. März 2008 um 15:24
    • #6
    Zitat von osiris

    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"

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 31. März 2008 um 15:49
    • #7
    Zitat von osiris

    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.

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 31. März 2008 um 21:48
    • #8

    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.

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 1. April 2008 um 09:02
    • #9

    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:

    Code
    Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon Passwort: -tH0KWz4
    Passworthash: 33d0bebf1623eb7ca9071cecba37f783 Das Passwort existiert schon
    User hinzugefügt
    Alles anzeigen

    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.

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 1. April 2008 um 11:59
    • #10

    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.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung