• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Zeilenwechsel in Tabelle - bei PHP - mit css-Style

Ich habe eine Tabelle die ich bisher ohne PHP und einfach nur mit HTML und einem Style-Sheed umgestzt haben. In derser Tabelle habe ich einen von Zeile zu Zeile unterschiedliche Ausrichtungen dargestellt.

Code:
table.fantasie-uebersicht { width: 730px;
                   /*        border: 1px dotted #000000;  */
                           padding: 10px 20px 10px;
                           }

tr.fantasie-uebersicht:first-child { width: 600px       /* erste ungerade */
                                    text-align: left;
                                    height: 180px;
                                    border: 1px solid #60FF00;
                       /*             background-image: url("../Images/redrulr1.gif"); */
                                    background-repeat: no-repeat;
                                    background-position: center 5px;
                                    margin-bottom: 10px;
                                    }

tr.fantasie-uebersicht:nth-child(2n) {
                                      border: 2px solid #FFFFFF;    /* zweite gerade */
                                      text-align: right;
                                      height: 200px;
                                      background-image: url("../Images/redrulr1.gif");
                                      background-repeat: no-repeat;
                                      background-position: center 5px;
                              /*        border: 1px solid #60FF00;  */
                                      }

tr.fantasie-uebersicht:nth-child(2n+3) {    /* dritte ungerade */
                                        text-align: left;
                                        height: 200px;
                                        background-image: url("../Images/redrulr1.gif");
                                        background-repeat: no-repeat;
                                        background-position: center 5px;
                                  /*      border: 1px solid #60FF00;   */
                                                                             }
Nun möchte ich gern MySQL für den Inhalt verwenden. Doch das Layout beibehalten.
Das klappt auch bis auf die Ausrichtung. Was meiner Einschätzung daran liegt das immer nur von der ersten Zeile ausgegangen wird. Und die 2 und 3 Zeile wegfallen.
Sprich der Aufbau wird Zeile 1,1,1,1,1,1... und nicht 1,2,3, oder erste, gerade, ungerade,

Wie kann kann ich php und sql also klarmachen das nicht immer von vorn begonnen wird?

PHP:
<?php
$ergebnis = mysql_query("SELECT * FROM Story WHERE Storyname LIKE 'A%' OR Storyname LIKE 'B%' OR Storyname LIKE 'C%' ");
while($row = mysql_fetch_object($ergebnis))
{
echo '<table>',
      '<tr class="fantasie-uebersicht">',
      '<td class="fantasie-uebersicht">',
      '<p class="glowtext-story">',
      $row->Storyname, '  ', $row->FSK18, '</p>';
echo $row->Zweitname, "<br />";
echo '<span class="nummer"> (', $row->Storynummer, ') </span>', '<span class="copyright">©', $row->Erstellt, "/", $row->Überarbeitet, '</span><br /><br />';
echo '<span class="untertitel">', $row->Beschreibung, '<br /><br /><br /> Ende STORYANGABE </span>', '</td>', '</tr>', '</table>';
}
?>
 
Schön das hat so weit geklappt und das ich das schließende hinter die Schleife packen muss ist mir dann auch klar geworden.

Ich würde nun gern in die Schleife noch if - Bedingungen für manche Werte eintragen

z.B. für Zweitname

Ich habe es so gemacht CODE und bekomme auch keine Fehlermeldung doch müsse ich im Ergebniss mal einen eintrag und mal keinen Eintrag angezeigt bekommen. Also beide Möglichkeiten.

PHP:
...
<?php
$ergebnis = mysql_query("SELECT * FROM Story WHERE Storyname LIKE 'A%' OR Storyname LIKE 'B%' OR Storyname LIKE 'C%' ");
echo '<table>';
while($row = mysql_fetch_object($ergebnis))
{
echo  '<tr class="fantasie-uebersicht">',
      '<td class="fantasie-uebersicht">',
      '<p class="glowtext-story">',
      $row->Storyname, '  ', $row->FSK18, '</p>';



if ($row->Zeitname != "")
         {
         echo $row->Zweitname, "<br />";
         };



echo '<span class="nummer"> (', $row->Storynummer, ') </span>', '<span class="copyright">©', $row->Erstellt, "/", $row->Überarbeitet, '</span><br /><br />';
echo '<span class="untertitel">', $row->Beschreibung, '<br /><br /><br /> Ende STORYANGABE </span>', '</td>', '</tr>';
}
echo '</table>';
?>
der Abstand dient der Übersichtlichkeit
Das Feld Zweiname ist varchar(50)
 
