Checkbox auswerten
Fiffi
- php
0 Felix Riesterer
0 Fiffi0 EKKi0 Fiffi0 Tom0 EKKi0 Tom0 Der Martin
0 Tom0 Felix Riesterer
0 Fiffi
Guten Morgen. Ich mal wieder :-)
Ich möchte Checkboxen KOMPLETT auswerten (Also auch die nicht gesezten), um diese Werte wieder in die ausgelesene Datei/ Array zurück zu schreiben.
Mein Code gibt mir aber entweder nur die Namen oder Status aus :-(
<?php
// 1=aktiv / 0=inaktiv
$namen = array(
array('Hans','1'),
array('Paul','0'),
array('Karl','0'),
array('Willi','1'),
array('Otto','1'),
);
echo "
<table border=1>
<th>Name</th>
<th>Aktiv?</th>
";
foreach ($namen as $key => $val){
echo "
<form action=\"name_config.php\" method=\"get\">
<tr>
<td>".$val[0]."</td>
<td><input type=\"checkbox\"";
if ($val[1] == 1){echo "checked=\"checked\"";}
echo "name=\"box[]\" value=".$val[0]."></td>";
}
echo "<tr><td colspan=\"3\"><input type=\"submit\" name=\"save\"></td>
</tr></form></table>";
if(isset($_GET['box'])) {
echo "Die markierten werte sind:<br>";
foreach($_GET['box'] as $key => $box)
echo $_GET['box'][$key] = $box."<br>";
}
else {
echo "in Check-Box wurde nichts markiert.<br>";
}
?>
Gruss Fiffi
Lieber Fiffi,
$namen = array(
array('Hans','1'),
array('Paul','0'),
array('Karl','0'),
array('Willi','1'),
array('Otto','1'),
);
warum kein assoziatives Array? Außerdem ist es nicht sinnvoll, die numerischen Werte (hier null und eins) in Anführungszeichen zu schreiben und sie künstlich zu Strings machen zu wollen. Damit ließe es sich so leichter arbeiten:
$namen = array(
'Hans' => 1,
'Paul' => 0,
'Karl' => 0,
'Willi' => 1,
'Otto' => 1
);
echo "<form action=\"name_config.php\" method=\"get\">";
Warum benutzt Du keine Template-Schreibweise? Lagere den HTML-Code in eine echte HTML-Datei aus, die Du in PHP einliest, um dann an entsprechender Stelle die passenden Inhalte zu ergänzen. Du kannst später dann den kompletten HTML-Code mit einem finalen echo an den Browser ausgeben, anstatt in häppchenweise auszuliefern, was in bestimmten Fällen (z.B. beim Arbeiten mit geänderten header-Daten) eine zwingende Notwendigkeit ist.
$html = file_get_contents('template.html');
foreach ($namen as $key => $val){
echo "
<form action="name_config.php" method="get">"
Warum erzeugst Du für jeden Namen ein eigenes Formular? Du kannst doch alle Namen in einem einzigen Formular abhandeln! Vielleicht erklärt das bereits Dein eigentliches Problem...?
Deine HTML-Struktur würde ich auch konsequenter gestalten. Du willst doch eine Tabelle mit "Name | aktiv?" als Spalten. Dann gestalte das doch auch so:
~~~html
<table>
<tr><th>Name</th><th>aktiv</th></tr>
<tr><td>Hans</td><td><input type="checkbox" checked="checked" /></tr>
...
</table>
Und damit wären wir bei der Template-Datei:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title>Spielerübersicht</title>
<style type="text/css">/*<![CDATA[*/
#spieler-uebersicht,
#spieler-uebersicht td,
#spieler-uebersicht th {
border: 1px dotted black;
border-collapse: collapse;
}
#spieler-uebersicht th {
background: #aaaaaa;
}
*/]]>*/</style>
</head>
<body>
<h1>Spieler-Übersicht</h1>
<form action="name_config.php" method="post">
<table id="spieler-uebersicht">
<tr><th>Name</th><th>aktiv</th></tr>
</table>
</form>
</body>
</html
So, nun kann man mit PHP diese HTML-Datei befüllen:
$html = file_get_contents('template.html');
foreach ($namen as $name => $aktiv) {
$zeile = sprintf(
"\t\t\t\t"
. '<tr><td>%s</td><td><input name="box[%s]" checked="s" /></td>'
. "</tr>\r\n",
htmlspecialchars($name), // [link:http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel@title=kontextgerechtes Enkodieren!]
htmlspecialchars($name),
($aktiv ? 'checked' : '')
);
// vor </table> in den Quelltext einpassen
$html = preg_replace('~(?is)([ \t]+</table>)~', "$zeile$1", $html);
}
// alles an den Browser ausgeben
echo $html;
Den Code habe ich jetzt nicht überprüft, es könnten noch Fehler enthalten sein. Aber die generelle Denkweise dahinter sollte klar geworden sein.
Liebe Grüße,
Felix Riesterer.
Hallo Felix, und danke für deine ausführliche Antwort.
warum kein assoziatives Array? Außerdem ist es nicht sinnvoll, die numerischen Werte (hier null und eins) in Anführungszeichen zu schreiben und sie künstlich zu Strings machen zu wollen.
Hier ging mir nur darum erstmal ein Array zu haben :-)
Warum benutzt Du keine Template-Schreibweise?
Da es mir nur um die eigentliche Funktion der Übergabe der Daten ging, habe ich daruf verzichtet.
foreach ($namen as $key => $val){
echo "
<form action="name_config.php" method="get">"
>
> Warum erzeugst Du für jeden Namen ein eigenes Formular? Du kannst doch alle Namen in einem einzigen Formular abhandeln! Vielleicht erklärt das bereits Dein eigentliches Problem...?
>
Autsch... klar. Die Form muss ja ausserhalb der Foreach-Schleife beginnen.
Hab das sofort geändert.
»»
Vielleicht erklärt das bereits Dein eigentliches Problem...?
»»
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Mein Ziel ist (grob umschrieben):
Array alt:
~~~php
$namen = array(
array('Hans','1'),
array('Paul','0'),
array('Karl','0'),
array('Willi','1'),
array('Otto','1'),
)
Nach Änderung der per Check-Box:
Array neu:
$namen = array(
array('Hans','0'),
array('Paul','1'),
array('Karl','1'),
array('Willi','0'),
array('Otto','0'),
)
Liebe Grüsse Fiffi
Mahlzeit Fiffi,
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Ähm - klar. Was erwartest Du sonst?
MfG,
EKKi
Hallo EKKi,
Ähm - klar. Was erwartest Du sonst?
Gibt es denn keine Möglichkeit ALLES aus der geänderten Form zu bekommen?
Gruss Fiffi
Hello,
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Ähm - klar. Was erwartest Du sonst?
Die Namen der Parameter?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Mahlzeit Tom,
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Ähm - klar. Was erwartest Du sonst?
Die Namen der Parameter?
Ähm - die bekommt man doch?
MfG,
EKKi
Hello,
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Ähm - klar. Was erwartest Du sonst?
Die Namen der Parameter?
Ähm - die bekommt man doch?
Ja, sag ich doch. Hab mich nur gewundert, dass Du fragtest "Was erwartest Du sonst?".
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Ähm - klar. Was erwartest Du sonst?
Die Namen der Parameter?
Ähm - die bekommt man doch?
ja, dachte ich auch, deshalb habe ich mich auch schon gewundert, dass Fiffi sagt, "nur die Werte". Er/sie muss wohl bei der Auswertung des $_GET-Arrays irgendwas falsch machen.
Ich könnte mir auch schon denken, was:
1 foreach($_GET['box'] as $key => $box)
2
3 echo $_GET['box'][$key] = $box."<br>";
4
5 }
6 else {
7 echo "in Check-Box wurde nichts markiert.<br>";
8 }
In der Zeile, die ich hier als 3 gezählt habe, wird selbstverständlich nicht der Name des Eintrags ausgegeben; stattdessen findet eine Zuweisung statt und das Ergebnis der Zuweisung, nämlich der zugewiesene Wert, wird ausgegeben.
Ciao,
Martin
--
Frauen sind wie Elektrizität: Fasst man sie an, kriegt man eine gewischt.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Hello,
Leider nein. Ich bekomme bei submit nur die Werte der Checkboxen.
Bau Dir ein Musterformular, das mit der POST-Methode arbeitet und schau Dir dann bitte das $_POST-Array an
echo "<pre>\r\n";
echo htmlspeacialchars(print_r($_POST,1));
echo "</pre>\r\n";
Du wirst darin sowohl die Namen als auch die Werte der Parameter finden, die übertragen wurden.
Um nun die Kontrolle zu behalten auf dem Server, solltest Du sowieso ein Vorgabe-Array aufbauen, das alle Paramter enthält, die erwartet werden, sowie einen Default-Wert und Angaben darüber, ob ein Wert Pflicht ist, oder Kür, in welchen Typ der Wert überführt werden können soll, welchen Wertebereich er haben darf, usw.
Ergänze das Kontrollarray noch durch die Angabe "audited" und "errormsg". Dann kannst Du anschließend dem User in einem Affenformular auch automatisch Auskunft darüber geben, was er noch zu tun hat.
Bau Dir eine universelle Prüffunktion, die in einem Schleifendurchlauf durch das Vorgabearray die Vorgaben gegen die übermittelten Daten abgleicht.
Für die Einhaltung von Formaten sind z.B. auch die Filterfunktionen von PHP brauchbar:
http://de2.php.net/manual/en/book.filter.php
Wenn Du noch Fragen zur Vorgehensweise hast, dann frag einfach nochmal.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallöchen Tom,
Um nun die Kontrolle zu behalten auf dem Server, solltest Du sowieso ein Vorgabe-Array aufbauen, das alle Paramter enthält, die erwartet werden, sowie einen Default-Wert und Angaben darüber, ob ein Wert Pflicht ist, oder Kür, in welchen Typ der Wert überführt werden können soll, welchen Wertebereich er haben darf, usw.
Bau Dir eine universelle Prüffunktion, die in einem Schleifendurchlauf durch das Vorgabearray die Vorgaben gegen die übermittelten Daten abgleicht.
Genau so hab ich das schon mal gelöst. Ich dachte aber das es eine Möglichkeit gibt, es ohne Vorgabe Array zu lösen. Nämlich direkt aus der Form selber.
Klar hab ich im Netz nach Möglichkeiten gesucht (In der Zeit die ich damit verbracht hatte, hätte ich auch mit Vorgabe-Array programmieren können), aber die Hoffnung stirbt bekanntlich zuletzt :-)
Gruss Fiffi
Hello Fiffi,
Bau Dir eine universelle Prüffunktion, die in einem Schleifendurchlauf durch das Vorgabearray die Vorgaben gegen die übermittelten Daten abgleicht.
Genau so hab ich das schon mal gelöst. Ich dachte aber das es eine Möglichkeit gibt, es ohne Vorgabe Array zu lösen. Nämlich direkt aus der Form selber.
Das wäre aber sehr unsicher, denn alles, was aus dem Request stammt, ist erst einmal böse.
Und wenn Du Dir ein wohldurchdachtes Vorgabearray aufbaust, kannst Du aus diesem doch auch automatisch das Formular aufbauen lassen mittels einer anderen universellen Funktion.
Du ersparst Dir dadurch also, das ganze HTML-Geraffel für jedes Formular per Hand zu erzeugen.
Und wenn Du jetzt noch einen Schritt weiterdenkst, dann baust Du Dir auch keine Vorgabe-Arrays mehr per Hand ausf, sondern baust Dir einen Vorgabe-Array-Generator, der Dinge, die Du sowieso immer drin haben willst, schon mal automatisch einsetzt und solche, für die es nur wenige Möglichkeiten gibt, entsprechende Vorschläge unterbreitet.
Mit diesem baust Du dann die Definitionsdateien für die Formulare und ihre Vorgabearrays auf und aus den Definitionsdateien baust Du dann mittels der HTML-Generator-Funkiton die HTML-Dokumente auf, bzw. lässt dies automatisch erledigen.
Die Feinheiten der Anzeige könnten dann immer noch durch Anpassung eines (ebenfalls generierten) Standard-CSS-Files stattfinden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo lieber Tom,
ich hab mal bissl probiert und komme meinem Plan bissl näher.
Nur leider bekomme ich bei der Ausgabe die Namen doppelt raus.
Vielleicht siehst du den Fehler in meiner Schleife :-)
foreach ($namen as $k => $name) {
foreach($_GET['box'] as $key => $box) {
if ($name[0] == $box) {$status = '1';}
else $status = '0';
echo $name[0] ." - ".$status."<br>";
}
}
Ausgabe Inhalt $_GET['box'] mit print_r:
Array
(
[0] => Hans
[1] => Willi
)
Echo Ausgabe:
Die markierten werte sind:
Hans - 1
Hans - 0
Paul - 0
Paul - 0
Karl - 0
Karl - 0
Willi - 0
Willi - 1
Otto - 0
Otto - 0
Die Werte stimmen. Aber wie man sieht sind die Namen doppelt.
Gruss Fiffi
Hi,
Nur leider bekomme ich bei der Ausgabe die Namen doppelt raus.
Vielleicht siehst du den Fehler in meiner Schleife :-)
foreach ($namen as $k => $name) {
foreach($_GET['box'] as $key => $box) {
Der Fehler sind \*die\* Schleifen.
> Die Werte stimmen. Aber wie man sieht sind die Namen doppelt.
Natürlich, schließlich hast du zwei Schleifen ineinander verschachtelt.
Dass sich damit die Anzahl der Ausführungen des innersten Code-Blockes als Anzahl Durchläufe äußere Schleife mal Anzahl Durchläufe innere Schleife ergibt, sollte doch wohl absolut klar sein.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hallo Chris,
danke für die Fehlerbeschreibung.
Dass sich damit die Anzahl der Ausführungen des innersten Code-Blockes als Anzahl Durchläufe äußere Schleife mal Anzahl Durchläufe innere Schleife ergibt, sollte doch wohl absolut klar sein.
Aber wie kann ich diesen Fehler beheben? ich hab die Ausgabe schon an anderen Stellen gesetzt, aber das half leider nicht :-(
Gruss Fiffi
Lieber Fiffi,
Da es mir nur um die eigentliche Funktion der Übergabe der Daten ging, habe ich daruf verzichtet.
hmm..., finde ich nicht gut. Je mehr Du über Deine Kentnisse und Vorgehensweisen zeigst, desto genauer kann man Dir helfen. Das spart im Zweifelsfalle beiden Seiten Zeit.
Ich bekomme bei submit nur die Werte der Checkboxen.
Ja, was denn auch sonst? Du bekommst nur die name-value-Paare der angewählten Checkboxen. Die nicht angewählten erhälst Du nicht. Auch nicht die Info, dass es sie zum anwählen gegeben hätte.
Wenn Du die Info willst, welche Namen man hätte auch anwählen können, dann sind entweder Checkboxen das falsche Mittel der Wahl (nimm lieder Radio-Button-Paare mit gleichem Namen), oder Deine Denkweise passt noch nicht zur Sachlage (siehe die Hinweise mit einem "vorausgefüllten" Array, bei dem Du eventuell Werte anpasst).
Ich greife auf mein Beispiel zurück und ergänze folgendes:
// Array befüllen (z.B. aus DB oder ähnlichem)
$namen = array(
'Hans' => 1,
'Paul' => 0,
'Karl' => 0,
'Willi' => 1,
'Otto' => 1
);
// Array mit abgeschickten Werten modifizieren?
if (!empty($_POST) && !empty($_POST['box'])) {
// ja, auf $_POST['box'][$name] prüfen (<input name="box[%s]" />)
foreach ($namen as $name => $aktiv) {
$namen[$name] = isset($_POST['box'][$name]);
}
}
// Tabellenübersicht ausgeben
$html = file_get_contents('template.html');
// usw.
In meinem Code fehlte bei den <input>
-Elementen das "type="checkbox", aber das war Dir sicherlich aufgefallen.
Liebe Grüße,
Felix Riesterer.
Lieber Felix,
ich hab deinen Vorschlag umgesetzt und bin begeistert :-)
Ich hab die foreach mal mit:
echo $namen[$name]." - ".$name."<br>";
ergänzt. Und siehe Da !! Ich bekomme raus:
1 - Hans
Damit kann ich weiter arbeiten. Ich bin dir wirklich sehr dankbar Felix.
Gaaanz lieben Gruß Fiffi