 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
12.05.2008, 14:34
|
#1
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
PHP: Dynamische Vorauswahl klappt und klappt nicht?
Zu meinem Problem - ich habe diesen folgenden Codeschnipsel:
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>';
Sprich ich definiere ein Array mit diversen Werten und lasse daraus mit foreach() ein SELECT erstellen. Soweit, so gut.
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.
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
Geändert von Boris (12.05.2008 um 15:06 Uhr).
|
|
|
12.05.2008, 15:01
|
#2
|
|
TP-Moderator
Registriert seit: Nov 2005
Ort: Köln
|
Wieso das passiert ist mir grad auch nicht so klar. Aber ein "$tocheck === $status_id" behebt Dein Problem.
|
|
|
12.05.2008, 15:05
|
#3
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
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
|
|
|
12.05.2008, 15:14
|
#4
|
|
TP-Moderator
Registriert seit: Nov 2005
Ort: Köln
|
Zitat:
Zitat von Boris
Nein, tut es eben nicht. Wenn ich den === Operator nehme, wird zwar "Alle" (x) korrekt markiert, dann aber 0, 1 und 2 nicht mehr.
|
Also dieser Code:
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;
?>
erzeugt folgenden Quelltext:
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>
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.
|
|
|
12.05.2008, 15:21
|
#5
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
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);
?>
was spricht gegen eine solche loesung?
Geändert von theo (12.05.2008 um 15:22 Uhr).
Grund: sorry ... kleiner fehler drin
|
|
|
12.05.2008, 15:30
|
#6
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
Zitat:
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.
|
Das weiß ich ja auch, nur geht selbst auch das nicht. Das ist es ja eben, was ich nicht verstehe.
Zitat:
|
was spricht gegen eine solche loesung?
|
Weil ich die 0 für "Intern" brauche? 
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
|
|
|
12.05.2008, 15:34
|
#7
|
|
TP-Moderator
Registriert seit: Nov 2005
Ort: Köln
|
Zitat:
Zitat von Boris
Das weiß ich ja auch, nur geht selbst auch das nicht. Das ist es ja eben, was ich nicht verstehe.
|
Was geht denn an dem Beispiel (php -> html) von mir oben genau nicht?
|
|
|
12.05.2008, 15:38
|
#8
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
Zitat:
Zitat von Boris
Weil ich die 0 für "Intern" brauche? 
|
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 ...
|
|
|
12.05.2008, 15:41
|
#9
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
Zitat:
|
Was geht denn an dem Beispiel (php -> html) von mir oben genau nicht?
|
Wenn ich mit deinem Code als Vorauswahl 2 nehme, funktioniert es soweit. Wenn ich aber das Formular dann abschicke, wird nichts mehr ausgewählt.
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
|
|
|
12.05.2008, 15:43
|
#10
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
Zitat:
|
das sollte alle probleme loesen
|
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. 
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
|
|
|
12.05.2008, 15:49
|
#11
|
|
TP-Moderator
Registriert seit: Nov 2005
Ort: Köln
|
Zitat:
Zitat von Boris
Wenn ich mit deinem Code als Vorauswahl 2 nehme, funktioniert es soweit. Wenn ich aber das Formular dann abschicke, wird nichts mehr ausgewählt.
Nehm ich als Vorauswahl das X, wird auch nichts ausgewählt.
Das ändert auch nichts, wenn ich die Zahlentypen explizit mit (int) vorgebe.
|
Ich glaub, die Sonne ist zu stark und ich verstehe das Problem deswegen nicht
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;
?>
Gibt es damit immernoch ein Problem?
|
|
|
12.05.2008, 16:02
|
#12
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
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
|
|
|
12.05.2008, 16:04
|
#13
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
ok ... fuer deinen wissensdurst noch eine loesung von mir 
PHP-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);
?>
|
|
|
12.05.2008, 17:40
|
#14
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
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
|
|
|
12.05.2008, 18:06
|
#15
|
|
| | |