icho40: Array Übergabe mit "POST"

Hallo,

ich möchte eine Bestellseite nur für den privaten Gebrauch im lokalen Netzwerk bauen. Dabei soll die aktuelle Kalenderwoche sowie Wochentag und gewünschtes Menü per "POST" übertragen werden. Leider kommt beim Wert "Wochentag" nur der letzte Wert an.

Die Abfrageseite:

<form method="post" action="bestelluebersicht.php">
<label for="Name">Wer bestellt?</label>

     <select name="name" id="name">
          <option value="Willi">Willi</option>
          <option value="Angie">Angie</option>
          <option value="Tom">Tom</option>
     </select>
<br>
<?php
$datum = time();         // aktuelles Datum
$kw = date("W", $datum)+1;
echo 'Kalenderwoche: ';
echo $kw;
echo "<br>";
echo '<input type="hidden" name="Kalenderwoche" value="'.$kw . '">';
$wochentag = array(
"mo" => "Montag",
"di" => "Dienstag",
"mi" => "Mittwoch",
"do" => "Donnerstag",
"fr" => "Freitag");
foreach($wochentag as $value){
		echo $value;	
		echo "<br>";
		echo '<input type="hidden" name="wochentag" value="'. $value . '">';

		echo 'Gericht: ';
	$menue = array("Suppe","Dessert","Bistro","Classic","Wahl","Wellness");
	foreach($menue as $value)
	{
	  		echo $value;
			echo '<input type="checkbox" name="result[]" value="'. $value . '">';
			echo "\n";
	}
	echo "<br>";
}
?>
<td><center><button type="submit">abschicken</button></center></table></td>

Die Auswertung:

<!DOCTYPE html>
<html>
<body>
<pre>
<?php var_dump($_POST); ?>
</pre>
</body>
</html>


