Tabelle nach bestimmten Durchlauf neue Spalte

Hallo,
da ich mich zurzeit viel mit Datenbanken beschäftige, habe ich eine neue Frage. :slight_smile: Hoffentlich belästige ich euch nicht all zu sehr damit!! :slight_smile:
Auf jeden Fall, habe ich eine Tabelle erstellt, deren Inhalt sich mit Daten aus der DB füllt.
Das Ganze schaut dann so aus.
Imageshack - abcr.png
Mit folgendem Code.
[PHP]

Hello World

<body>
    <?php
        mysql_connect("","root","");
        mysql_select_db("Shop");
        
        $res = mysql_query("select * from `artikel`");
                    
        echo "<table border>";
            echo "<tr>";
                while ($ds = mysql_fetch_assoc($res))
                {
                    echo "<td><img src='".$ds["bild"]."' /></td>";
                    echo "<td>".$ds["name"]."</td>";
                    if ($ds["sonderpreis"] > 0)
                        echo "<td>".$ds["sonderpreis"]."</td>";
                    else
                        echo "<td>".$ds["preis"]."</td>";
                }
            echo "</tr>";
        echo "</table>";
    ?>
</body>
[/PHP] Glaube, das man diesmal nicht braucht wie die DB aufgebaut ist. Meine Frage lautet, wie kann ich es so programmieren, das nach dem zweiten Durchlauf der While-Schleife eine neue Zeile erzeugt wird. D.h. das nicht 4 Artikel nebeneinander sein sollen, sondern nur zwei.

Gruß Stenz

[PHP]<?php
//[…]
$res = mysql_query(„SELECT bild, name, sonderpreis, preis FROM artikel“);
$count = mysql_num_rows($res);

// anzahl reihen
$cols = 2;
?>

<?php for ($i = 0; $i < $count; $i++): ?> <?php for ($j = 0; $j < $cols; $j++, $i += $cols) ?>
    <?php if ($ds = mysql_fetch_assoc($res): ?>

        <td><img src="<?php print $ds["bild"]; ?>" /></td>
        <td><?php print $ds["name"]; ?></td>

        <td><?php
        if ($ds["sonderpreis"] > 0):
             print $ds["sonderpreis"];
        else:
            print $ds["preis"]
        endif; ?></td>

    <?php endif; ?>

<?php endfor; ?>
<?php endfor; ?>[/PHP] Nicht getestet.

Ich glaube, das Beispiel haut leider nicht hin.

Ansatz mit Modulo:

[php]<?php

$data = array(
array(‚bild‘ => ‚a.jpg‘, ‚name‘ => ‚A‘, ‚sonderpreis‘ => 10, ‚preis‘ => 5),
array(‚bild‘ => ‚b.jpg‘, ‚name‘ => ‚B‘, ‚sonderpreis‘ => 0, ‚preis‘ => 10),
array(‚bild‘ => ‚c.jpg‘, ‚name‘ => ‚C‘, ‚sonderpreis‘ => 0, ‚preis‘ => 15),
array(‚bild‘ => ‚d.jpg‘, ‚name‘ => ‚D‘, ‚sonderpreis‘ => 0, ‚preis‘ => 20),
array(‚bild‘ => ‚e.jpg‘, ‚name‘ => ‚E‘, ‚sonderpreis‘ => 5, ‚preis‘ => 25),
array(‚bild‘ => ‚f.jpg‘, ‚name‘ => ‚F‘, ‚sonderpreis‘ => 15, ‚preis‘ => 30),
array(‚bild‘ => ‚g.jpg‘, ‚name‘ => ‚G‘, ‚sonderpreis‘ => 0, ‚preis‘ => 35)
);

$count = count($data);

// Bzw. entsprechende MySQL-Befehle

// anzahl reihen
$cols = 4;

?>

<?php for ($i = 0; $i < $count; $i++): ?>
<?php
$ds = $data[$i];
// Bzw. $ds = mysql_fetch_assoc($res);
?>

<td><img src="<?php print $ds["bild"]; ?>" /></td>
<td><?php print $ds["name"]; ?></td>

<td><?php
if ($ds["sonderpreis"] > 0):
     print $ds["sonderpreis"];
else:
    print $ds["preis"];
endif; ?></td>

<?php if (($i + 1) % $cols === 0 && $i < $count - 1): ?>

    </tr><tr>

<?php endif; ?>    
<?php endfor; ?> <?php // Letzte Zeile mit korrekter Anzahl Zellen auffüllen echo str_repeat('', ($cols - $count % $cols) % $cols); ?>
---
[/php]

Ich hab’s mal entsprechend angepasst:
[php]<?php
//[…]
$data = array(
array(‚bild‘ => ‚a.jpg‘, ‚name‘ => ‚A‘, ‚sonderpreis‘ => 10, ‚preis‘ => 5),
array(‚bild‘ => ‚b.jpg‘, ‚name‘ => ‚B‘, ‚sonderpreis‘ => 0, ‚preis‘ => 10),
array(‚bild‘ => ‚c.jpg‘, ‚name‘ => ‚C‘, ‚sonderpreis‘ => 0, ‚preis‘ => 15),
array(‚bild‘ => ‚d.jpg‘, ‚name‘ => ‚D‘, ‚sonderpreis‘ => 0, ‚preis‘ => 20),
array(‚bild‘ => ‚e.jpg‘, ‚name‘ => ‚E‘, ‚sonderpreis‘ => 5, ‚preis‘ => 25),
array(‚bild‘ => ‚f.jpg‘, ‚name‘ => ‚F‘, ‚sonderpreis‘ => 15, ‚preis‘ => 30),
array(‚bild‘ => ‚g.jpg‘, ‚name‘ => ‚G‘, ‚sonderpreis‘ => 0, ‚preis‘ => 35)
);
$count = count($data);

// anzahl reihen
$cols = 2;
?>

<?php for ($i = 0; $i < $count; $i++): ?> <?php for ($j = 0; $j < $cols; $j++, $i++): ?>
    <?php if (isset($data[$i])):
       $ds = $data[$i];
    ?>

        <td><img src="<?php print $ds["bild"]; ?>" /></td>
        <td><?php print $ds["name"]; ?></td>

        <td><?php
        if ($ds["sonderpreis"] > 0):
             print $ds["sonderpreis"];
        else:
            print $ds["preis"];
        endif; ?></td>
<?php else: ?>
    <td>-<td>
        <td>-</td>
        <td>-</td>
    <?php endif; ?>

<?php endfor; ?>
<?php endfor; ?>[/php]

In der äußeren Schleife darfst du $i glaube ich nicht noch zusätzlich hochzählen, sonst werden Datensätze übersprungen. while ($i < $count) statt der for-Schleife.

Ansonsten ist’s schon einfacher zu lesen als das Modulo-Gebastel.

Stimmt, das $i++ ist lässt das Script nach jedem vierten Datensatz einen aus. Wenn ich nicht für alles einen Unittest schreibe, fällt mir sowas vor Faulheit nicht mal mehr auf.