jujuvier: ist mein quelltext so richtig

<!DOCTYPE HTML>
<html lang=de>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="gewinnrechner_klausur1.css">
</head>
<body>
<div id="inhalt">

<?php

$stuck=$_POST[stück];
$preis=$_POST[preis];
$fix=$_POST[fix];
$variable=$_POST[variable];

echo "<h1>Der Gewinnrechner</h1>";
echo "<h2>Sie ermitteln Ihren Gewinn mit folgenden Daten:</h2>";

echo "<table>";
echo "<tr>";
echo "<td>Stückzahl</td>";
echo "<td>$stuck</td>";
echo "</tr>";

echo "<tr>";
echo "<td>Verkaufspreis</td>";
echo "<td>$preis</td>";
echo "</tr>";

echo "<tr>";
echo "<td>Fixkosten</td>";
echo "<td>$fix</td>";
echo "</tr>";

echo "<tr>";
echo "<td>variable Stückkosten</td>";
echo "<td>$variable</td>";
echo "</tr>";

echo "</table>";

echo "<h2>Hier sehen Sie ihre Gewinnentwicklung</h2>";

echo "<table>";
echo "<th>Stück</th>";
echo "<th>Umsatz</th>";
echo "<th>Kosten</th>";
echo "<th>Gewinn</th>";

$zaehler=1;
while ($zaehler<=$stuck) {+
$umsatz=$preis*$zaehler;
$kosten=$variable*$zaehler+$fix;
$gewinn=$umsatz-$kosten;
echo "<tr>";
echo "<td>$stuck</td>";
echo "<td>$umsatz</td>";
echo "<td>$kosten</td>";
echo "<td>$gewinn</td>";
echo "</tr>";
$zaehler++;
}
echo "</table>";
?>

