Wieso das passiert ist mir grad auch nicht so klar. Aber ein "$tocheck === $status_id" behebt Dein Problem.
Zu meinem Problem - ich habe diesen folgenden Codeschnipsel:
Sprich ich definiere ein Array mit diversen Werten und lasse daraus mit foreach() ein SELECT erstellen. Soweit, so gut.PHP-Code:// Statusmöglichkeiten
$cat_status_desc['x'] = 'Alle';
$cat_status_desc[0] = 'Intern';
$cat_status_desc[1] = 'Öffentlich';
$cat_status_desc[2] = 'Archiviert';
$tocheck = (isset($_POST['status']))
? $_POST['status']
: 'x';
$output = '<select name="status">' . "\n";
foreach($cat_status_desc AS $status_id => $status_desc)
{
$output .= '<option' . ($tocheck == $status_id ? ' selected="selected"' : '') . ' value="' . $status_id . '">' . db2cont($status_desc) . '</option>' . "\n";
}
$output .= '</select>';
Das Problem kommt mit dem automatischen Selektieren eines Eintrages. Wenn noch keinerlei Daten (POST) übertragen wurden, beinhaltet $tocheck ja nichts weiter als den String "x". Also müsste er ja den Eintrag im foreach() auswählen, der auch das "x" enthält ($status_id).
Was passiert aber? Es wird einmal korrekterweise der Eintrag "Alle" mit "x" ausgewählt UND zusätzlich "Intern" mit dem Wert 0 ...
Auch wenn ich das Formular dann abschicke und "Alle" auswähle, markiert er wieder "Alle" und "Intern". Bei den anderen Feldern gibt es kein Problem.
Wieso passiert das? Ein "x" ist doch nicht gleich 0 ('x' == 0)? Oder überseh ich grad etwas?
Wenn ich anstelle von "x" ein -10 vergebe, funktioniert es tadellos. Aber warum mit dem "x" nicht?
Ich benutze lokal PHP 5.2 ... falls das von Interesse ist.
Geändert von Boris (12.05.2008 um 15:06 Uhr)
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Wieso das passiert ist mir grad auch nicht so klar. Aber ein "$tocheck === $status_id" behebt Dein Problem.
Grüße vom Griechen,
Cybergreek!
everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht
Nein, tut es eben nicht. Wenn ich den === Operator nehme, wird zwar "Alle" (x) korrekt markiert, dann aber 0, 1 und 2 nicht mehr.
Ich versteh nur Bahnhof heute![]()
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Also dieser Code:
erzeugt folgenden Quelltext:PHP-Code:<?php
// Statusmöglichkeiten
$cat_status_desc['x'] = 'Alle';
$cat_status_desc[0] = 'Intern';
$cat_status_desc[1] = 'Öffentlich';
$cat_status_desc[2] = 'Archiviert';
$tocheck = (isset($_POST['status']))
? $_POST['status']
: 2;
$output = '<select name="status">' . "\n";
foreach($cat_status_desc AS $status_id => $status_desc)
{
$output .= '<option' . ($tocheck === $status_id ? ' selected="selected"' : '') . ' value="' . $status_id . '">' . $status_desc . '</option>' . "\n";
}
$output .= '</select>';
echo $output;
?>
Du darfst dann natürlich auch die Zahlen nicht als String zuweisen sondern als numerischen Wert (: (int)"2";). "===" vergleicht ja auch den Typ der Variable.HTML-Code:<select name="status"> <option value="x">Alle</option> <option value="0">Intern</option> <option value="1">Öffentlich</option> <option selected="selected" value="2">Archiviert</option> </select>
Grüße vom Griechen,
Cybergreek!
everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht
was spricht gegen eine solche loesung?PHP-Code:<?php
// Statusmöglichkeiten
$cat_status_desc[0] = 'Alle';
$cat_status_desc[1] = 'Intern';
$cat_status_desc[2] = 'Öffentlich';
$cat_status_desc[3] = 'Archiviert';
// defaultwert fuer 'alle' setzen, falls kein post.wert uebergeben wurde
$x = trim($_POST['status'])!='' ? $_POST['status'] : 0;
// options aufbauen
for($i=0; $i<count($cat_status_desc); $i++){
$sel = $x==$i ? " selected=\"selected\"" : '';
$options.= sprintf("<option%s>%s</option>", $sel, $cat_status_desc[$i]);
}
// selector ausgeben
echo sprintf("<select name=\"status\">%s</select>\n", $options);
?>
Geändert von theo (12.05.2008 um 15:22 Uhr) Grund: sorry ... kleiner fehler drin
Das weiß ich ja auch, nur geht selbst auch das nicht. Das ist es ja eben, was ich nicht verstehe.Du darfst dann natürlich auch die Zahlen nicht als String zuweisen sondern als numerischen Wert (: (int)"2". "===" vergleicht ja auch den Typ der Variable.
Weil ich die 0 für "Intern" brauche?was spricht gegen eine solche loesung?![]()
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Grüße vom Griechen,
Cybergreek!
everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht
aber geht man mal nur vom html aus, so wird der selector doch eh auf den ersten eintrag gesetzt. wenn der nun gar kein value hat und du nur auf die tatsache pruefst, ob das formular versendet wurde, dann ist, wenn $_POST['status'] keinen wert hat, der erste eintag uebergeben worden.
das sollte alle probleme loesen ...
Wenn ich mit deinem Code als Vorauswahl 2 nehme, funktioniert es soweit. Wenn ich aber das Formular dann abschicke, wird nichts mehr ausgewählt.Was geht denn an dem Beispiel (php -> html) von mir oben genau nicht?
Nehm ich als Vorauswahl das X, wird auch nichts ausgewählt.
Das ändert auch nichts, wenn ich die Zahlentypen explizit mit (int) vorgebe.
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Das Problem lässt sich auch "lösen", indem ich für "alle" halt -10 definiere. Ich will aber wissen, warum es nicht geht wie ich mir das denke - aus reinem Wissensdurst.das sollte alle probleme loesen![]()
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Ich glaub, die Sonne ist zu stark und ich verstehe das Problem deswegen nicht
Gibt es damit immernoch ein Problem?PHP-Code:<?php
// Statusmöglichkeiten
$cat_status_desc['x'] = 'Alle';
$cat_status_desc[0] = 'Intern';
$cat_status_desc[1] = 'Öffentlich';
$cat_status_desc[2] = 'Archiviert';
$output = "<form action='".$PHP_SELF."' method='post'>";
$tocheck = (isset($_POST['status']) && $_POST['status'] != 'x')
? (int)$_POST['status']
: 'x';
$output .= '<select name="status">' . "\n";
foreach($cat_status_desc AS $status_id => $status_desc)
{
$output .= '<option' . ($tocheck === $status_id ? ' selected="selected"' : '') . ' value="' . $status_id . '">' . $status_desc . '</option>' . "\n";
}
$output .= '</select><input type="submit"></form>';
echo $output;
?>
Grüße vom Griechen,
Cybergreek!
everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht
Ah, das zusätzliche ... AND $_POST['status'] != 'x' hat es gebracht
Ich glaub ich hab zu lang am Rechner gesessen - in den letzten Tagen etwas immer über 14 Stunden pro Tag![]()
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
ok ... fuer deinen wissensdurst noch eine loesung von mirPHP-Code:<?php
echo $_POST['status'];
// Statusmöglichkeiten
$cat_status_desc['x'] = 'Alle';
$cat_status_desc[0] = 'Intern';
$cat_status_desc[1] = 'Öffentlich';
$cat_status_desc[2] = 'Archiviert';
// defaultwert fuer 'alle' setzen, falls kein post.wert uebergeben wurde
$x = trim($_POST['status'])!='' ? $_POST['status'] : 'x';
// options aufbauen
while(list($key,$val) = each($cat_status_desc)){
$sel = (string)$x===(string)$key ? " selected=\"selected\"" : '';
$options.= sprintf("<option%s value=\"%s\">%s</option>", $sel, $key, $val);
}
// selector ausgeben
$selector = sprintf("<select name=\"status\">%s</select>\n", $options);
$selector.= "<input type=\"submit\" name=\"submit\" value=\"senden\">";
// formular ... zum testen (c:
echo sprintf("<form action=\"{$_SERVER['PHP_SELF']}\" method=\"post\">%s</form>", $selector);
?>
Danke ... auch ne Variante, aber brrrr ... find ich fürchterlich zu lesen![]()
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)