Eurokicker
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 12.05.2008, 14:34   #1
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE

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).
Boris ist offline   Mit Zitat antworten


Alt 12.05.2008, 15:01   #2
TP-Moderator
 
Benutzerbild von Cybergreek
 
Registriert seit: Nov 2005
Ort: Köln
Cybergreek hilft, wo's gehtCybergreek hilft, wo's gehtCybergreek hilft, wo's geht
Wieso das passiert ist mir grad auch nicht so klar. Aber ein "$tocheck === $status_id" behebt Dein Problem.
__________________
Grüße vom Griechen,
Cybergreek!

WikiDict.de - Das Wiki-Wörterbuch
Cybergreek ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:05   #3
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:14   #4
TP-Moderator
 
Benutzerbild von Cybergreek
 
Registriert seit: Nov 2005
Ort: Köln
Cybergreek hilft, wo's gehtCybergreek hilft, wo's gehtCybergreek hilft, wo's geht
Zitat:
Zitat von Boris Beitrag anzeigen
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.
__________________
Grüße vom Griechen,
Cybergreek!

WikiDict.de - Das Wiki-Wörterbuch
Cybergreek ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:21   #5
TP-Specialist
 
Benutzerbild von theo
 
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
theo bringt sich richtig ein
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
theo ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:30   #6
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:34   #7
TP-Moderator
 
Benutzerbild von Cybergreek
 
Registriert seit: Nov 2005
Ort: Köln
Cybergreek hilft, wo's gehtCybergreek hilft, wo's gehtCybergreek hilft, wo's geht
Zitat:
Zitat von Boris Beitrag anzeigen
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?
__________________
Grüße vom Griechen,
Cybergreek!

WikiDict.de - Das Wiki-Wörterbuch
Cybergreek ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:38   #8
TP-Specialist
 
Benutzerbild von theo
 
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
theo bringt sich richtig ein
Zitat:
Zitat von Boris Beitrag anzeigen
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 ...
theo ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:41   #9
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:43   #10
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 12.05.2008, 15:49   #11
TP-Moderator
 
Benutzerbild von Cybergreek
 
Registriert seit: Nov 2005
Ort: Köln
Cybergreek hilft, wo's gehtCybergreek hilft, wo's gehtCybergreek hilft, wo's geht
Zitat:
Zitat von Boris Beitrag anzeigen
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?
__________________
Grüße vom Griechen,
Cybergreek!

WikiDict.de - Das Wiki-Wörterbuch
Cybergreek ist offline   Mit Zitat antworten
Alt 12.05.2008, 16:02   #12
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 12.05.2008, 16:04   #13
TP-Specialist
 
Benutzerbild von theo
 
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
theo bringt sich richtig ein
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] = '&Ouml;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);

?>
theo ist offline   Mit Zitat antworten
Alt 12.05.2008, 17:40   #14
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 12.05.2008, 18:06   #15