</div>
</body>
</html>
  1. Hallo jujuvier,

    Falls das ein Spickzettel für deine Klausur werden soll …

    Bis demnächst
    Matthias

    --
    Du kannst das Projekt SELFHTML unterstützen,
    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    1. ich wollte nur wissen, ob es so richtig ist

    2. Hallo Matthias,

      Falls das ein Spickzettel für deine Klausur werden soll …

      ... wäre das ein sehr ungewöhnlicher Zeitpunkt. Ich kann mir nicht vorstellen, dass man in der Schule (auch Berufsschule) am letzten Arbeitstag vor Weihnachten[1] noch eine Klausur schreibt. Da ist doch niemand mehr aufmerksam.

      Ciao,
       Martin

      --
      Sei n die Anzahl der bekannten Fehler in einer Software, dann gilt stets: n = n+1

      1. Natürlich ist Montag, der 23. auch noch ein Werktag, und mancher arme Sack muss sogar am 24. noch ran. Aber für den größten Teil der arbeitenden Bevölkerung ist doch morgen nachmittag das Arbeitsjahr gelaufen. ↩︎

  2. @@jujuvier

    echo "<h1>Der Gewinnrechner</h1>";

    Markup mit echo zu generieren würde ich nicht richtig nennen.

    https://forum.selfhtml.org/self/2019/sep/08/css-problem/1757484#m1757484

    LLAP 🖖

    --
    „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
    „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

    —Marc-Uwe Kling
  3. @@jujuvier

    $stuck=$_POST[stück];echo "<td>$stuck</td>";
    

    Nein!!

    Niemals Daten, die man nicht unter Kontrolle hat, unbehandelt in HTML ausgeben! Sicherheitslücke! Kontextwechsel beachten!

    <td><?php echo htmlspecialchars($stuck); ?></td>
    

    Kurz:

    <td><?= htmlspecialchars($stuck) ?></td>
    

    LLAP 🖖

    --
    „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
    „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

    —Marc-Uwe Kling
  4. Hallo,

    zunächst mal schließe ich mich Gunnar inhaltlich an. Außerdem ...

    $stuck=$_POST[stück];
    $preis=$_POST[preis];
    $fix=$_POST[fix];
    $variable=$_POST[variable];
    

    ... ist dieses Umkopieren von Daten selten sinnvoll. Das verschleiert vor allem die Herkunft der Daten.

    while ($zaehler<=$stuck) {+
    $umsatz=$preis*$zaehler;
    $kosten=$variable*$zaehler+$fix;
    $gewinn=$umsatz-$kosten;
    echo "<tr>";
    echo "<td>$stuck</td>";
    echo "<td>$umsatz</td>";
    echo "<td>$kosten</td>";
    echo "<td>$gewinn</td>";
    echo "</tr>";
    $zaehler++;
    }
    

    Diese Schleife würde man normalerweise eher mit for () realisieren: Die Anzahl der Durchläufe ist vorher bekannt, die Abbruchbedingung simpel.
    Aber was macht das Pluszeichen am Schleifenanfang?

    Ciao,
     Martin

    --
    Nicht alles, was hinkt, ist ein Vergleich.
    1. Hallo Martin,

      ... ist dieses Umkopieren von Daten selten sinnvoll.

      Ich mache es grundsätzlich am Programmanfang, die geprüften und ggf. ergänzten Eingangsdaten müssen nicht bei jeder Verwendung nochmals geprüft werden.

      Außerdem sehe ich gleich am Anfang des Programms, welche Eingangsdaten erwartet werden.

      Gruß, Linuchs

      1. Tach!

        ... ist dieses Umkopieren von Daten selten sinnvoll.

        Ich mache es grundsätzlich am Programmanfang, die geprüften und ggf. ergänzten Eingangsdaten müssen nicht bei jeder Verwendung nochmals geprüft werden.

        Geprüft und gegebenenfalls ergänzt ist was anderes als einfaches Umkopieren.

        Außerdem sehe ich gleich am Anfang des Programms, welche Eingangsdaten erwartet werden.

        Das kann man auch mittels eines Kommentars dokumentieren, dazu braucht man keinen nutzlosen Code auszuführen.

        dedlfix.

        1. Hallo dedlfix,

          nutzlosen Code

          Das ist nicht nutzlos.

          Wenn man seinen Code modularisiert oder OOP einsetzt, dann will man Verarbeitung von Ein-/Ausgabe trennen. Daten aus $_POST zu lesen ist eine Eingabeoperation. Sie zu plausibilisieren ein Schritt der Businesslogik, sie zu verarbeiten ein weiterer.

          Eingabedaten, plausibilisierte Eingabedaten und Datenmodell voneinander getrennt zu halten kann beim Fehlersuchen und beim Vermeiden von Abhängigkeiten zwischen Codeteilen sehr hilfreich sein. Bei Unittests auch.

          Rolf

          --
          sumpsi - posui - clusi
        2. Außerdem sehe ich gleich am Anfang des Programms, welche Eingangsdaten erwartet werden.

          Das kann man auch mittels eines Kommentars dokumentieren.

          Na dann viel Spaß mit der Redundanz, die wird bei mir nach kurzer Zeit ein Eigenleben entwickeln.

  5. Hallo jujuvier,

    $stuck=$_POST[stück];
    $preis=$_POST[preis];
    $fix=$_POST[fix];
    $variable=$_POST[variable];
    

    Nein!!

    Array-Schlüssel sind Strings und gehören als Strings aufgeschrieben. PHP lässt das zwar aus historischen Gründen zu, es ist aber falsch. Wenn zufällig per define() einer der Begriffe stück, preis, fix oder variable mit einem Wert belegt wird, fliegt Dir dieser Code aus der Kurve. Und man sollte immer prüfen, ob die erwarteten Daten überhaupt da sind, sonst nervt PHP mit einer Notice.

    $stück    = empty($_POST['stück'])    ? 0 : $_POST['stück'];
    $preis    = empty($_POST['preis'])    ? 0 : $_POST['preis'];
    $fix      = empty($_POST['fix'])      ? 0 : $_POST['fix'];
    $variable = empty($_POST['variable']) ? 0 : $_POST['variable'];
    

    Abgesehen davon brauchst Du dein Programm nicht zu vergipsen. $stück ist tatsächlich eine erlaubte Variable - egal ob dein PHP Code in einer klassischen Codepage oder in UTF-8 gespeichert ist.

    Deine while-Scheife möchte vermutlich lieber eine for-Schleife sein:

    $zähler = 1;
    while ($zähler <= $stück) {
       ...
       $zähler++;
    }
    
    for ($zähler = 1; $zähler <= $stück; $zähler++) {
       ...
    }
    

    Bzw mit der alternativen Syntax für Kontrollstrukturen, wenn Du dem Rat folgst, nicht alles per echo auszugeben:

    for ($zähler = 1; $zähler <= $stück; $zähler++):
       ...
    endfor;
    

    Hoffentlich bist Du jetzt für die Klausur nicht endverwirrt. Wer schreibt überhaupt so kurz vor Weihnachten noch eine Klausur? Das ist ja Tierquälerei!

    Rolf

    --
    sumpsi - posui - clusi
    1. Hello,

      Gegenvorschlag:

      $_POST['stueck'] = intval($_POST['stueck']);  ## bei ganzen Stück. 
      

      Sonst eben floatval().

      und vorher die erforderlichen $_POST-Elemente mit isset(element1, element2, ...) abfragen, ob sie vorhanden sind. Sonst war sowieso etwas manipuliert worden.

      Glück Auf
      Tom vom Berg

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
  6. Hi,

    <body> <div id="inhalt">

    wurde glaub ich noch nicht erwähnt: das div wäre gerne ein main.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      kann man machen. Man kann es aber auch einfach weglassen - Rahmen-DIVs werden eigentlich nie gebraucht. Vielleicht waren die 1998 mal nötig...

      Wenn <main>, dann aber auch ein <header> Element um das <h1>, das <main> dahinter und je ein <section> Element um die Parameter-Ausgabe und um die Berechnungstabelle.

      Unter diesem Aspekt betrachtet wäre dann noch die erste Table gern eine Liste, keine Tabelle. Das sind keine tabellarischen Daten.

      Die Seite, von der aus die Daten für den Rechner gepostet werden, hat sicherlich auch noch Potenzial für Verbesserung, da könnte man sicherlich stundenlang über Affenformulare diskutieren. Und ein Login wäre auch ganz praktisch.

      Sorry. Mein Gaul ist etwas unbeherrscht, der geht gelegentlich mit mir durch...

      Rolf

      --
      sumpsi - posui - clusi
      1. @@Rolf B

        Wenn <main>, dann aber auch ein <header> Element um das <h1>

        Nein, warum?

        das <main> dahinter

        Das macht die Sache nicht besser. Die Überschrift gehört doch zum Hauptinhalt, also ins main-Element.

        und je ein <section> Element um die Parameter-Ausgabe und um die Berechnungstabelle.

        Könnte man … Aber dann bitte jeweils mit einer h2 darin, keine unbenamsten sections.

        Sorry. Mein Gaul ist etwas unbeherrscht, der geht gelegentlich mit mir durch...

        Wünsch dir Zaumzeug vom Weihnachtsmann!

        LLAP 🖖

        --
        „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
        „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

        —Marc-Uwe Kling