Zuletzt bearbeitet:
Bei der bisherigen statischen Version der oben dargestellten Seite habe ich für IE eine Weiche gehabt und anstatt
<tr class="fantasie-uebersicht">
<tr class="fantasie-zeile1"> / <tr class="fantasie-geade"> / <tr class="fantasie-ungeade">
verwendet.
Doch mit SQL will ich ja gerade vermeiden jede Tabellenzeile selber zu schreiben und mit SQL einfügen lassen.
So wie oben.

Gibt es eine möglichkeit wie ich der while Schleife klarmachen kann das bei jeder Zeile ein anderes style verwendet werden muss. Pseudoklasse nth geht ja nicht.

echo '<tr class="fantasie-zeile1">' / echo '<tr class="fantasie-geade">' / echo '<tr class="fantasie-ungerade">'
 
Mit Modulo.

PHP:
<!DOCTYPE html>

<html lang="en">

    <head>
        <meta charset="utf-8" />
        <title>New</title>
        <style type="text/css">

            tr.even { background: #cee; }
            tr.odd { background: #eee; }

        </style>
    </head>

    <body>
        <table>
            <tr>
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>

        <?php for ($i = 1; $i <= 20; $i++) : ?>
            <tr class="<?php echo ($i % 2 === 0) ? 'even' : 'odd'; ?>">
                <td>x</td>
                <td>y</td>
                <td>z</td>
            </tr>
        <?php endfor; ?>

        </table>
    </body>

</html>

- PHP: Arithmetic Operators - Manual
 
aber ist es nicht nach wie vor so das IE die Pseudoklasse (even) oder eben (2n) beide nicht erkannt werden?
Meinen Informationen wird nur
tr.fantasie-uebersicht:first-child erkannt.

Nicht aber

tr.fantasie-uebersicht:nth-child(2n) oder tr.fantasie-uebersicht:nth-child(odd)
 
Zuletzt bearbeitet:
Das stimmt schon.
Doch ich habe ja schon diese einfache Klasse siehe meine Style-Code oben verwendet.
Und ich kann mir gut vorstellen das ich ... first ...odd ...even in mehr als einer Tabelle brauche.
Doch mit unterschiedlichen styles-Werten
 
Mir ist irgendwie nicht klar, worum es dir jetzt genau geht. Nicht um das abwechselnde Einfärben von Tabellenzeilen?
 
Mir ist irgendwie nicht klar, worum es dir jetzt genau geht. Nicht um das abwechselnde Einfärben von Tabellenzeilen?

wie im Code (Beitraganfang) zusehen ist richte ich mal rechts mal links aus. Und bei die erste Zeile ist als Kopf etwas anders gestaltete (keine Linie).
Aber was im css-style angegeben wird ist ja letztlich egal.
Wichtig ist der Wechsel.

Und es könnte eben gut sein das ich in der Zukunft eine weitere Tabelle anders gestalte.
Also brauche ich unterschiedliche Klassen. die alle einen Wechsel machen können.

Ist Dir nun klar geworden was ich mir denke?
 
Nein. Zumindest sehe ich das Problem nicht.

Code:
<!DOCTYPE html>

<html lang="en">

    <head>
        <meta charset="utf-8" />
        <title>New</title>
        <style type="text/css">

            .foo tr.even { background: #cee; }
            .foo tr.odd { background: #eee; }

            .bar tr.even { text-align: right; }
            .bar tr.odd { text-align: left; }

        </style>
    </head>

    <body>
        <table class="foo">
            <tr>
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>

        <?php for ($i = 1; $i <= 20; $i++) : ?>
            <tr class="<?php echo ($i % 2 === 0) ? 'even' : 'odd'; ?>">
                <td>x</td>
                <td>y</td>
                <td>z</td>
            </tr>
        <?php endfor; ?>

        </table>



        <table class="bar">
            <tr>
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>

        <?php for ($i = 1; $i <= 20; $i++) : ?>
            <tr class="<?php echo ($i % 2 === 0) ? 'even' : 'odd'; ?>">
                <td>x</td>
                <td>y</td>
                <td>z</td>
            </tr>
        <?php endfor; ?>

        </table>
    </body>

</html>
 
Ok also ich denke mir folgendes.

Im Moment habe ich die Tabelle mit der Klasse fantasie-uebersicht.
tr.fantasie-uebersicht
und in Zukunft z.B. auch unter bilder-uebersicht und unter dagobert-uebersicht.
Doch alle drei Tabellen fantasie, bilder und dagobert haben unterschiedliche styleangaben in der Klasse.
damit dann aber trozdem ein first, odd und even möglich ist muss ich doch hinter die jeweilige Klasse eine Pseudoklasse hängen um den Wechsel möglich zu machen.

Ich bin nämlich davon ausgegangen das keine zwei Klassen hintereinander stehen dürfen.

Aber wie es scheint ist das ja möglich.
Und mit der Modul-Geschichte kann ich first, even und odd abarbeiten? ich habe ja drei Varianten.
Ich muss gestehen ich steige noch nicht ganz durch diese Arithmetic Operators durch.
 
Zuletzt bearbeitet:
Modulo gibt einfach den Rest einer Division.

Code:
0 % 2   =   0, Rest 0
1 % 2   =   0, Rest 1
2 % 2   =   1, Rest 0
3 % 2   =   1, Rest 1
4 % 2   =   2, Rest 0
…

Eine hochgezählte Zahl % 2 ergibt abwechselnd den Rest 0 und 1.

„first“ kannst du auch abarbeiten mit zum Beispiel if ($i === 0) …. (Beziehungsweise 1, je nachdem, wo das Zählen anfängt.)
 
Modulo gibt einfach den Rest einer Division.

Code:
0 % 2   =   0, Rest 0
1 % 2   =   0, Rest 1
2 % 2   =   1, Rest 0
3 % 2   =   1, Rest 1
4 % 2   =   2, Rest 0
…

Eine hochgezählte Zahl % 2 ergibt abwechselnd den Rest 0 und 1.

„first“ kannst du auch abarbeiten mit zum Beispiel if ($i === 0) …. (Beziehungsweise 1, je nachdem, wo das Zählen anfängt.)

Ich versuche mich mal daran.
Ich kannte Modulus als 5 Grundrechenart überhaupt nicht.
Bei Wiki habe ich aber schon die Grundzüge gelesen. Deswegen auch meine frage nach der ersten Zeile.
Denn wenn ich das verstehe wird Modulus in der Programmierung verwendet um zu erkennen ob eine Zahl gerade oder ungerade ist.
Und first also 1 wäre ja ungerade.
 
Etwas ausführlicher geschrieben zum Beispiel dann so:

PHP:
        <?php for ($i = 1; $i <= 20; $i++) : ?>

            <?php
                $class = '';
                if ($i === 1) {
                    $class = 'first';
                } else if ($i % 2 === 0) {
                    $class = 'even';
                } else {
                    $class = 'odd';
                }
            ?>

            <tr class="<?php echo $class; ?>">
                <td>x</td>
                <td>y</td>
                <td>z</td>
            </tr>
        <?php endfor; ?>

Denn wenn ich das verstehe wird Modulus in der Programmierung verwendet um zu erkennen ob eine Zahl gerade oder ungerade ist.

Modulo. Ja, zum Beispiel dazu, aber auch zu anderen Zwecken. Ein Modulo-4 (0%4, 1%4, 2%4, 3%4, 4%4, …) liefert eben eine wiederkehrende Sequenz von (0, 1, 2, 3, 0, 1, 2, 3 …) usw.

Es ordnet allgemein Zahlen nach „Restklassen“. Wenn du zum Beispiel die Felder eines Schachbretts von oben links nach unten rechts durchnummerierst von 0 bis 63, kannst du per Modulo-8 aus der Feldnummer die Spalte auf dem Spielfeld bestimmen.

62%8 ist etwa 7, Rest 6 → Feld #62 liegt in Spalte 6 (das ist bei einer Nummerierung von 0 bis 7 eben die vorletzte).

Das ist recht nützlich, wenn man Daten eindimensional speichert (0 bis 63), aber zweidimensional verwenden will (Zeile, Spalte).
 
Etwas ausführlicher geschrieben zum Beispiel dann so:


Modulo. Ja, zum Beispiel dazu, aber auch zu anderen Zwecken. Ein Modulo-4 (0%4, 1%4, 2%4, 3%4, 4%4, …) liefert eben eine wiederkehrende Sequenz von (0, 1, 2, 3, 0, 1, 2, 3 …) usw.

Es ordnet allgemein Zahlen nach „Restklassen“. Wenn du zum Beispiel die Felder eines Schachbretts von oben links nach unten rechts durchnummerierst von 0 bis 63, kannst du per Modulo-8 aus der Feldnummer die Spalte auf dem Spielfeld bestimmen.

62%8 ist etwa 7, Rest 6 → Feld #62 liegt in Spalte 6 (das ist bei einer Nummerierung von 0 bis 7 eben die vorletzte).

Das ist recht nützlich, wenn man Daten eindimensional speichert (0 bis 63), aber zweidimensional verwenden will (Zeile, Spalte).

Doppeldanke für die Erklärung.
Kommt vor der Zahl z.B. der 4 oder der 8 immer ein Minus?
Und warum hast Du oben in der ersten Zeile eine 20 verwendet?
 
Nein, das Minus war nur als Trennstrich in dem Wort Modulo-4 gemeint, so wie Webdesign-Wettbewerb oder so. ;)

Die 20 ist Willkür. Keine Ahnung, wie viele Zeilen du da haben wirst.

62 % 8 heißt konkret „62 ganzzahlig geteilt durch 8 plus Rest“. Die größte Ganzzahl, die bei 62/8 zu finden ist, ist die 7. 7*8 = 56. 62-56 = 6. Also 62 % 8 = 7, Rest 6.

So, ich glaube, das reicht an Erklärungen. ;)
 
Nein, das Minus war nur als Trennstrich in dem Wort Modulo-4 gemeint, so wie Webdesign-Wettbewerb oder so. ;)

Die 20 ist Willkür. Keine Ahnung, wie viele Zeilen du da haben wirst.

Das bedeutet also mit der 20 wird die maximale Zeilenanzahl auf der Seite angegeben.
Gut zu wissen das muss ich dann prüfen wie viele das im Maximum gewesen sind.
 
richtig zusammengesetzt?

So nun habe ich das zusammengebastelt.

Ich bekomme auch keine Fehlermeldungen mehr.
Aber ich habe den Eindruck das mein $class nicht interpretiert wird.

Schau doch mal bitte ob ich das richtig zusammengesetzt habe.


PHP:
<?php
$ergebnis = mysql_query("SELECT * FROM Story WHERE Storyname REGEXP '^[" . mysql_real_escape_string($_GET['Inhalt']) . "]' ORDER BY Storyname DESC ") OR die("Error: $abfrage <br>".mysql_error());
echo '<table class="fantasie-uebersicht">';
for ($i = 1; $i <= 20; $i++) :  ;   // modulus fr IE

                                $class = '';     // Definiton class für Zeilenwechsel IE
                                if ($i === 1) {
                                    $class = 'fantasie-zeile1';
                                } else if ($i % 2 === 0) {
                                    $class = 'fantasie-gerade';
                                } else {
                                    $class = 'fantasie-ungerade';
                                };

while($row = mysql_fetch_object($ergebnis))
{
        if ($row->Veroeffentlicht == "1") // Veroeffentlicht ja/ ohne Wert = (überspringen)
        {
        echo  '<tr class="$class">',
              '<td class="fantasie-uebersicht">',
              '<p class="glowtext-story">',
              $row->Storyname;

              if ($row->FSK18 == "")    // FSK18 ja/ ohen Wert = (ohne Bild)
              {
              echo ' <img src="../Images/fsk18_logo.gif" alt="Die vollständige Fantasie ist aktuell als FSK18 eingestufft" border="1" width="58" height="17"><p />';
              }
              else
              {
              echo '<p />';
              }

              if ($row->Zweitname != "")   // Brief/Telefon oder ohne Wert
              {
              echo $row->Zweitname, "<br />";
              };

        echo '<span class="nummer"> (', $row->Storynummer, ') </span>', '<span class="copyright">©', $row->Erstellt;

        if ($row->Ueberarbeitet != "")   // Überarbeitet oder ohne Wert
        {
        echo '/', $row->Ueberarbeitet, '</span><br /><br />';
        }
        else
        {
        echo '</span><br /><br />';
        };

        echo '<span class="untertitel">', $row->Beschreibung; '</td> </tr>';
        };
};
 endfor;
echo '</table>';
?>
---- Up Date----

nach dem ich bemerkt habe das
es nicht
echo '<tr class="$class">',
sondern
echo '<tr class=' echo $class;'>',
heissen muss bekomme ich für diese Zeile

Parse error: syntax error, unexpected T_ECHO, expecting ',' or ';'

Ich habe auch schon versucht den Modulus und if-schleife für $class nach while zusetzen doch immer die selbe Fehlermeldung.

Zu Beginn hatte ich auch die <?php und ?> mit hineingeschrieben doch dann wurde der Ursprüngliche Code nicht richtig abgearbeitet.
Es schien mir als wenn man kein <?php .... <?php ?p> ....?> schreiben durfte.
diesen Fehler hatte ich schnell erkannt und mit der oben stehenden Code-Variante ersetzt.
 
Zuletzt bearbeitet:
Zurück
Oben