conni: Gruppenwechsel

Hallo zusammen,
ich möchte in einer Datenbankausgabe eine Gruppenwechsel realisieren. Habe auch einige Hinweise dazu im Forum gefunden, kriege es aber nicht angepasst.

In einer Mysql-DB sind die Seminare in verschiedenen Tabellen gespeichert. Unter anderem auch der Beginn des jeweiligen Seminars. Nun möchte ich eine Anzeige aller Seminare gruppiert nach Monaten erzeugen.

Der Quellcodeauszug sieht so aus:
$result_vorschau = mysql_query ("SELECT s.id_seminar, t.von, ...
  FROM seminar s, termine t, ...
  WHERE ...
  ORDER BY t.von")
  or die (mysql_error());

while ($row = mysql_fetch_array ($result_vorschau)) {

//Ermitteln des Monats - klappt
 $suchmuster = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/");
 $ersetzenmonat = array ("\3", "$\1 =");
 $monat = preg_replace($suchmuster, $ersetzenmonat, $row["von"]);
  echo "  Monat: ".$monat;

//Umwandlung der Daten in deutsches Format
 $ersetzen = array ("\4.\3.\1\2", "$\1 =");
 $von = preg_replace($suchmuster, $ersetzen, $row["von"]);

// Ab hier bräuchte ich Hilfe
$gruppe = ''; //Leeres Array erzeugen
  if ($gruppe != $monat)
  {
    /* Überschrift ausgeben und Gruppe für nächsten Vergleich merken */
   echo "<tr><td colspan='5'><hr><b>" . $monat . " gruppe: ".$gruppe."</b></td></tr>\n";
    $gruppe = $monat;
   echo "<tr><td colspan='5'><b>gruppe: ".$gruppe."</b></td></tr>\n";
  }
  /* Zeile immer ausgeben - nur manchmal davor eben die Überschrift */
  ?>
  <tr>
    <td><?php echo $row['id_termin'].":".$row['art_nr']."".$row['hgr_kurz'].".".$row['zielgr_kurz']." ".$row['sem_nr'];  ?></td>
 <td><?php echo " von: ".$von." bis ".$bis; ?></td>
    <td><?php echo $frist; ?></td>
    <td><?php echo $row['zielgruppe']." ".$row['zusatz']; ?></td>
    <td><?php echo $row['haus'].", ".$row['raum']; ?></td>
  </tr>
 <?php } ?>

Als Ergebnis werden mir alle Datensätze chronologisch angezeigt, immer mit "Überschriftszeile".

Ich würde mich freuen, wenn mir da jemand auf die Sprünge helfen könnte.

Gruß
Conni

  1. Moin!

    Ich entnehme Deinem Skript, dass die Datumsangaben im ISO-Format (YYYY-MM-DD) gespeichert sind.

    Ok. Welchen Typ hat Dein Datenfeld?
    Ist es vom Typ datetime? Dann beginne hier zu lesen:

    http://dev.mysql.com/doc/mysql/de/datetime.html

    dann weiter mit:

    http://dev.mysql.com/doc/mysql/de/date-calculations.html (besonders ganz unten ... MONTH())

    Dazu:

    http://dev.mysql.com/doc/mysql/de/date-and-time-functions.html

    und nun zum 'Gruppieren':

    http://dev.mysql.com/doc/mysql/de/select.html

    SELECT ,,,,MOUNTH('t.von') AS monat, YEAR('t.von') AS Jahr
    FROM
    ...
    ORDER BY Jahr, Monat
    ...

    In der Konsequenz kannst Du auf den inperformanten Regex verzichten und auch das Sortieren / Gruppieren dem DBMS übertragen. Das hat dafür heftig schnelle Routinen.

    Du kannst die Funktionen auch in der WHERE Klausel verwenden:

    SELECT ,,,,MOUNTH('t.von') AS monat, YEAR('t.von') AS Jahr
    ...
    WHERE Monat=12 AND Jahr=2005

    Du kannst also die Arbeit beruhigt der Datenbank überlassen, die macht das schon.

    ===========================================
    In jedem anderen Fall: (Ich wüsset nur gerade keinen, es sei denn Du willst unbedingt vermeiden die DB mehrfach zu fragen:

    Schreibe den Termin nicht einfach zum Useragent, sondern speichere das Ergebnis in einen Array:

    $termin=array();
    while ($row = mysql_fetch_array ($result_vorschau)) {
      $termin[]=array();
    ...
      $termin[]['Monat']=$row['Monat'];
      $termin[]['Jahr']=$row['Jahr'];

    # Nur wenn Du die Monate brauchst, an denen was los ist:
      #=======================================================
      $arJahreMonate[$row['Monat'].'-'.$row['Jahre']]=true;
      # erzeugt sowas wie $arJahre_Monate[2005-09]=true;

    # Dieses Array kannst Du später mit
      # array_keys ($arJahreMonate) ausgeben.
      # http://de2.php.net/manual/de/function.array-keys.php

    ...
    }

    $arJahreMonateListe= array_keys ($arJahreMonate);

    $arJahreMonateListe enthält jetzt eine Liste der Jahre-Monate in denen was los ist.

    oder ausgeben oder sortieren oder ...

    http://de2.php.net/manual/de/ref.array.php

    foreach ($arJahreMonate AS $strJahrMonat) {

    }

    oder eben auch direkt adressieren:

    echo $arJahreMonate['2005-12'];

    oder ... oder ...

    Ich denke, das genügt als Sammlung von Denkanstößen.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. Hallo,
      danke erstmal für die späte/frühe Antwort.

      Ich entnehme Deinem Skript, dass die Datumsangaben im ISO-Format (YYYY-MM-DD) gespeichert sind.

      Ja

      SELECT ,,,,MOUNTH('t.von') AS monat, YEAR('t.von') AS Jahr
      FROM
      ...
      ORDER BY Jahr, Monat
      ...

      Hab ich versucht. Aber es klappr leider schon an dieser Stelle nicht. Meine nun stark verkürzte Datenbankabfrage:
      $result_vorschau = mysql_query ("SELECT s.id_seminar,
      t.von, MONTH('t.von') AS monat, YEAR('t.von') AS jahr
        FROM seminar s, termine t
        WHERE t.id_seminar = s.id_seminar
        ORDER BY jahr, monat")
           or die (mysql_error());

      while ($row = mysql_fetch_array ($result_vorschau)) {
      echo "  Monate: ".$row['monat']." von: ".$row['von'];
      }

      zeigt nur die "von-Termine" im sql-Format an.

      Liegt das vielleicht an der sql-Version? Ich verwende MySQL 4.0.24.

      Viele Grüße
      Conni

      1. Moin!

        $result_vorschau = mysql_query ("SELECT s.id_seminar,
        t.von, MONTH('t.von') AS monat, YEAR('t.von') AS jahr

        zeigt nur die "von-Termine" im sql-Format an.

        Mein Fehler. Die Spaltennamen werden nicht gequotet:

        $result_vorschau = mysql_query ("SELECT s.id_seminar,
        t.von, MONTH(t.von) AS monat, YEAR(t.von) AS jahr

        So sollte es 'tun'.

        Ist spät....

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. Hallo nochmal,

          $result_vorschau = mysql_query ("SELECT s.id_seminar,
          t.von, MONTH(t.von) AS monat, YEAR(t.von) AS jahr
          So sollte es 'tun'.

          Ja, das hat geklappt.

          Ist spät....

          Schon toll, dass um diese Zeit immer noch Leute hier anderen helfen!

          Allerdings ist die Anzeige nicht wie gewünscht, d.h. manche Datensätze werden 1 Mal, manche 2 Mal oder 3 Mal ausgegeben. An der Select-Abfrage kann es wohl nicht liegen, denn wenn ich sie ohne den Versuch einer monatsweisen Anzeige durchlaufen lasse, kommt jede Veranstaltung nur ein Mal vor.

          Ich hätte vor allen Dingen gerne vor oder nach jedem Monat eine visuelle Unterscheidung - bei mir erstmal eine horizontale Linie. Diese wird aber nach jedem Datensatz angezeigt.

          Habe es mit deinem Quelltext versucht:
          $termin=array();
           while ($row = mysql_fetch_array ($result_vorschau)) {

          $termin[]=array();
            $termin[]['monat']=$row['monat'];
            $termin[]['jahr']=$row['jahr'];

          $arJahreMonate[$row['monat'].'-'.$row['jahr']]=true;

          $arJahreMonateListe= array_keys ($arJahreMonate);

          foreach ($arJahreMonate AS $strJahrMonat){
          echo "<tr><td colspan='5'><hr><b>" . $row['monat'] ."</b></td></tr>\n";
          ?>
            <tr>
              <td><?php echo $row['id_termin'].":".$row['art_nr']."".$row['hgr_kurz'].".".$row['zielgr_kurz']." ".$row['sem_nr'];  ?></td>
           <td><?php echo " von: ".$von." bis ".$bis; ?></td>
              <td><?php echo $frist; ?></td>
              <td><?php echo $row['zielgruppe']." ".$row['zusatz']; ?></td>
              <td><?php echo $row['haus'].", ".$row['raum']; ?></td>
            </tr>

          <?php }}

          Ich kann da keinen Fehler finden, muss aber gestehen, dass ich nicht unbedingt der PHP-Überflieger bin.

          Viele Grüße
          conni

          1. Moin!

            Allerdings ist die Anzeige nicht wie gewünscht, d.h. manche Datensätze werden 1 Mal, manche 2 Mal oder 3 Mal ausgegeben. An der Select-Abfrage kann es wohl nicht liegen, denn wenn ich sie ohne den Versuch einer monatsweisen Anzeige durchlaufen lasse, kommt jede Veranstaltung nur ein Mal vor.

            Ich hätte vor allen Dingen gerne vor oder nach jedem Monat eine visuelle Unterscheidung - bei mir erstmal eine horizontale Linie. Diese wird aber nach jedem Datensatz angezeigt.

            Habe es mit deinem Quelltext versucht:
            $termin=array();
            while ($row = mysql_fetch_array ($result_vorschau)) {

            $termin[]=array();
              $termin[]['monat']=$row['monat'];
              $termin[]['jahr']=$row['jahr'];

            $arJahreMonate[$row['monat'].'-'.$row['jahr']]=true;

            }

            $arJahreMonateListe= array_keys ($arJahreMonate);

            foreach ($arJahreMonate AS $strJahrMonat) {

            echo "<tr style='border-top:1px solid gray;'><td colspan='5'><strong>" . $row['monat'] ."</strong></td></tr>\n";

            ?>
              <tr>
                <td><?php echo $row['id_termin'].":".$row['art_nr']."".$row['hgr_kurz'].".".$row['zielgr_kurz']." ".$row['sem_nr'];  ?></td>
            <td><?php echo " von: ".$von." bis ".$bis; ?></td>
                <td><?php echo $frist; ?></td>
                <td><?php echo $row['zielgruppe']." ".$row['zusatz']; ?></td>
                <td><?php echo $row['haus'].", ".$row['raum']; ?></td>
              </tr>

            <?php }

            Ich kann da keinen Fehler finden, muss aber gestehen, dass ich nicht unbedingt der PHP-Überflieger bin.

            Die Brackets... Du hast die Klammern zwar syntaktisch richtig, aber logisch falsch geschlossen. Das liegt zumeist an der Uhrzeit... Übermüdet mache ich selbst auch mehr Fehler, als wenn ich fit bin.

            Zu Deiner 'Linie': Wie soll die denn aussehen?
            Ich mal <tr style='border-top:1px solid gray;'>, das von Dir verwendete <hr> sollte nicht an der gewünschten Stelle, sondern sonstwo, zumeist über der Tabelle angezeigt werden.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
            1. Guten Morgen,

              danke erstmal.

              Die Brackets... Du hast die Klammern zwar syntaktisch richtig, aber logisch falsch geschlossen. Das liegt zumeist an der Uhrzeit...

              Bei mir glaube ich das langsam nicht mehr. Egal, wie ich die Klammern setze, es kommt nicht das Richtige raus.

              Mit:
              $termin=array();
              while ($row = mysql_fetch_array ($result_vorschau)) {
                 $termin[]=array();
                 $termin[]['monat']=$row['monat'];
                 $termin[]['jahr']=$row['jahr'];

              $arJahreMonate[$row['monat'].'-'.$row['jahr']]=true;
              }
               $arJahreMonateListe= array_keys ($arJahreMonate);

              foreach ($arJahreMonate AS $strJahrMonat) {
               echo "<tr style='border-top:1px solid gray;'><td colspan='5'><strong>" . $row['monat'] ."</strong></td></tr>\n";
              ?>
                <tr>
                <td><?php echo $row['id_termin'].":".$row['art_nr']."".$row['hgr_kurz'].".".$row['zielgr_kurz']." ".$row['sem_nr'];  ?></td>
                <td><?php echo " von: ".$von." bis ".$bis; ?></td>
                <td><?php echo $frist; ?></td>
                <td><?php echo $row['zielgruppe']." ".$row['zusatz']; ?></td>
                <td><?php echo $row['haus'].", ".$row['raum']; ?></td>
                </tr>
              <?php }

              werden nur noch drei leere Tabellenzeilen, statt 7 angezeigt.
              Die Zeile mit dem grauen oberen Rahmen kommt gar nicht vor.

              Zu Deiner 'Linie': Wie soll die denn aussehen?

              Das ist mir erstmal egal. Das kriege ich dann mit HTML und CSS schon hin. Nur PHP ist halt nicht so einfach (ist ja auch keine Formatierungssprache).

              Wenn du mir da noch mal helfen könntest, wär ich wirklich froh.

              Viele Grüße
              conni

              1. Moin!

                <td><?php echo $row['id_termin'].":".$row['art_nr']."".$row['hgr_kurz'].".".$row['zielgr_kurz']." ".$row['sem_nr'];  ?></td>
                  <td><?php echo " von: ".$von." bis ".$bis; ?></td>
                  <td><?php echo $frist; ?></td>
                  <td><?php echo $row['zielgruppe']." ".$row['zusatz']; ?></td>
                  <td><?php echo $row['haus'].", ".$row['raum']; ?></td>
                  </tr>
                <?php }

                Das wieder 'nur' ein logisches Problem. Überleg mal: $row ist 'erledigt', diesen Array könntest Du nach dem

                while ($row = mysql_fetch_array ($result_vorschau)) {

                }

                mit  unset ($row) löschen.

                Alles, was Du jetzt noch brauchst sollte in $termin[] stehen. Wenn nicht schreib es rein.

                foreach ($arJahreMonate AS $strJahrMonat) {

                $arAuswahlTermin=explode('-',$strJahrMonat);
                 # Jetzt hast Du in $arAuswahlTermin[0] das Jahr und in $arAuswahlTermin[1] den Monat

                echo "<tr style='border-top:1px solid gray;'><td colspan='5'><strong>" . $row['monat'] ."</strong></td></tr>\n";

                foreach ($arTermine as $arTermin) {
                   # Bitte Plural/Einzahl beachten!

                if  (
                      ($arTermin['jahr']==$arAuswahlTermin[0])
                      &&
                      ($arTermin['monat']==$arAuswahlTermin[1])
                     {

                echo '<td>'.$arTermin['id_termin'].':'.$arTermin['art_nr'].':'.$arTermin['hgr_kurz'].'.'.$arTermin['zielgr_kurz']." ".$arTermin['sem_nr'].'</td>';

                } # end if

                } # next $arTermine

                }  # next $arJahreMonate

                Was passiert da?

                In der While-Schleife bildest also bei der Auswertung des results zwei Arrays. Einer enthält:

                $arJahreMonate= array('2004-01','2004-02','2004-03',...'2005-01','2004-01'...)

                Der andere enthält:

                $arTermine=array(0....n)
                $arTermine[$x]['jahr']= wert aus $row
                $arTermine[$x]['monat']=wert aus $row
                ...
                $arTermine[$x]['zielgruppe']=wert aus $row['zielgruppe']

                Nach Abarbeitung der Whileschleife ist (der Array) $row nutzlos

                Jetzt nimmst Du in der ersten foreach-Schleife jedes einzelne Element von $arJahreMonate und splittest das in Monat und Jahr.

                In der zweiten (eingeschlossenen ) foreach-Schleife nimmst Du jeden Termin und testest, ob dieser im Jahr und Monat liegt. (if-Bedingung)

                Wenn ja: Ausgabe.
                Sonst: nichts.

                endif
                next Termin
                next MonatJahr

                Damit solltest Du hübsch sortiert in der Reihenfolge die Termine nach Monat und Tag sortiert bekommen. Wenn nicht, dann sortiere den Array $arJahreMonate zusätzlich.

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix®

                --
                Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
                1. Hallo nochmal,

                  leider war ich gestern offline und konnte erst heute wieder an meinem Problem rumknabbern.
                  Ich hoffe, es schaut nochmal jemand in dieses Posting und könnte mir auf die Sprünge helfen. Ich würde nur ungern ein Doppelposting loslassen.

                  Habe den Quelltext nun wie folgt angepasst:
                  while ($row = mysql_fetch_array ($result_vorschau)) {

                  $termin[]=array();
                     $termin[]['monat']=$row['monat'];
                     $termin[]['jahr']=$row['jahr'];

                  $arTermine[]= array();
                  $arTermine[]['jahr']= $row['jahr'];
                  $arTermine[]['monat']=$row['monat'];
                  $arTermine[]['id_termin']=$row['id_termin'];
                  ...
                  $arTermine[]['zielgruppe']=$row['zielgruppe'];

                  $arJahreMonate[$row['monat'].'-'.$row['jahr']]=true;

                  $arJahreMonateListe= array_keys ($arJahreMonate);
                  }

                  unset($row);
                   $arAuswahlTermin=explode('-',$strJahrMonat);
                   foreach ($arJahreMonate as $strJahrMonat)
                   {
                     echo "<tr style='border-top:1px solid gray;'><td colspan='7'><strong> Monat: ". $arTermin['monat'] ."</strong></td></tr>\n";

                  foreach ($arTermine as $arTermin)
                   {
                       if  (($arTermin['jahr']==$arAuswahlTermin[0])&&($arTermin['monat']==$arAuswahlTermin[1]))
                    {
                   echo "<tr>";
                   echo "<td class='dunkel'><b>".$arTermin['id_termin']."</b>   ".$arTermin['art_nr']."".$arTermin['hgr_kurz'].".".$arTermin['zielgr_kurz']." ".$arTermin['sem_nr']."</td>";
                   echo "<td class='dunkel'>".$arTermin['von']." - ".$arTermin['bis']."</td>";
                   echo "<td class='dunkel'>".$arTermin['frist']."</td>";
                   echo "<td class='dunkel'>".$arTermin['thema']."</td>";
                   echo "<td class='dunkel'>".$arTermin['inhalt']."</td>";
                    echo "<td class='dunkel'>".$arTermin['zielgruppe']."</td>";
                   echo "</tr>";
                    } # end if
                   } # next $arTermine
                   } # next $arJahreMonate

                  Nun müssten doch alle meine Angaben aus der "while ($row = mysql_fetch_array ($result_vorschau))"-Schleife in einem Array abgelegt sein, welche ich unten in der eingeschlossenen foreach-Schleife abrufe.

                  Allerdings wird mir in der Anzeige jeder Wert um eine Zeile nach unten versetzt in die Tabelle geschrieben, d.h. jeder Datensatz "treppenförmig" dargestellt.

                  Die "Überschriftszeile" wird nur am Anfang gebildet, wobei dort auch $arTermin['monat'] nicht bekannt ist.

                  Ich hoffe, mir kann da nochmal jemand helfen...
                  In jedem Fall schonmal herzlichen Dank für die bisherigen Anregungen.

                  conni

                  1. Moin!

                    Ich würde nur ungern ein Doppelposting loslassen.

                    *öhem*

                    Nicht das ich nicht will, aber meine Logikbausteine sind nebst dem Abstaktionsvermögen schon schlafen gegangen. Ich schau mir das morgen das mal an.

                    MFFG (Mit freundlich- friedfertigem Grinsen)

                    fastix®

                    --
                    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
                  2. Moin!

                    Habe den Quelltext nun wie folgt angepasst:

                      
                    
                    > while ($row = mysql_fetch_array ($result_vorschau)) {  
                    >   
                    >    $termin[]=array();  
                    >    $termin[]['monat']=$row['monat'];  
                    >    $termin[]['jahr']=$row['jahr'];  
                    >   
                    >    $arTermine[]= array();  
                    >    $arTermine[]['jahr']= $row['jahr'];  
                    >    $arTermine[]['monat']=$row['monat'];  
                    >    $arTermine[]['id_termin']=$row['id_termin'];  
                    >    ...  
                    >    $arTermine[]['zielgruppe']=$row['zielgruppe'];  
                    >   
                    >    $arJahreMonate[$row['monat'].'-'.$row['jahr']]=true;  
                    >   
                    >    $arJahreMonateListe= array_keys ($arJahreMonate);  
                    > }  
                    >   
                    > unset($row);  
                      
                      
                    
                    >  foreach ($arJahreMonate as $strJahrMonat)  
                    >  {  
                    
                          $arAuswahlTermin=explode('-',$strJahrMonat);  
                          ## verschoben die Zeile befand sich an einer Stelle, wo $strJahrMonat nicht gesetzt war. (logischer Fehler)  
                      
                    
                    >    ##echo "<tr style='border-top:1px solid gray;'><td colspan='7'><strong> Monat: ". $arTermin['monat'] ."</strong></td></tr>\n";  
                    
                         # $arTermin Monat ist leer...  
                      
                         echo "  <tr style='border-top:1px solid gray;'><td colspan='7'><strong> Monat: ". $strJahrMonat ."</strong></td></tr>\n";  
                         # in "strJahrMonat steht sowas wie 2005-10 willst Du das nicht verwende:  
                         echo "  <tr style='border-top:1px solid gray;'>\n    <td colspan='7'><strong> Monat: ". $ar$AuswahlTermin[1].'/'.$AuswahlTermin[0] ."</strong></td>\n  </tr>\n";  
                         # sollte sowas wie 10/2005 liefern.  
                      
                      
                      
                    
                    >   
                    >    foreach ($arTermine as $arTermin)  
                    >    {  
                    >      if  (($arTermin['jahr']==$arAuswahlTermin[0])&&($arTermin['monat']==$arAuswahlTermin[1]))  
                    >      {  
                    >         echo "\n  <tr>\n";  
                    
                              echo "<td class='dunkel' style='font-weight:bold;'>".$arTermin['id_termin']."   ".$arTermin['art_nr']."".$arTermin['hgr_kurz'].".".$arTermin['zielgr_kurz']." ".$arTermin['sem_nr']."</td>";  
                              # Benutze keine veralteten Tags, sondern CSS!  
                      
                    
                    >         echo "    <td class='dunkel'>".$arTermin['von']." - ".$arTermin['bis']."</td>\n";  
                    >         echo "    <td class='dunkel'>".$arTermin['frist']."</td>\n";  
                    >         echo "    <td class='dunkel'>".$arTermin['thema']."</td>\n";  
                    >         echo "    <td class='dunkel'>".$arTermin['inhalt']."</td>\n";  
                    >         echo "    <td class='dunkel'>".$arTermin['zielgruppe']."</td>\n";  
                    >         echo "  </tr>\n";  
                    >      } # end if  
                    >    } # next $arTermine  
                    >  } # next $arJahreMonate  
                    >   
                    
                    

                    Ich habe den Quelltext für Dich jetzt ordentlich eingerückt, wobei ich nicht sagen sagen kann, ob da nicht irgendwo ein [tab] ("/t") für Verrutschungen sorgte.

                    Ferner habe ich vor Ausgabe der HTML-Zeilen Leerzeichen eingefügt und am ende jeweils ein Zeilenumbruchszeichen.

                    Nun müssten doch alle meine Angaben aus der "while ($row = mysql_fetch_array ($result_vorschau))"-Schleife in einem Array abgelegt sein, welche ich unten in der eingeschlossenen foreach-Schleife abrufe.

                    Sieht so aus.

                    Allerdings wird mir in der Anzeige jeder Wert um eine Zeile nach unten versetzt in die Tabelle geschrieben, d.h. jeder Datensatz "treppenförmig" dargestellt.

                    Schau in den Quelltext des erzeugten HTML-Dokumentes und versuche herauszubekommen, was da nicht passt. Normalerweise ein Zeichen dafür, dass das </tr> nicht an der erwarteten Stelle steht oder von  Invaliditäten im HTML(!)- Quelltext

                    Die "Überschriftszeile" wird nur am Anfang gebildet, wobei dort auch $arTermin['monat'] nicht bekannt ist.

                    Die Ursache habe ich oben beschrieben und korrigiert.

                    MFFG (Mit freundlich- friedfertigem Grinsen)

                    fastix®

                    --
                    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
                    1. Hallo schon wieder,

                      habe an dem (netterweise geposteten) Quelltext rumgewurstelt (leider nur nebenher, daher bin ich nicht die Schnellste):
                      ...
                       ~~~PHP

                      while ($row = mysql_fetch_array ($result_vorschau)) {
                         $termin[]=array();
                         $termin[]['monat']=$row['monat'];
                         $termin[]['jahr']=$row['jahr'];

                      »»

                      $arTermine[]= array();
                         $arTermine[]['monat']=$row['monat'];
                         $arTermine[]['jahr']= $row['jahr'];
                         $arTermine[]['id_termin']=$row['id_termin'];
                         $arTermine[]['art_nr']=$row['art_nr'];
                      ...

                      »»

                      $arJahreMonate[$row['monat'].'-'.$row['jahr']]=true;
                         $arMonate[$row['monat']]=true;
                         $arJahreMonateListe= array_keys ($arJahreMonate);
                         $arMonateListe= array_keys ($arMonate);

                      »»

                      unset($row);

                      »»

                      foreach ($arJahreMonate as $strJahrMonat)
                      {

                      $arAuswahlTermin=explode('-',$strJahrMonat);

                      \*\*\* $arAuswahlTermin durch $arJahreMonateListe ersetzt, denn $arAuswahlTermin wurde wohl noch nicht definiert, jedenfalls klappt jetzt die Anzeige in der nächsten Zeile  
                      ~~~php
                        
                      
                      >      echo "  <tr style='border-top:1px solid gray;'><td colspan='7'><strong> Monat: ". $strJahrMonat ."</strong></td></tr>\n";  
                      >    foreach ($arTermine as $arTermin)  
                      >    {  
                      >      if  (($arTermin['monat']==$strJahrMonat[0])&&($arTermin['jahr']==$strJahrMonat[1]))  
                      
                      

                      *** $arTermin['monat']
                      Notice: Undefined index: monat

                        
                      
                      >      {  
                      >         echo "\n  <tr>\n";  
                      >           echo "<td class='dunkel' style='font-weight:bold;'>".$arTermin['id_termin']."   ".$arTermin['art_nr']."".$arTermin['hgr_kurz'].".".$arTermin['zielgr_kurz']." ".$arTermin['sem_nr']."</td>";  
                      >         echo "    <td class='dunkel'>".$arTermin['von']." - ".$arTermin['bis']."</td>\n";  
                      
                      ...  
                      
                      >         echo "  </tr>\n";  
                      >      } # end if  
                      >    } # next $arTermine  
                      >  } # next $arJahreMonate  
                      > 
                      
                      

                      In der if-Schleife muss ich, denke ich, auf den "Monatswert" aus der "result_vorschau"-Schleife greifen. Allerdings bekomme ich die o.g. Notiz(Index monat nicht definiert). Eigentlich muesste doch aber sowohl $termin['monat'], als auch $arTermin['monat'] für den Abgleich abrufbar, weil noch vorhanden sein, oder?

                      Danke in jedem Fall für die Antworten (error_reporting(E_ALL); war ein sehr guter - und aufräumintensiver Tipp).

                      conni

                      1. Moin!

                        Das Problem ist noch immer ein logisches. Diese sind sehr schwer zu finden, wenn man nicht im Projekt steckt und keine vollständigen Quelltexte und keine Testumgebung (konkrete Datenbank...) hat.

                        Ich kann hier nur mit einem weiteren Ratschlag helfen:

                        print_r($array) - Funktion zum Ausgeben eines Arrays.

                        Beste Benutzung:

                        <?php
                        echo "<hr>Ausgabe von $array<hr><pre>\n";
                        print_r($array);
                        echo "\n</pre><hr>\n";
                        ?>

                        MFFG (Mit freundlich- friedfertigem Grinsen)

                        fastix®

                        --
                        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
                        1. Hallo,

                          mittlerweile werden in der Ergebnistabelle die entsprechenden Zeilenanzahl pro Monat gezeigt. Werden die entsprechenden Einträge immer noch nicht angezeigt.

                          Ich kann hier nur mit einem weiteren Ratschlag helfen:

                          print_r($array) - Funktion zum Ausgeben eines Arrays.

                          Hatte ich auch versucht.
                          Der array $arTermine (in der "while... mysql_fetch_array"-Schleife gebildet) sieht mit print_r($arTermine) so aus:
                          ...
                          [6] => Array
                                  (
                                      [monat] => 2
                                  )

                          [7] => Array
                                  (
                                      [zielgruppe] => Alle, die wollen
                                  )

                          [8] => Array
                                  (
                                      [art_nr] => 7
                                  )
                          ...
                          Also hübsch befüllt, mit allen Werten drin.

                          In den darauffolgenden Schleife "foreach ($arTermine as $arTermin)"
                          kann ich Werte aber nicht ansprechen, schon gar nicht gezielt, z.B. mit "$arTermin['zielgruppe']". Seltsamerweise wird "$arTermin['monat']" jedoch als einziger Wert ordentlich ausgeworfen.

                          Ich werd es jedenfalls weiterversuchen.
                          Danke trotzdem für die Hilfe hier, die mir erstmal einen Weg gezeigt hat.

                          conni

                  3. Moin!

                    Ein Tipp noch. Du fragst sehr oft aufgrund logischer Fehler ungesetzte Variablen ab.
                    Bitte schalte die Ausgaben von Warnungen ein. Das geht zum einen in der PHP.ini:

                    error_reporting = E_ALL & ~E_NOTICE

                    oder in der PHP-Datei selbst:

                    error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

                    Dann siehts Du, was los ist.

                    MFFG (Mit freundlich- friedfertigem Grinsen)

                    fastix®

                    --
                    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
                    1. echo $begrüßung;

                      Ein Tipp noch. Du fragst sehr oft aufgrund logischer Fehler ungesetzte Variablen ab.
                      Bitte schalte die Ausgaben von Warnungen ein. Das geht zum einen in der PHP.ini:

                      Lesender Zugriff auf ungesetzte Variablen erzeugt nur eine Notice.

                      error_reporting = E_ALL & ~E_NOTICE

                      Wenn, dann also ohne die Notizen auszuklammern: error_reporting = E_ALL

                      oder in der PHP-Datei selbst:

                      error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

                      Mal abgesehen davon, dass diese Einstellung nicht deiner obigen entspricht, sehe ich keinen Sinn darin, während der Entwicklung von Scripten nur eine Teilmenge der Fehler bzw. Hinweise auszugeben [*]

                      error_reporting(E_ALL);

                      echo "$verabschiedung $name";

                      [*] Ausnahme: E_STRICT wenn man PHP4-kompatible Scripte unter PHP5 entwickeln/einsetzen möchte.

                      1. Moin!

                        error_reporting(E_ALL);

                        Jepp. Du hast Recht.

                        MFFG (Mit freundlich- friedfertigem Grinsen)

                        fastix®

                        --
                        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development