Problem mit Array-Abgleich

charokee

Limited Edition
ID: 289424
L
12 Juni 2006
93
3
Hallo,
ich stehe vor einem sehr seltsamen Problem. Und zwar möchte ich in einem PHP-Script den durch ein Formular gesendeten Wert für das Land (Benutzerdaten) auf einen korrekten Wert prüfen.

Nun habe ich eine Funktion die mir ein Array mit gaaaanz vielen Ländernamen generiert. Und so prüfe ich dann den übergebene Wert:

PHP:
$countries = get_countries();
$country = trim(strip_tags(stripslashes(htmlentities(substr($_POST['country'],0,120)))));

if(!in_array($country,$countries))
{
  $error = true;
  $system_message .= "<p>Ungültige Eingabe im Feld Land.</p>";
}

Und das Formularfeld:
HTML:
<select name="country">
<option value="Deutschland" selected>Deutschland</option>
<option value="">----------------------------------</option>
<option value="Ägypten">Ägypten</option>
<option value="Äquatorialguinea">Äquatorialguinea</option>
<option value="Äthiopien">Äthiopien</option>
<option value="Afghanistan">Afghanistan</option>
...
</select>

Komischerweise wird der Übegebene String jedoch als falsch gewertet, obwohl das Land im Array enthalten ist.

Ich habe die daten auch schon mit print_r() und echo geprüft.
print_r($countries); gibt das Array mit allen Ländern aus,
echo $country; gibt das Übergebene Land korrekt aus,
der Post-Key country wird auch korrekt übergeben,
das Land ist im Array aller Länder enthalten, aber es wird dennoch als falsch gewertet, bzw. nicht im Array enthalten.

Hat jemand eine Idee was da für ein Problem vorliegt?
Mir ist das echt ein Rätsel, denn auf den ersten Blick sieht alles korrekt aus.
 
Zuletzt bearbeitet:
hi,

lass mal das htmlentities weg oder bearbeite die werte in dem $countries array auch mit htmlentities.
dann klappt das schon.
 
Dein Charset ist UTF-8? Oder ein anderer Zeichensatz der Umlaute darstellen kann?

Und was soll das denn werden:
Code:
$country = trim(strip_tags(stripslashes(htmlentities(substr($_POST['country'],0,120)))));
Das
Code:
$country = trim($_POST['country']);
reicht doch völlig.

Wenn du mehr Eingabevalidierung willst, übergib keine Namen sondern Nummern in deinem Select-Feld, die du dann als Index für dein Array verwenden kannst. Überprüfung mit ctype_digit und im Array mit isset.
 
Für mich macht das schon Sinn.

Ich habe das ganze bereits ohne jegliche Validierung und Manipulation des übergebenen wertes ausprobiert, ist der gleiche Effekt.

Ich komm da einfach nicht drauf. Sie ienen komischen Fehler hatte ich noch nie. Am besten erstelle ich das ganze Script nochmal von der Pike auf neu und beginne diesmal mit der validierung des Landes alleine.
 
hast du mal geprüft, ob dein Server register_globals an hat? Wenn ja, dann steht in $country nämlich schon was drin, und irgendwie brignt PHP es nicht fertig den Wert dann Sinnvoll darein zu schreiben.

Jedenfalls hatte ich in dem Zusammenhang auch schon mehrmals Probleme.
 
Als von mir ernst gemeinte, wahrscheinlich bessere Alternative:
Gebe bei den options den Schlüssel des Länderarrays bei den Values aus! Da kannst du auch gleich viel leichter schauen, ob's das gibt und via $array[$key] ansprechen -- zum Beispiel. Numerisch wäre wahrscheinlich am schlauesten.

Edit: arg.. zu langsam. Das kommt davon, wenn man keine Lust hat den ganzen Post zu lesen. Stimme also TriloByte zu. :p
 
Ich habe das ganze bereits ohne jegliche Validierung und Manipulation des übergebenen wertes ausprobiert, ist der gleiche Effekt.

Ich komm da einfach nicht drauf. Sie ienen komischen Fehler hatte ich noch nie. Am besten erstelle ich das ganze Script nochmal von der Pike auf neu und beginne diesmal mit der validierung des Landes alleine.

Deine "Validierung" ist ja auch der oberhammer. Wenn du ein Wert mit ner Whitelist vergleichst kannst du dir den ganzen quatsch mit trim(strip_tags(stripslashes(htmlentities(substr( sparen. (htmlentities und strip_tags :ugly:)

Und schonmal von Debugging gehöhrt? Ein einfaches var_dump($country); würde vielleicht schonmal die erste Fehlerquelle ausschließen oder den fehler offensichtlich machen, danach vielleicht ein var_dump($countries)...
 
Ich glaube ihr lest mein Problem nicht wirklich. Und das finde ich den Oberhammer. :ugly:

Habe aber die Fehlerquelle gefunden, es hängt mit Smarty zusammen.

Da muss ich mir schon ernsthaft überlegen ob ich mich nicht doch gaaanz fix wieder aus der Klammunity zurückziehe. Aber den Gefallen tue ich euch dann wohl doch eher nicht. Mobben könnt ihr woanders. :evil:
 
Ich glaube ihr lest mein Problem nicht wirklich. Und das finde ich den Oberhammer. :ugly:

Habe aber die Fehlerquelle gefunden, es hängt mit Smarty zusammen.

Tut mir ja echt leid, wenn wir das nicht richtig lesen, aber vllt. liest du unsere Antworten auch nicht richtig?
Denn teilweise waren es auch Tipps, wie du einiges wesentlich verbessern kannst (wozu 5 Funktionen aufrufen, wenns net nötig ist).

Und ganz nebenbei wäre es doch nett, andere Leute zu informieren, wo der Fehler genau lag. Smarty selbst sagt ja soviel wie mein Script hat nen Fehler, PHP macht das falsch..
 
Ist schon richtig dass man es als unnötig betrachten kann so viele Funktionen aufzurufen, jedoch war das für mich der besste Weg Daten die an den Server gesendet werden zu filtern.

Tut mir Leid für meinen kleinen Ausraster.

Ich weiss noch nicht genau was für dieses Phänomen verantwortlich ist. Ich weiss nur dass Daten die aus einem statisch vorgeschriebene Option-Feld in der Select-Auswahl als falsch gewertet werden, die Daten aus der Foreach-Schleife in Template jedoch als richtig gewertet werden. Dabei wird beidesmal haargenau derselbe String übermittelt.