Rolf B: table cell mengen werte vergleichen

Beitrag lesen

Hallo Andreas,

da hast Du noch einiges zu tun. Dass Du auf dem Schlauch draufstehst, erklärt nicht, warum kein Wasser rauskommt. Dir fehlt noch der Wasserhahn, dessen Zuleitung und die Hälfte des Wasserwerks.

Ganz wichtiges Zubehör für den Werkzeugkasten: PHP Sessions. Spätestens beim Weiterleiten zur Registrierungsseite wird es ohne Sessions sehr umständlich bis unmöglich.

Eine Bemerkung vorab: Erwarte nicht, eine Lösung vorprogrammiert zu bekommen.

Zunächst ein paar Hinweise zum HTML:

  • das html Element bekommt ein lang="de" Attribut
  • Es ist überflüssig, konstante Texte von PHP aufbereiten zu lassen, das geht einfacher.
<h1>Willkommen in unserem Computerladen</h1>
<h2>Ihrem Onlineshop rund um den PC!</h2>
<h3>Hier finden Sie eine große Auswahl an günstigen Artikeln</h3>
  • es ist falsch (darum ist das Beispiel rot), Header-Elemente (h1, h2, h3) allein wegen der zugeordneten Schriftgröße zu verwenden. Header-Elemente dienen der Gliederung des Dokumentes. Wenn Du nichts zu gliedern hast, gehören auch keine Überschriften dahin. Verwende statt dessen p Elemente, und wenn sie verschiedene Schriftgrößen haben sollen, dann verwende CSS, um die Darstellung zu beeinflussen. In deinem Fall wäre es ein Titel und ein Untertitel, sowie ein Erklärtext.
<header>
<h1>Willkommen in unserem Computerladen</h1>
<p>Ihr Onlineshop rund um den PC!</p>
</header>
<p>Hier finden Sie eine große Auswahl an günstigen Artikeln</p>

das kannst Du mit CSS z.B. so gestalten, um dem h1 im Header-Bereich doppelte Basisschriftgröße zu geben (was auch entfallen kann weil ein h1 eh eine große Schrift hat), und dem p im Header-Bereich die anderthalbfache Schriftgröße:

header h1 {
   font-size: 2rem
}
header p {
   font-size: 1.5rem
}

Das CSS kannst Du entweder in einem <style> Element des <head> unterbringen, oder in einer eigenen shop.css Datei, die Du im <head> mit <link href="/css/shop.css" rel="stylesheet"> einbindest (die href-Angabe musst Du natürlich für deine Zwecke anpassen).

  • Dort kannst Du auch der table einen Rand geben. border="2" bedeutet zwei Pixel Rand, und die Zellen bekommen automatisch einen dünnen Rand dazu. Das border-Attribut des <table> Elements ist veraltet.

Jetzt zum PHP

  • Die Ausgabe von einfachen Werten mit <?php echo $dings; ?> ist umständlich. Dafür kennt PHP die Kurzform <?= $dings ?>

  • Warum bindest Du in artikel.php die Funktionensammlung ein? Die brauchst Du dort doch gar nicht.

  • Es ist üblich und sinnvoll, in reinen Code-Dateien (func_artikel.php und artikel.php) das abschließende ?> wegzulassen. Grund: Alles, was hinter ?> folgt, wird von PHP an den Browser geschickt. Auch eine Leerstelle oder ein Zeilenumbruch. Das kann aus verschiedenen Gründen Ärger machen. Die Details führen jetzt zu weit; nimm es bitte als Empfehlung an.

  • Ich nehme an, dass Du aus Gründen der Einfachheit die jetztige Artikelliste als "Katalog" nutzen willst, wo man einfach die gewünschte Menge einträgt. Es ist aber eigentlich merkwürdig (finde ich), in der Tabelle links die bereits eingetragene Menge anzuzeigen und rechts ein Eingabefeld zum Ändern der Menge zu platzieren. Guck Dir Amazon an. Die haben NUR das Eingabefeld, das ist Ausgabe der aktuellen Menge und Du kannst es überschreiben, um die Menge zu ändern. Oder ich missverstehe deine Oberfläche...

  • Die Benutzereingabe muss zum Server gesendet werden können. Das geht (für den Einstieg) nur, wenn ein <form> Element verwendet wird. Du musst deine Table in ein <form> einschließen:

<form method="post" action="index.php">
   <table>
   ...
   </table>
</form>
  • Es ist nicht sinnvoll, jeder Zeile einen eigenen Button zu geben. Vielleicht möchte der Anwender mehrere Werte auf einmal ändern? Deswegen sollte es nur einen Submit-Button geben, der unter der Tabelle steht.

  • Wenn Du nun submit drückst, wird ein neuer HTTP Request an den Server geschickt. Im Gegensatz zum einfachen Seitenabruf mit dem Browser ist dies aber kein GET Request, sondern ein POST Request (steht im form: method="post"). Das kannst Du im PHP abfragen, indem Du $_SERVER['REQUEST_METHOD'] prüfst. Darin steht GET oder POST. Bei GET wurde die Seite vom Kunden aufgerufen, und alle Mengen sind 0. Beim POST wurde etwas ausgefüllt, und es sind Mengen da.

  • Die Frage ist nun, wie Du die eingegebenen Werte deinen Artikeln zuordnest. Dazu musst Du überhaupt erstmal die Werte einzeln bekommen. So, wie es jetzt ist, bekommst Du nur die Bestellmenge zum letzten Artikel. Verwende im input Feld name="bestellmenge[]". Dann macht PHP da ein Array draus, mit einem Eintrag pro Eingabefeld. Nach einem POST findest Du es in $_POST['bestellmenge']. Für eine simple Übung kannst Du die Zuordnung über die Position machen, d.h. der x-te Eintrag in $artikel_array hat seine Bestellmenge im x-ten Eintrag von $_POST['bestellmenge'].

  • Lass für die Ausgabe eine for-Schleife laufen (for ($zeile=0; $zeile<count($artikel_array); $zeile=$zeile+1)), und dann findest Du die Bestellmenge von $artikel_array[$i] in $_POST['bestellmenge'][$i]. Daraus kannst Du dann den Gesamtpreis für diese Position bestimmen und die Gesamtmehrwertsteuer, und du kannst aufsummieren für den Bestellwert.

  • Zusätzlich zum "Speichern" Button machst Du noch einen "Zur Bestellung" Button. Der macht ebenfalls einen POST, führt aber zur Registrierung und Adresseingabe. Ab jetzt wird's knifflig, denn entweder steuerst du das alles über das gleiche PHP Script (das geht durchaus, macht das Script aber gewaltig groß), oder Du bekommst irgendwann Probleme mit der Speicherung der geposteten Daten. Du solltest daher die Bestellmengen in der Session des Anwenders speichern. Dann kannst Du das formaction-Attribut des "Zur Bestellung" Buttons verwenden, um zur Registrierseite zu kommen, läufst aber Gefahr, dass ältere Browser (älter als Internet Explorer 10) das nicht verstehen. Als Fallback musst Du im index.php prüfen, ob dieser Button geklickt wurde, und dann eine Weiterleitung auslösen (header('location:...').

Rolf

--
sumpsi - posui - clusi