Kann mir bitte jemand sagen, wo mein Fehler liegt?

  1. @@icho40

    echo "<br>";
    echo '<input type="hidden" name="Kalenderwoche" value="'.$kw . '">';
    

    Du kennst den Unterschied zwischen einfachen und doppelten Anführungszeichen in PHP?

    Bei der ersten Zeile gibt es nichts zu parsen; da sind einfache Anführungszeichen angebracht (Mikrooptimierung).

    echo '<br>'
    

    (Abgesehen davon, dass es nicht angebracht ist, hier <br> zu verwenden.)

    Die zweite Zeile musst du nicht so umständlich, unübersichtlich und fehleranfällig schreiben, sondern

    echo "<input type='hidden' name='Kalenderwoche' value='$kw'>";
    

    	foreach($menue as $value)
    	{
    	  		echo $value;
    			echo '<input type="checkbox" name="result[]" value="'. $value . '">';
    			echo "\n";
    	}
    

    Fehler: Die Checkboxen haben keine Beschriftung (<label>).


    <td><center><button type="submit">abschicken</button></center></table></td>
    

    Layouttabelle?? <center>?? Von CSS hast du schon gehört?


    Kann mir bitte jemand sagen, wo mein Fehler liegt?

    Wo kann man sich das den ansehen, ohne dass man das nachbauen muss?

    Jolan tru

    --
    Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
    1. Du kennst den Unterschied zwischen einfachen und doppelten Anführungszeichen in PHP?

      Ja, aber ich bin noch im Lernprozess, danke für den Hinweis. Anhand deiner Beispiele sehe ich, dass ich außen die einfachen und innen die doppelten Anführunszeichen nehmen sollte.

      Bei der ersten Zeile gibt es nichts zu parsen; da sind einfache Anführungszeichen angebracht (Mikrooptimierung).

      echo '<br>'
      

      (Abgesehen davon, dass es nicht angebracht ist, hier <br> zu verwenden.)

      wie bekomme ich dann einen Zeilenumbruch?

      Die zweite Zeile musst du nicht so umständlich, unübersichtlich und fehleranfällig schreiben, sondern

      echo "<input type='hidden' name='Kalenderwoche' value='$kw'>";
      

      Danke für den Tipp.

      	foreach($menue as $value)
      	{
      	  		echo $value;
      			echo '<input type="checkbox" name="result[]" value="'. $value . '">';
      			echo "\n";
      	}
      

      Fehler: Die Checkboxen haben keine Beschriftung (<label>).


      Jetzt schon 😉

      <td><center><button type="submit">abschicken</button></center></table></td>
      

      Layouttabelle?? <center>?? Von CSS hast du schon gehört?


      Es ist sogar eine css-Datei dabei, aber ich wollte mich damit nicht auch noch beschäftigen müssen. Ich hab die Dateien von hier selfhtml.org und einfach per try&error gelöscht, was ich nicht brauche.

      Kann mir bitte jemand sagen, wo mein Fehler liegt?

      Wo kann man sich das den ansehen, ohne dass man das nachbauen muss?

      Hier: meine Dropbox

      Jolan tru

      Danke, hab wieder was dazugelernt.

  2. Hallo icho40,

    abgesehen von den inhaltlichen Schwächen, die Gunnar angesprochen hat, weißt Du eigentlich, wie man es richtig macht. Beim Gericht sieht man es.

    Das ist halt blöd, wenn das eine Armpaar nicht weiß, was das andere tut…[1] 😉

    Rolf

    --
    sumpsi - posui - obstruxi

    1. Wer sich icho nennt, kann nur ein Haluter sein… ↩︎

    1. Wie ich bereits an Gunnar schrieb, bin ich noch im Lernprozess. Und ja, ich liebe Haluter, aber Gucky finde ich süßer 😜

    2. Nichtsdestotrotz kommt bei der Auswertungsseite nur der Freitag an.

      Das ist mein Hauptproblem. Vielleicht findet einer von Euch meinen Fehler. Dafür wäre ich sehr dankbar.

      1. Hallo icho40,

        ich lerne noch

        Nur HTML/CSS? Oder auch PHP?

        Ich hab die Dateien von hier selfhtml.org und einfach per try&error gelöscht, was ich nicht brauche.

        Das ist Nr. 1 unserer fertigen Designs, das bereits mit Grid-Layout arbeitet. Und das ruinierst Du mit Layout-Tabellen? Oh je. Was Grid-Layout ist, findest Du im Selfhtml-Wiki erklärt, aber wenn Du noch gar keine Ahnung von CSS hast, dann solltest Du diese Grundkenntnisse schnell erlernen.

        Wie auch immer.

        Das sehe ich jetzt erst: deine Checkboxliste ist zweidimensional.

        Heißt: dieses hidden input

        <input type="hidden" name="wochentag" value="'. $value . '">
        

        nützt dir nichts, weil Du ja 5 Zeilen mit Checkboxen erzeugst, für jeden Wochentag eine. Und wenn Du fünfmal ein hidden input mit Name "wochentag" hast, dann kannst Du auch name="wochentag[]" verwenden und es hilft nichts. Denn für die Checkboxen weißt Du immer noch nicht, zu welchem Tag sie gehören.

        D.h. für die Antwort ans PHP muss außer dem Gericht auch der Wochentag rein. Das kannst Du auf zwei Arten machen.

        (a) Mache aus result ein zweidimensionales Array. Du findest in $_POST['result'] dann ein Array mit bis zu 5 Einträgen, deren Key der Wochentag ist, und jeder dieser Einträge ist ein Array mit den für diesen Tag ausgewählten Gerichten. Ich DENKE, dass das fachlich am sinnvollsten ist.

        Aber vielleicht siehst Du das ja anders.

        (b) Bleibe bei einem eindimensionalen Array und verwende als Value eine Kombination aus Wochentag und Gericht, so dass in result dann Werte wie "Montag-Suppe", "Dienstag-Bistro" stehen. Die musst Du dann wieder auseinandernehmen (-> explode) und auf die Wochentage verteilen, um die Bestellung zu bekommen. Ich GLAUBE, dass das ungeschickter ist.

        Die Lösung liegt in beiden Fällen bei dem input für die Checkbox. Um mal bei deinem Coding-Style zu bleiben:

        Variante a:

        echo '<input type="checkbox" name="result[' . $wochentag . '][]" value="'. $value . '">';
        

        Variante b:

        echo '<input type="checkbox" name="result[]" value="'. $wochentag . '-' . $value . '">';
        

        Das mit dem Coding-Style geht allerdings besser. Die erste Optimierung wäre, das input-Element in doppelte Anführungszeichen zu setzen und dafür die HTML Attribute mit einfachen Anführungszeichen zu versehen. Dann kannst Du String-Interpolation verwenden (hier im PHP-Handbuch). Das heißt, dass PHP im String Variablen ersetzt, wenn der in doppelten Anführungszeichen steht:

        echo "<input type='checkbox' name='result[]' value='$wochentag-$value'>";
        

        Das sieht doch cooler aus, oder?

        Aber guter Stil ist eigentlich anders. Man muss HTML nicht per ECHO ausgeben. Wenn Du einen guten Code-Editor hast, der HTML-Elemente mit Syntaxfarben versehen kann, machen diese Echos alles kaputt. Besser ist, für einen Moment aus PHP auszusteigen. Um dann nicht die Übersicht bei dem foreach zu verlieren, verwendet man dann die sogenannte Alternative Syntax. Die sieht so aus:

        foreach ($array as $wert):
           // schleifeninhalt
        endforech;
        

        Und weil dein Wochentage-Array mit Keys aufgebaut ist, die Du bestimmt statt der Langnamen zum Server schicken willst, verwendest Du dafür die Foreach-Variante mit $key = $value. Die Initialisierung des $menue-Arrays ziehst Du vor die Schleife, die brauchst Du nur einmal. Und das hidden input für die Wochentage brauchst Du gar nicht.

        $menue = array("Suppe","Dessert","Bistro","Classic","Wahl","Wellness");
        
        foreach($wochentag as $tag => $wochentag):
        ?>
        <?= $wochentag ?><br>
        Gericht:
        <?php
        	foreach($menue as $gericht):
        ?>
        <label>
          <?= $gericht ?>
          <input type="checkbox" name="result[<?= $tag ?>][]" value="<?= $gericht ?>">
        </label>
        <?php
        	endforeach;
        ?>
        <br>
        <?php 
        endforeach;
        
        // Weiteres PHP
        

        Hinter dem ersten foreach beendest Du mit ?> den PHP-Modus, d.h. jetzt bist Du wieder im HTML Modus. Um den Wochentag auszugeben, musst Du aber an eine PHP-Variable heran. Dafür verwendet man das "Kurze Echo" <?= ... ?>, was im Prinzip das Gleiche ist wie <?php echo ...; ?>. Nur kürzer.

        Für die innere Schleife steigst Du ins PHP ein und gleich wieder aus. Das <label> Element ist Teil der inneren Schleife. Den Namen des Gerichts holst Du mit <?= $gericht ?> (ich habe das $value hinter dem as mal sinnvoller benannt) und schreibst die Checkbox dahinter. Das, was da aufgebaut wird, ist die Variante a von oben, d.h. das result-Array wird zweidimensional. Ich weiß allerdings nicht, ob die Wochentag-Kürzel in Hochkommas stehen müssen, damit PHP das versteht. Möglicherweise gibt das komische Meldungen und Du musst name="result['<?= $tag ?>'][]" verwenden.

        Das ganze HTML geht eigentlich noch viel schöner, aber ich will Dich nicht noch mehr überfordern 😉. Und die Labels brauchen eigentlich ein for-Attribut, das auf das id-Attribut des input-Elements verweist. Dafür musst Du aber ID-Management betreiben, weil natürlich pro Checkbox eine eigene ID nötig ist, deshalb schachtele ich einfach das input ins Label. Das ist semantisch ok, leider kommen nicht alle Screenreader damit klar. Aber Du sprachst ja von Privatgebrauch im lokalen Netz. Sobald Du damit ins Internet gehst und ggf. Nutzer bekommst, die sich das vorlesen lassen wollen oder müssen, melde Dich nochmal für bessere Zugänglichkeit.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Nur HTML/CSS? Oder auch PHP?

          In erster Linie HTML und PHP.

          Erstmal vielen Dank an alle für die ausführlichen Erläuterungen. Ich werde mich morgen mal durch die ganzen Tipps und Hinweise arbeiten.

          P.S. Nachdem ich einige Postings gelesen habe, fühle ich mich hier bereits recht wohl unter Linux- und PR Freunden.💓

          1. Nachdem ich nun eure Tips befolgt habe, funktioniert es so, wie ich es mir vorgestellt habe. 👍

            Das Ergebnis seht ihr hier

            Jetzt kann ich mich mit der Übergabe an die DB beschäftigen.😉

            Vielen herzlichen Dank euch allen.🤗