Jonny F.: for schleifen verständniss Problem

Hallo,

ich verstehe es nicht, ich versuche mir eine For-Schleife zu Basteln die eine Blätternausgabe erstellen soll.

so

  
$seiten=5;  
for($i = 0; $i == $seiten  ; $i = $i + 1) {  
echo $i;  
 }

Die Ausgabe müsste dann doch jetzt so aussehen

12345 oder lieg ich da falsch...

Hab grad voll den druchhänger

Gruß Jonny F.

  1. Moinsen!

    $seiten=5;
    for($i = 0; $i == $seiten  ; $i = $i + 1) {
    echo $i;
    }

    
    >   
    > Die Ausgabe müsste dann doch jetzt so aussehen  
    >   
    > 12345 oder lieg ich da falsch...  
      
    Ja. Du hast recht!  
      
    Du liegst falsch.  
      
    $i == $seiten ist wann true? Ist das bei Beginn der Schleife der Fall?  
      
    Deine Schleife erfuellt Die Bedingung zum Loopen sofort nicht mehr.  
    
    -- 
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."  
          - T. Pratchett
    
  2. $seiten=5;
    for($i = 0; $i == $seiten  ; $i = $i + 1) {
    echo $i;
    }

    
    >   
    > Die Ausgabe müsste dann doch jetzt so aussehen  
    >   
    > 12345 oder lieg ich da falsch...  
      
    Ja, du liegst falsch. Die Ausgabe müsste ein Leerstring sein da `$i == seiten;`{:.language-php} niemals zutreffen wird - und auch wenn du diesen fehler korrigierst, wird die Ausgabe nicht richtig sein.  
      
    btw: $i = $i + 1 lässt sich mit $i++ abkürzen.  
      
    
    > Hab grad voll den druchhänger  
      
    Du hast auch vergessen zu erwähnen, was aktuell bei deinem Code ausgegeben wird (nicht, dass das nicht offensichtlich wäre - aber du bist lange genug dabei um zu wissen, dass eine ordentliche Fehlerbeschreibung bei der Lösungsfindung sehr sehr hilfreich sein kann - auch für dich selbst).
    
    1. btw: $i = $i + 1 lässt sich mit $i++ abkürzen.

      ja des weiß ich, ich habe es nur so hingeschrieben weil ich gedacht hab das der PHP-Mensch es nicht akzeptiert. :D

      Trotzdem danke für die Aufklärung.

      Gruß Jonny F.

      1. ja des weiß ich, ich habe es nur so hingeschrieben weil ich gedacht hab das der PHP-Mensch es nicht akzeptiert. :D

        Der PHP-Mensch (wenn du damit den PHP-Interpreter meinst) ist sogar mit '++$i', '$i ++' oder '++ $i' zufrieden.

  3. Hi!

    $seiten=5;
    for($i = 0; $i == $seiten  ; $i = $i + 1) {
    echo $i;
    }

    
    >   
    > Die Ausgabe müsste dann doch jetzt so aussehen  
      
    Die Bedingung in der Mitte muß zu true evaluieren, damit die Schleife fortgeführt wird - dort steht $i==5, deshalb gibt Dein Code nur eine 0 aus.  
      
    off:PP  
      
      
    
    -- 
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)  
    
    
    1. Die Bedingung in der Mitte muß zu true evaluieren, damit die Schleife fortgeführt wird - dort steht $i==5, deshalb gibt Dein Code nur eine 0 aus.

      Nein, eine 0 darf er nicht ausgeben - die Prüfung findet bei einer for-Schleife stehts VOR der Ausführung statt.

      Etwas ähnliches wie do-while im sinne einer for-Schleife gibt es afaik in php nicht.

      1. Hi!

        Die Bedingung in der Mitte muß zu true evaluieren, damit die Schleife fortgeführt wird - dort steht $i==5, deshalb gibt Dein Code nur eine 0 aus.

        Nein, eine 0 darf er nicht ausgeben - die Prüfung findet bei einer for-Schleife stehts VOR der Ausführung statt.

        Ja, du hast recht - ich habe es bereits korrigiert.

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      2. Hallo,

        Etwas ähnliches wie do-while im sinne einer for-Schleife gibt es afaik in php nicht.

        Kann man bauen, z.B.:

        for ($i = 1, $first = True; ($i < 5) || $first; $i++, $first = False) {  
            echo $i;  
        }
        

        Freundliche Grüße

        Vinzenz

        1. Kann man bauen, z.B.:

          Ja natürlich aber, aber ein fertige built-in Lösung für eine for-schleife mit nachheriger Prüfung gibt es nicht :)

      3. Hi!

        Etwas ähnliches wie do-while im sinne einer for-Schleife gibt es afaik in php nicht.

        Doch -  gibt es schon.

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
        1. Doch -  gibt es schon.

          nein, das meinte ich nicht :)

          while verhält sich zu for wie do while zu ?

          1. Hi,

            while verhält sich zu for wie do while zu ?

            Wie do und anschliessendes for :-)

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    2. Hi!

      deshalb gibt Dein Code nur eine 0 aus.

        
      <del>0</del><ins>Nichts</ins>  
      
      

      off:PP

      --
      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  4. @@Jonny F.:

    nuqneH

    for($i = 0; $i == $seiten  ; $i = $i + 1)

    Die Schleife wird nicht solange, bis der zweite Ausdruck wahr ist, ausgeführt; sondern sie wird, solange der zweite Ausdruck wahr ist, ausgeführt.

    Du möchtest die Bedingung negieren.

    Zum Hochzählen gibt es de Operator $i++.

    12345 oder lieg ich da falsch...

    Du möchtest bei 1 anfangen zu zählen.

    Qapla'

    --
    Volumen einer Pizza mit Radius z und Dicke a: pi z z a
    1. Du möchtest die Bedingung negieren.

      Oder eine andere geeignete Bedingung wählen.

  5. Mahlzeit Jonny F.,

    for($i = 0; $i == $seiten  ; $i = $i + 1) {

    Ich würde es einfacher $i++ schreiben ...

    Hab grad voll den druchhänger

    Als Ergänzung zu Steels Erklärung:

    In PHP (wie auch den meisten Sprachen mit C-Syntax) legst Du bei for mit dem ersten Ausdruck fest, was zu Beginn der Schleife (bzw. genauer: vor dem Starten der Schleife) passieren soll, mit dem zweiten Ausdruck legst Du fest, wielange die Schleife laufen soll, und mit dem dritten legst Du fest, was in jedem Schleifendurchgang passieren soll.

    Dabei bedeutet der zweite Ausdruck mehr oder weniger umgangssprachlich "solange diese Bedingung erfüllt ist" (d.h. die Bedingung muss wahr sein, damit die Schleife durchlaufen wird) ... in Deinem Fall müsste es also $i <= $seiten heißen.

    In anderen Sprachen ist das anders - da wird bei for-Schleifen das Abbruchkriterium angegeben und die Schleife läuft solange, wie es noch nicht erreicht ist (d.h. die Bedingung muss falsch sein, damit die Schleife durchlaufen wird).

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. In anderen Sprachen ist das anders - da wird bei for-Schleifen das Abbruchkriterium angegeben und die Schleife läuft solange, wie es noch nicht erreicht ist (d.h. die Bedingung muss falsch sein, damit die Schleife durchlaufen wird).

      stimmt :D war grad komplett in der falschen Sprache :D

      danke jetzt funktioniert es auch.

      Gruß Jonny F.

  6. Hier ist mal die Rohfassung meiner Blätternschleife :D

    $daten_pro_seite sind ist die Anzahl der Daten die angezeigt werdensollen

    $datenanzahl ist die Gesamtanzahl der Daten

    $aktseit ergibt sich in der Schleife

    Die variablen Namen sind jetzt nicht wirklich gut, okey sie sind sch*** aber habs auf die schnelle gemacht, werd es noch bearbeiten und Designen dann Poste ich es nochmal.

      
    $seiten= ceil($datenanzahl/$daten_pro_seite);  
    if(isset($_GET['aktseit'])){  
    $aktseiten=$_GET['aktseit'];  
    }  
    else{  
    $aktseiten=1;  
    }  
      
      
    $vorher=$aktseiten-1;  
    $nachher=$aktseiten+1;  
    $fortlaufende_nummer = 0;  
    // Die Schleife zeigt jeden X-ten ($daten_pro_seite) Datensatz mit einem Link an  
    for($zaehler = 0; $zaehler < $datenanzahl  ; $zaehler = $zaehler + $daten_pro_seite) {  
        $fortlaufende_nummer++;  
        //Erste Seite, wenn nicht gerade ausgewählt ist  
        if($aktseiten!=1 && $fortlaufende_nummer==1){  
            echo "<a href=\"?seitenzahl=$zaehler&&aktseit=$fortlaufende_nummer\" style=\"font-size:10pt; font-family:Arial; \">Anfang</a>";  
        }  
        //Eine Seite zurück wenn Seite vorhanden  
        if($vorher == $fortlaufende_nummer && $aktseiten!=1){  
            echo "<a href=\"?seitenzahl=$zaehler&&aktseit=$fortlaufende_nummer\" style=\"font-size:10pt; font-family:Arial; \">  zurück  </a>";  
        }  
        //Zeigt die aktuelle Seite an  
        if($aktseiten==$fortlaufende_nummer){  
            echo "<a style=\"font-size:10pt; font-family:Arial; font-weight:bold; \">$fortlaufende_nummer</a>";  
        }  
        //Eine Seite nach vorne, wenn vorhanden  
        if($nachher == $fortlaufende_nummer && $aktseiten!=$seiten){  
            echo "<a href=\"?seitenzahl=$zaehler&&aktseit=$fortlaufende_nummer\" style=\"font-size:10pt; font-family:Arial; \">  vor  </a>";  
        }  
        //Letzte Seite, wenn nicht schon ausgewählt ist  
        if($fortlaufende_nummer==$seiten && $aktseiten!=$seiten ){  
            echo "<a href=\"?seitenzahl=$zaehler&&aktseit=$fortlaufende_nummer\" style=\"font-size:10pt; font-family:Arial; \">Ende</a>";  
        }  
    }  
      
    
    

    Danke für eure Hilfe

    Gruß Jonny F.

    1. Hallo Johnny,

      Du bist doch auch in Perl unterwegs? Ist Dir der Taintmode ein Begriff?

        
      # Übernimmst Du ungeprüft Daten von außen?  
      # Hier ja.  
        
      
      > $seiten= ceil($datenanzahl/$daten_pro_seite);  
      > if(isset($_GET['aktseit'])){  
      >     $aktseiten=$_GET['aktseit'];  
      > }  
      > else{  
      >     $aktseiten=1;  
      > }  
        
      
      > $vorher=$aktseiten-1;  
      > $nachher=$aktseiten+1;  
      
      

      jetzt hast Du schon drei Variablen, denen man nicht ansehen kann, dass sie ungeprüfte Inhalte von außen enthalten.

      Warum nicht

      $aktseiten = 1;  
      if (isset($_GET['aktseit'])) {  
          $aktseiten = [link:http://de.php.net/manual/de/function.intval.php@title=intval]($_GET['aktseit']);  
      }  
        
      # Du kannst nun sicher sein, dass $aktseiten eine Integer enthält.  
      # Frage: wie ist der zulässige Wertebereich für $aktseiten?  
        
      $vorher  = $aktseiten - 1;  
      $nachher = $aktseiten + 1;  
      
      

      den Rest des Codes hab' ich mir nicht angeschaut.

      Freundliche Grüße

      Vinzenz

      1. Hallo Vinzenz,

        Du bist doch auch in Perl unterwegs? Ist Dir der Taintmode ein Begriff?

        Ja die Tademode ist mir ein Begriff.

        jetzt hast Du schon drei Variablen, denen man nicht ansehen kann, dass sie ungeprüfte Inhalte von außen enthalten.

        Ja mein Post ging ja nicht um Variablen verarbeiteung ect. sondern nur um die funktionalität, wie ich diese Blätternschleife zum laufe bringe natürlich wird jetzt noch alles safety gemacht :D

        $aktseiten = 1;

        if (isset($_GET['aktseit'])) {
            $aktseiten = link:http://de.php.net/manual/de/function.intval.php@title=intval;
        }

        Du kannst nun sicher sein, dass $aktseiten eine Integer enthält.

        Frage: wie ist der zulässige Wertebereich für $aktseiten?

        $vorher  = $aktseiten - 1;
        $nachher = $aktseiten + 1;

          
        Vielen Dank dass du mich noch mal darauf aufmerksam gemacht hast des hätte ich jetzt nicht bedacht.  
          
        Gruß Jonny F.