bonehunter: While Schleife richtig?

Hallo,

mal eine kurze Frage:
ich programmiere gerade ein Board mit PHP. Die einzelnen Beiträge werden als .txt-Dateien gespeichert. Der Dateiname ist eine Zufallszahl.
Weil ich überprüfen möchte, ob die erzeugte Zufallszahl schon als Datei existiert, habe ich mir gedacht da wäre eine While-Schleife gerade das richtige.
Wenn also die Datei schon existiert, muss eine neue Zufallszahl erzeugt werden, wenn sie nicht existiert, ist die Schleife erfüllt und alles OK.
Jetzt kann ich ja die Schleife schlecht testen ob Sie im Ernstfall auch so funktioniert wie sie soll, und ich bin auch kein PHP-Profi, dass ich mich auf meine Programmierkünste selbst nicht verlassen möchte. Desshalb frage ich einfach mal euch, ob die Schleife so in Ordnung ist.

<?PHP
//Erzeugt einen neuen Dateinamen für Beitrag und überprüft ob bereits vorhanden
while(file_exists($datei)) {
 $rand = rand(10000,99999);
 $datei = "themen/$rand.txt";
}
?>

mfg bonehunter

  1. Hallo

    Warum benutzt du nicht einfach eine if-Abfrage?:

    if(file_exists($datei)) {
      $rand = rand(10000,99999);
      $datei = "themen/$rand.txt";
    }

    Daniel

    1. Holladiewaldfee,

      Warum benutzt du nicht einfach eine if-Abfrage?:

      Weil das zwei Paar Schuhe sind ;)
      Er will Zufallszahlen erzeugen und nachsehen, ob die Datei schon existiert, und wenn ja, noch eine Zufallszahl usw. Insofern ist seine Schleife richtig. Ich persönlich hätte es anders gelöst und würde in einer separaten Datei einen fortlaufenden Index speichern und diesen immer wieder auslesen und aktualisieren. Sein Board hat nämlich das Problem, daß es sich nach 89999 Einträgen in einer Endlosschleife verfängt...

      Ciao,

      Harry

      --
        Schnee :) Skitour gefällig?
        http://harry.ilo.de/projekte/berge/
      1. Hiho,

        Ich persönlich hätte es anders gelöst und würde in einer separaten Datei einen fortlaufenden Index speichern und diesen immer wieder auslesen und aktualisieren. Sein Board hat nämlich das Problem, daß es sich nach 89999 Einträgen in einer Endlosschleife verfängt...

        Es sind nicht soviele Beiträge zu erwarten, ist nur ein kleines Board für unseren Jugendtreff. Wenn im nächsten Jahr 50 Beiträge zusammenkommen ist es viel.

        mfg bonehunter

  2. Hallo,

    while(file_exists($datei)) {
     $rand = rand(10000,99999);
     $datei = "themen/$rand.txt";
    }
    ?>

    Ist natürlich falsch. Blöder Flüchtigkeitsfehler.

    So ist es richtg:
    while(!file_exists($datei)) {

    mfg bonehunter

    1. Holladiewaldfee,

      So ist es richtg:
      while(!file_exists($datei)) {

      Wieso?
      Du willst doch die Schleife solange durchlaufen, wie die entsprechenden Dateien existieren und erst abbrechen, wenn Du einen Dateinamen gefunden hast, der noch nicht existiert.

      Wahrscheinlich wäre aber ein do..while-Konzept sinniger, da dann die Abfrage der Bedingung am Schluß steht und die Schleife mindestens einmal durchlaufen wird.

      do
      ...
      while(file_exists($datei))

      Ciao,

      Harry

      --
        Schnee :) Skitour gefällig?
        http://harry.ilo.de/projekte/berge/
      1. Hallo Harry,

        while(file_exists($datei))

        Ich möchte doch, dass die Schleife verhindert, dass dieselbe Datei zweimal erzeugt wird. Also soll die Schleife nur beendet werden, wenn die Datei NICHT existiert. Also !file_exists($datei).

        Denke ich denn so falsch?

        mfg bonehunter

        1. Holladiewaldfee,

          Ich möchte doch, dass die Schleife verhindert, dass dieselbe Datei zweimal erzeugt wird. Also soll die Schleife nur beendet werden, wenn die Datei NICHT existiert. Also !file_exists($datei).

          Denke ich denn so falsch?

          Ja ;)

          "while" solltest Du grob übersetzen mit "so lange wie". Also: Führe die Schleife immer wieder aus, wenn die Bedingung erfüllt ist. Ist sie nicht erfüllt, breche ab (zumindest in Deiner Situation - in meinem Beispiel mit do..while ist es andersrum, daher auch der Vorschlag).

          Sprich: Die Schleife bricht ab, wenn die Bedingung hinter while() nicht mehr erfüllt ist - und genau das ist ja, was Du willst: Die Bedingung "file_exists()" ist dann nicht mehr erfüllt, wenn die Datei $datei nicht existiert ;)

          Ciao,

          Harry

          --
            Schnee :) Skitour gefällig?
            http://harry.ilo.de/projekte/berge/
          1. Hallo Harry,

            danke für deine Antwort. Jetzt verstehe ich das ganze besser. Dann müsste das ganze aber so aussehen, sonst würde die Schleife erst gar nicht ausgeführt werden.

            $rand = rand(10000,99999);
            $datei = "themen/$rand.txt";

            while(file_exists($datei)){
             $rand = rand(10000,99999);
            }

            Also ist deine do - while Schleife tatsächlich besser.

            Stimmt das so?

            do {
             $rand = rand(10000,99999);
             $datei = "themen/$rand.txt";
            } while (file_exists($datei));

            mfg bonehunter

            1. Holladiewaldfee,

              Stimmt das so?

              Jep. Alles ;)

              Ciao,

              Harry

              --
                Schnee :) Skitour gefällig?
                http://harry.ilo.de/projekte/berge/
              1. Hallo Harry,

                vielen Dank für deine Hilfe.

                mfg bonehunter

  3. Hallo,

    also mach es so:
    mach einen _unendlich_ langen Schleifen durchlauf

    $a = 0;

    while($a < 1){
     $rand = rand(10000,99999);
     $datei = "themen/$rand.txt";
    if(!file_exists($datei))
      {
      break;
      }
    }

    Mit break wird dein Schleifendurchlauf unterbrochen, wenn es die Datei NICHT gibt.

    MFG
    Andavos

    --
    http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr