Schleifen-Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Schleifen-Problem

    Moin.

    Es geht um einen Kalender. Nein, nicht gleich wieder wegklicken. Bitte. Es soll immer ein bestimmter Monat als HTML-Tabelle angezeigt werden und dabei soll jeder Tag, zu dem ein Ereignis in der DB vorliegt, als Link generiert werden. Das habe ich soweit alles hinbekommen - sofern entweder ein oder kein Ereignis vorhanden ist. Sobald mehr als ein Ereignis vorhanden ist, hat er mir zuvor (while falsch eingesetzt vermute ich) immer so oft, wie Einträge vorhanden waren, die HTML-Tabelle "vermehrt". Das habe ich nun soweit abgeschaltet. Dafür zeigt er mir allerdings auch bei mehreren Einträgen nur einen Link an. Hier einmal eine vereinfachte Form ohne Tabellen und den ganzen Rest:
    PHP-Code:
    <?php
        $dynmon 
    "3"
        
    //SQL
        
    include ('mySQL.inc.php');
               
        
    $conn mysql_connect($db_server,$db_user,$db_passwort) or die (mysql_error());
        
    $link mysql_select_db($db_name$conn) or die (mysql_error());

        
    $sqlab "select tag from kalender where monat = '$dynmon'";
        
        
    $res mysql_db_query($db_name$sqlab);    
        
    // SQL-Ende
        
        
    $row mysql_fetch_array($res);

        for (
    $i=1$i<=30$i++){
                            
            if(
    $i==$row['tag']){
               echo 
    "<a href=\"foobar\">".$i."</a><br>";
              } else {
                echo 
    "Normaler Tag  $i<br>";
            }        
        }    
        
    ?>
    $dynmon wird normalerweise dynamisch ermittelt.

    In diesem Fall ($dynmon = 3) liegen zwei Ereignisse vor, aber nur eines wird als Link angezeigt, das andere wird ignoriert. Hier rutscht er in das else. Wieso? Ich sage doch, dass er 30-mal schauen soll, ob $i einem Eintrag aus der DB entspricht. Oder?
    Können die mich nicht vor dem Frühstück töten?

  • #2
    Re: Schleifen-Problem

    Original geschrieben von Grega
    Wieso? Ich sage doch, dass er 30-mal schauen soll, ob $i einem Eintrag aus der DB entspricht. Oder?
    Du sagst, dass "er" dreißig Mal schauen soll, ob $i mit dem Wert 'tag' aus dem ersten Datensatz, den du aus der DB ausgelesen hast, übereinstimmt.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Okay. Sehe ich ein. Somit muss die Abfrage "nur" auf alle Elemente des Arrays angewendet werden. Habe jetzt einiges ausprobiert. Nichts führte zum Erfolg.

      Auch der hier nicht:
      PHP-Code:
      <?php
          $dynmon 
      "3"
          
      //SQL
          
      include ('mySQL.inc.php');
                 
          
      $conn mysql_connect($db_server,$db_user,$db_passwort) or die (mysql_error());
          
      $link mysql_select_db($db_name$conn) or die (mysql_error());

          
      $sqlab "select tag from kalender where monat = '$dynmon'";
          
          
      $res mysql_db_query($db_name$sqlab);    
          
      // SQL-Ende
          
          
      for ($i=1$i<=30$i++){
              
             while(
      $row mysql_fetch_array($res)){
              if(
      $i == $row['tag']){
            echo 
      "Link $i";
            } else {
            echo 
      "kein Link $i";
          }
             }
          }    
          
      ?>
      Das gibt mir nur zweimal "kein Link 1" aus. Ich dachte nur, weil das hier alle Einträge in dem Array (also alle in der DB) anzeigt:
      PHP-Code:
      for ($i=1$i<=30$i++){
                     while(
      $row mysql_fetch_array($res)){
                       
      $row['tag'];
             }
       } 
      Können die mich nicht vor dem Frühstück töten?

      Kommentar


      • #4
        Wenn du mit der while-Schleife einmal alle Datensätze im Ergebnis durchgelaufen bist, steht der Zeiger am Ende.
        Der nächste Aufruf deiner while-Schleife bewirkt also gar nichts mehr, weil mysql_fetch_array da sofort zu Beginn false liefert.
        Du könntest also mit mysql_data_seek den Zeiger zuerst zurücksetzen, bevor du wieder in die while-Schleife gehst.

        Aber auch das wäre m.E. unperformanter Unfug.
        Ich würde erst einmal das Ergebnisset in einer while-Schleife durchlaufen, und dabei ein Array anlegen - für jeden Tag ein Element, Tga dabei als nummerischen Index verwenden.

        Und in der for-Schleife dann nur noch überprüfen, ob es zu $i einen Array-Eintrag gibt, fertig.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Tjaja, das klingt so einfach... - das klingt so einfach.

          Also, ich habe jetzt das hier:
          PHP-Code:
          <?php
              
              
          //SQL
              
          include ('mySQL.inc.php');
              
          $dynmon "3";       
              
          $conn mysql_connect($db_server,$db_user,$db_passwort) or die (mysql_error());
              
          $link mysql_select_db($db_name$conn) or die (mysql_error());

              
          $sqlab "select tag from kalender where monat = '$dynmon'";
              
              
          $res mysql_db_query($db_name$sqlab);
              
          //SQL ende

              
          $data = array();
              while(
          $row mysql_fetch_assoc($res)){
                  
          $data[] = array($row['tag']);
                  }
          ?>
          Wenn ich dann print_r($data); mache, bekomme ich das hier:
          Code:
           Array (  [0] => Array  (  [0] => 27  )  [1] => Array  (  [0] => 16  )  )
          Zwei Ereignisse am 16. und am 27. Der Zugriff darauf ist aber richtig blöde... Zumal in einer for-Schleife.
          Können die mich nicht vor dem Frühstück töten?

          Kommentar


          • #6
            PHP-Code:
            ...
            $data[] = array($row['tag']);
            ...
            //besser so
            $data[] = $row['tag']; 
            So wie du es bis jetzt machst wird jedes Element von $data als Array definiert, obwohl es nur einen Wert beinhalten wird. Also besser auf array($row['tag']) verzichten.
            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              Ah, Danke. Klar, wenn man es sich jetzt anschaut, macht es Sinn.

              Nun ist das, was ich da bekomme ein nummerisches Array. Ich denke einmal, für eine leichtere if-Abfrage in der for-Schleife wäre ein assoziatives Array ganz nett. Ich habe dazu ganz einfach neben $data[] noch ein $data2[] gemacht und wollte diese über array_combine() einander zuweisen. Ja denkste, habe nur PHP4. Dann mal geschaut... - array_values() macht genau das, was ich - äh - nicht will. Kann man array_values() auch "umdrehen", also benutzen um aus einem nummerischen ein assoziatives Array zu machen?
              Können die mich nicht vor dem Frühstück töten?

              Kommentar


              • #8
                was ich da bekomme ein nummerisches Array. Ich denke einmal, für eine leichtere if-Abfrage in der for-Schleife wäre ein assoziatives Array ganz nett
                Also aus Sicht der Performance v.a. in Schleifen sind aber nummerisch indizierte Arrays sicherlich schneller (resp der Zugriff darauf ist schneller)

                In deinem Code könntest du das ganz einfach ändern
                PHP-Code:
                $data['blabla'] = $row['tag']; 
                Was es aber bringt sei mal dahingestellt, weil du ja nicht wissen kannst, wie gross das Array sein wird, wenn alle Resultate drinnen sind. Wenn du die Grösse eines Arrays nicht zum Voraus kennst würde ich dir schon nummerisch indizierte Arrays ans Herz legen.

                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  Hmm, okay. Habe jetzt das hier gemacht und bin der Sache schon recht nahe gekommen. Aber ganz ist es das dann leider doch nicht.
                  PHP-Code:
                  <?php
                      
                      
                  //SQL
                      
                  include ('mySQL.inc.php');
                    
                  $dynmon "3";       
                      
                  $conn mysql_connect($db_server,$db_user,$db_passwort) or die (mysql_error());
                      
                  $link mysql_select_db($db_name$conn) or die (mysql_error());

                      
                  $sqlab "select tag from kalender where monat = '$dynmon'";
                      
                      
                  $res mysql_db_query($db_name$sqlab);
                      
                  //SQL ende

                      
                  $data = array();
                      
                      while(
                  $row mysql_fetch_array($res)){
                          
                  $data[] = $row['tag'];    
                      }    
                      
                      for (
                  $i=1$i<=30$i++){
                          for(
                  $a=0$a<count($data); $a++){
                            if(
                  $i == $data[$a]){
                               echo 
                  "Link <a href='foo'>$i</a><br>";
                            }
                          
                          }
                          echo 
                  "kein Link $i<br>";
                      
                    }
                      
                  ?>
                  Die Ausgabe schaut dann so aus, dass ich für jeden Tag ein kein Link x erhalte. Wenn ein Ereignis vorhanden ist, dann macht er brav ein Link x. Könnte so schön sein. Blöderweise werden aber auch die Tage mit den Ereignissen noch einmal unter den Links mit kein Link x aufgeführt. Also doppelt. Bin aber schon einmal froh, das es soweit klappt. Nur wie bekommt man die überflüssigen Tage weg?

                  Wenn man das echo "kein Link $i<br>"; in ein else bei der if-Abfrage steckt, dann kommt richtig Murks bei raus. Damit wäre ich wieder bei meinem Ursprungsproblem...
                  Können die mich nicht vor dem Frühstück töten?

                  Kommentar


                  • #10
                    Du scheinst mir nicht so ganz zu verstehen was du eigentlich machst Schau dir folgende Zeilen an
                    PHP-Code:
                    for($a=0$a<count($data); $a++){
                              if(
                    $i == $data[$a]){
                                 echo 
                    "Link <a href='foo'>$i</a><br>";
                              }
                            
                            }
                            echo 
                    "kein Link $i<br>";

                    Wenn deine Bedingung erfüllt ist printest du 'Link...' DANN printest du aber in jedem Fall noch ein kein Link !
                    PHP-Code:
                    for($a=0$a<count($data); $a++){
                              if(
                    $i == $data[$a]){
                                 echo 
                    "Link <a href='foo'>$i</a><br>";
                              }else{
                                 echo 
                    "kein Link $i<br>";
                              }
                            
                         } 
                    Versuchs mal so und schau ob die unerwünschten Ausgaben nur weg sind

                    Gruss

                    tobi
                    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                    Kommentar


                    • #11
                      Jaaa. Dass ich manchmal nicht weiß, was ich mache - soll schon mal vorgekommen sein. Aber: Dein Voschlag, den hatte ich schon in der Mangel. Dabei kommt folgendes heraus:

                      Code:
                      (...)
                      kein Link 13
                      kein Link 13
                      kein Link 14
                      kein Link 14
                      kein Link 15
                      kein Link 15
                      kein Link 16
                      Link 16
                      kein Link 17
                      kein Link 17
                      (...)
                      Können die mich nicht vor dem Frühstück töten?

                      Kommentar


                      • #12
                        PHP-Code:
                        while($row mysql_fetch_array($res)){
                           
                        $data[] = $row['tag'];    
                        }    

                        for (
                        $i=1$i<=30$i++){
                           if(
                        in_array($i$data)) {
                              echo 
                        "Link <a href='foo'>$i</a><br>";
                           }
                           else {
                              echo 
                        "kein Link $i<br>";
                           }

                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Na, das sieht doch nach was aus. Ach Quatsch: Das ist doch was! Die Anordnung hatte ich auch schon, aber da war ich noch nicht bei der while-Schleife angekommen. "Damals" (gestern irgendwann früh ) wurden nur die Links ausgegeben. Jetzt ist es richtig. Danke!

                          Jetzt werde ich das mal ins Rest-Skript einbauen und schauen, wie es sich da macht.
                          Können die mich nicht vor dem Frühstück töten?

                          Kommentar


                          • #14
                            *ähmmräusper* Ich dann doch noch einmal.

                            Das Teil läuft ja jetzt sehr schön. Allerdings hatte ich vergessen, bzw. zunächst bewusst aus den Augen verloren, dass ein generierter Link ja noch etwas benötigt: Einen Parameter, der mit übergeben wird. Dazu wird in der SQL-Abfrage noch die ID ausgelesen. Diese soll als Parameter num an den Link gehängt werden. Aber wie?

                            Mein Gedanke (s.u.) kann nach einigem Überlegen natürlich nicht funktionieren. Würde man ein Event am Tag 4 haben, dann wird mit if(in_array($i, $data)) geschaut ob 4 im Array data ist. Bei true wird der Link generiert. Meine Idee mit dem Array idholder kann da nicht gehen. Schließlich würde er das Element mit dem Key 4 anzeigen wollen. Bullshit. Muss jetzt doch irgendwie ein assoziatives Array her?

                            Code-Auszug:
                            PHP-Code:
                            $sqlab "select tag, ID from kalender where monat = '$dynmon'";
                            $res mysql_db_query($db_name$sqlab);

                            // sind ereignisse vorhanden?
                            $data = array(); // leeres array anlegen
                            $idholder = array();
                            while(
                            $row mysql_fetch_array($res)){
                                    
                            $data[] = $row['tag'];    // array mit daten aus tag fuellen
                                    
                            $idholder[] = $row['ID'];
                            }
                            // ende ereignisse-abfrage
                                
                            for ($i=1$i<=$last$i++){
                            //abfrage ob ein link generiert werden soll
                                
                            if(in_array($i$data)) {
                                    echo 
                            "\t<td><a href=\"".$_SERVER['PHP_SELF']."?num=".$idholder['$i']."\">".$i."</a></td>\n";
                                  }else {
                                  echo 
                            "\t<td>$i</td>\n";
                                  }
                            //ende link-abfrage

                            Können die mich nicht vor dem Frühstück töten?

                            Kommentar


                            • #15
                              Dann nutze in der while-Schleife beim befüllen des Arrays doch einfach den Tag als Index:
                              PHP-Code:
                              $idholder[$row['tag']] = $row['ID']; 

                              Und beim Ausgeben gehört hier $idholder['$i'] das $i natürlich nicht in einfache Anführungszeichen - dabei wird $i nicht durch seinen Wert ersetzt, sondern du würdest mit dem Text '$i' versuchen auf das Array zuzugreifen! Also nur $idholder[$i].
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X