Rainer: Nach MySQL auslasen Zeilen abwechselnd 2farbig anzeigen

Guten Morgen,

ich lese mit PHP aus einer DB

<table>
<?
$x=mysql_query("SELECT * FROM table");
 while $z=(mysql_fetch_array($x)):
  $dat=$z["dat"];

echo"<tr><td>$dat</td></tr>";

endwhile;
?>
</table>

Soweit so gut. Nun möchte ich die Ergebniszeilen abwechselnd mit Weiss und Grau als Zellenhintergrund ausgeben. Ich find einfach keine Lösung dafür und bitte um Hilfe.

Grüsse aus dem Thüringer Land

Rainer

  1. Hallo,

    Soweit so gut. Nun möchte ich die Ergebniszeilen abwechselnd mit Weiss und Grau als Zellenhintergrund ausgeben. Ich find einfach keine Lösung dafür und bitte um Hilfe.

    Ich bin zwar nicht aus dem PHP-Lager, aber das ist doch in keiner Sprache wirklich ein Problem.
    Vor dem echo machst Du irgendetwas wie
    if($format == 'so_rum')
      $format = 'anders_rum'
    else
      $format = 'so_rum';

    und baust es dann in Deine Ausgabe ein.

    Grüße
      Klaus

  2. hi,

    <table>
    <?
    $x=mysql_query("SELECT * FROM table");
    $iZeile = 0;
    while $z=(mysql_fetch_array($x)):
      $dat=$z["dat"];
      if ($iZeile) {
        echo"<tr><td bgcolor="#ff0000">$dat</td></tr>";
        $iZeile = 0;
      } else {
        echo"<tr><td bgcolor="#00ff00">$dat</td></tr>";
        $iZeile = 1;
      }
    endwhile;
    ?>
    </table>

    ungetestete grüße
    FICHTL

  3. Hallo!

    Soweit so gut. Nun möchte ich die Ergebniszeilen abwechselnd mit Weiss und Grau als Zellenhintergrund ausgeben. Ich find einfach keine Lösung dafür und bitte um Hilfe.

    Lass doch einen Zaehler mitlaufen. Alle Zeilen, die einen ungeraden Zaehler haben waeren grau und Zeilen mit geradem Zaehler sind weiss.

    Ob der Zaehler gerade oder ungerade ist erhaelt man mit:

    if ($i % 4 == 0)

    Das sieht etwa so aus (ungetestet):

    <?
    $i = 0;
    while $z=(mysql_fetch_array($x)) {
     $dat=$z["dat"];
     if ($i % 4 == 0) {
      echo"<tr><td bgcolor=white>$dat</td></tr>";
     } else {
      echo"<tr><td bgcolor=black>$dat</td></tr>";
     }
    $i++;
    }
    ?>

    Hoffe das hilft Dir

    Gruesse

    -> Andreas

    1. Ob der Zaehler gerade oder ungerade ist erhaelt man mit:

      if ($i % 4 == 0)

      $i MOD 4 ergibt aber nicht, ob die Zahl gerade oder ungerade ist, sondern macht alle 4 Zeilen eine weiße Zeile. Ist zwar ein ganz netter Effekt, man kann ihn auch für vier abwechselnde Zeilen einsetzen, aber ($i % 2 == 0) wäre dann für das aktuelle Problem doch besser. ;)

      Man kann natürlich auch mit einer boolschen Variablen arbeiten. Das ist dann vielleicht etwas eleganter. Ich bastel mal in deinem Code rum. (Und die Zuweisung aus dem Original vom Hash zum Skalar kann man sich auch sparen) ;)

      <?
      $i = false;
      while $z=(mysql_fetch_array($x)) {
       if ($i) {
        echo"<tr><td bgcolor=white>".$z['dat']."</td></tr>";
       } else {
        echo"<tr><td bgcolor=black>".$z['dat']."</td></tr>";
       }
      $i = !$i; // Hier wird zwischen true (erste Zeile) und false (zweite Zeile) umgeschaltet.
      }
      ?>

      Vorteil: Der Zähler $i läuft niemals über - wäre vielleicht ein Problem, wenn mehr als 2^32 Zeilen auszugeben sind. ;)

      - Sven Rautenberg

      1. Hi,

        warum machst du das so kompliziert? Klaus Mock hat da ein simples Konstrukt gebracht, das ich so ungefähr auch immer einsetze.

        if ($bgcolor == $bgcolor1) {
            $bgcolor = $bgcolor2;
            }
        else {
            $bgcolor = $bgcolor1;
            }

        Gruß NN

        1. warum machst du das so kompliziert? Klaus Mock hat da ein simples
          Konstrukt gebracht, das ich so ungefähr auch immer einsetze.

          if ($bgcolor == $bgcolor1) {
              $bgcolor = $bgcolor2;
              }
          else {
              $bgcolor = $bgcolor1;
              }

          Wie wär's denn damit:

          $farbe[false]="irgendwas";
          $farbe[true]="nochmehr";
          $cfarbe=false;

          while/for (blabla)
           {
            echo $farbe[$cfarbe];
            $cfarbe=!$cfarbe;
           };

          Gruß,
            soenk.e

          1. Wie wär's denn damit:

            $farbe[false]="irgendwas";
            $farbe[true]="nochmehr";
            $cfarbe=false;

            while/for (blabla)
            {
              echo $farbe[$cfarbe];
              $cfarbe=!$cfarbe;
            };

            besser so:

            while/for (blabla)
              {
               echo $farbe[$cfarbe = !$cfarbe];
              };

            Gruß
              Christian

    2. Hm, noch kürzer geht's so:

      <?
      $i = 0;
      while $z=(mysql_fetch_array($x)) {
       if (($i++ % 2) == 0) {
        echo"<tr><td bgcolor=white>".$z["dat"]."</td></tr>";
       } else {
        echo"<tr><td bgcolor=black>".$z["dat"]."</td></tr>";
       }
      }
      ?>

      $i++ ist ein Post-Inkrement, d.h. nach der Verwendung des Wertes in $i (hier für die Operation $i % 2) wird der Wert inkrementiert. Der alte Wert von $i wird also genommen, und der neue Wert gleich danach in $i abgelegt. Der Vergleich mit 0 nimmt aber noch den alten Wert von ($i % 2) - genauso wollten wir es.

      Ich befürchte, mit meinen ZWEI Postings könnte ich jetzt einen Wettlauf um das beste Coding ausgelöst haben. Wohin sowas führen kann: http://internet.ls-la.net/mirrors/99bottles/ (Übrigens eine sehr gute Referenz zu allen möglichen Programmiersprachen. :) )

      - Sven Rautenberg

      1. Hallo Sven,

        Hm, noch kürzer geht's so:

        <?
        $i = 0;
        while $z=(mysql_fetch_array($x)) {
        if (($i++ % 2) == 0) {
          echo"<tr><td bgcolor=white>".$z["dat"]."</td></tr>";
        } else {
          echo"<tr><td bgcolor=black>".$z["dat"]."</td></tr>";
        }
        }
        ?>

        Noch kürzer bzw. eleganter wäre imho:

        <? $i = 0;
           while ($z = mysql_fetch_array($x)): ?>

        <tr>
                   <td bgcolor="<? echo $i++ % 2 ? 'white' : 'darkgray'; ?>">
                       <?= $z["dat"] ?>
                   </td>
               </tr>

        <? endwhile ?>

        Gruß Alex
        --
        http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart

  4. Re Moin,

    ich finde die Lösung mit dem MOD Operator insofern eleganter, daß sich damit auch beliebig viele Abstufungen machen lassen.

    switch ($laufvariable % $anzahl_der_abstufungen)
    {
    case 1:
    $bgcolor = "#ffffff"

    case 2:
    .
    .
    .
    case $anzahl_der_abstufungen:
    $bgcolor = "#000000"
    break
    }

    Naja so mach ichs halt immer. Zumal ich keine While Schleife sondern eine for- Schleife benutze und daher immer eine Laufvariable zur
    Verfügung habe.

    Gruß

    Uhf