Trogly: SelectFeld - VALUE

Ich habe mich heute ein wenig mit SelectFelder  beschäftig.
Dabei ist mir aufgefallen, dass wenn ich dem Value die gleichen Wert
zuordne wie dem SelectFeld-Eintrag, der den annimmt (in der URL weist er den richtigen Wert auf), aber bei der Selected-Überprüfung keine Übereinstimmung gibt.

Hier die Schleife um das Selectfeld zu füllen:

for ($i=0;$i<$num_position2;$i++)
  {
  $gruppe = mysql_result($gruppe2, $i, "GRUPPE");
  $value = mysql_result($gruppe2, $i, "GRUPPE");
  if ($value == $_GET['gruppe2_select']&&$_GET['gruppe2_select']!="")
     echo "<option value=$value selected> $gruppe";
  else
    echo "<option value=$value> $gruppe";
  }

Wenn ich den Value mit Zählerwerten der Schleife füttere klappt es. Also ich meine:

for ($i=0;$i<$num_position2;$i++)
  {
  $gruppe = mysql_result($gruppe2, $i, "GRUPPE");
  $value = $i;
  if ($value == $_GET['gruppe2_select']&&$_GET['gruppe2_select']!="")
     echo "<option value=$value selected> $gruppe";
  else
    echo "<option value=$value> $gruppe";
  }

Kann mir da einer eine Erklärung zu geben? Kann das Attribut Value des SelectFeldes nicht mit Strings umgehen? Annehmen tut er den String, ausgeben auch. Aber beim Vergleich trifft keine Übereinstimmung ein. Weshalb?

  1. echo $begrüßung;

    if ($value == $_GET['gruppe2_select']&&$_GET['gruppe2_select']!="")

    Wenn die Bedingung anscheinend oder offensichtlich nicht greift, prüfe die übergebenen Werte oder auch die einzelnen Teilausdrücke. Das geht am einfachsten mit Kontrollausgaben. echo, print(), vardump() und bei Arrays auch print_r() eignen sich hierbei. Besonders var_dump() ist recht nützlich, weil dieses den Typ (wird hier beides String sein) und die Länge des Inhalts ausgibt. Möglicherweise hast du Leerzeichen in den Werten stehen ...

    Ebenfalls nützlich beim PHP-Entwickeln ist es, das error_reporting auf E_ALL zu stellen, weil damit weitere nützliche Hinweise angezeigt werden, beispielsweise Zugriffe auf nicht vorhandene Variablen.

    echo "<option value=$value selected> $gruppe";

    Attribut-Werte, die nicht nur aus einem Wort bestehen (also Whitespace enthalten) müssen in HTML einfache oder doppelte Anführungszeichen eingefasst werden.

    Desweiteren fügst du hier Werte aus der Datenbank ohne weitere Behandlung in HTML-Quelltext ein. Was ist, wenn darin HTML-eigene Zeichen vorkommen? Im schlimmsten Fall führt das zu XSS. Immer wenn du Daten in einen anderen Kontext einfügst - bei Webseiten sind das vor allem Ausgaben in Richtung HTML, SQL-Statements und URLs - solltest du diese Daten dem Kontext entsprechend behandeln. Für HTML gilt, dass die HTML-eigenen Zeichen besonders notiert werden müssen. PHP kennt dazu die Funktion htmlspecialchars(), die das übernimmt.

    echo "$verabschiedung $name";

    1. Desweiteren fügst du hier Werte aus der Datenbank ohne weitere Behandlung in HTML-Quelltext ein. Was ist, wenn darin HTML-eigene Zeichen vorkommen?

      Danke für die Hinweise.
      Dies ist aber nicht der Fall.

      Könnte es daran liegen, dass die Zeichensatz-Konvertierung verloren geht, wenn ich ein String über das GET-Protokoll verschicke?

      Wenn ich aus meiner Datenbank ein Attributwert auslese, über das GET-Protokoll an das gleiche Script schicke und es dann mit dem gleichen Datenbankeintrag vergleiche, gibt es keine Übereinstimmung.
      Der Datenbankeintrag und der String vom GET-Protokoll haben trotzdem die gleichen Zeichen.

      Wie könnte man das Problem lösen?

      1. echo $begrüßung;

        Könnte es daran liegen, dass die Zeichensatz-Konvertierung verloren geht, wenn ich ein String über das GET-Protokoll verschicke?

        Da ich immer noch nicht hellsehen kann :-) müsstest du dich mit den im ersten Teil meiner Antwort gegebenen allgemeinen Hinweisen zum Debugging beschäftigen und damit zunächst die Ursache für das Fehlverhalten ermitteln. Erst danach können Maßnahmen zur Beseitigung bewertet und umgesetzt werden. Spekulieren und Probieren ist zwar auch eine Möglichkeit, aber mit der könnte ich nicht ruhig schlafen.

        Wenn ich aus meiner Datenbank ein Attributwert auslese, über das GET-Protokoll an das gleiche Script schicke und es dann mit dem gleichen Datenbankeintrag vergleiche, gibt es keine Übereinstimmung.
        Der Datenbankeintrag und der String vom GET-Protokoll haben trotzdem die gleichen Zeichen.

        Irgend einen Unterschied muss es da geben. Wenn die Längenangabe einer var_dump()-Ausgabe ihn nicht anzeigt, könntest du schwereres Geschütz auffahren und die Bytes der Werte anzeigen lassen und vergleichen:

        echo chunk_split(bin2hex($delinquent), 2, ' ');

        echo "$verabschiedung $name";