echo $begrüßung;
Auf einer Seite, wo Benutzer ihre Daten ändern können, hat sich irgendwie ein Fehler eingeschlichen.
Wie hat er denn das gemacht? Hast du mal Wunsch und Wirklichkeit mittels Kontrollausgaben miteinander verglichen?
Password ist änderbar, aber wenn ich das Herkunftsland ändern will, bleibt das aktuelle Feld einfach leer. Es erscheint keinerlei Fehlermeldung.
Die Ursache ist aus dem Code nicht zu erkennen. Betreibe Debugging mittels Kontrollausgaben! var_dump() eignet sich am besten dafür. Ein vorangestelltes <pre> erhöht die Übersichtlichkeit bei der Ausgabe komplexer Strukturen.
Zu erkennen sind aber übliche Fehler und Nachlässigkeiten, die im Normalfall den Programmablauf nicht stören.
$rsCountry = mysql_query("SELECT country FROM users WHERE userid='".$_SESSION['userid']."'") or die(mysql_error());
Ein die() ist meist keine angemessene Fehlerbehandlung und der Text von mysql_error() (und die damit preisgegebenen Interna) ist nicht für den Anwender bestimmt, hat also in einer Ausgabe an ihn nichts zu suchen.
list ($oldcountry) = mysql_fetch_row($rsCountry);
mysql_fetch_row() liefert hier bei leerer Ergebnismenge ein false und list() erzeugt daraus ohne was zu sagen null.
Warum hast du überhaupt diesen Teil hier angeführt? Außer dem Erzeugen einer Variablen, die im weiteren Verlauf des hier angeführten Codes nicht zur Anwendung kommt, passiert da nichts.
$chgcountry = $_POST['country'];
Überflüssiges Umkopieren in eine neue Variable gepaart mit einer nicht vorhandenen Prüfung auf Existenz des Wertes. Das error_reporting auf E_ALL (und display_errors auf on) zu stellen, ergäbe übrigens beim Zuriff auf nicht vorhandenes eine Meldung, was ein Indiz für einen Fehler oder eine unterlassene Prüfung ist. Diese Meldung ist ebenfalls nur für den Administrator und nicht für Besucheraugen bestimmt.
$sql = ("UPDATE
users
SETcountry
= '".$chgcountry."'
Vergessene kontextgerechte Behandlung beim Einfügen in das SQL-Statement. mysql_real_escape_string() auf $_POST['country'] angewendet beseitigt diese Sicherheitslücke. Ebenso in der nachfolgenden Zeile.
WHERE
userid
= '".$_SESSION['userid']."'
");
Der Code ist ja recht übersichtlich notiert. Noch feiner wird er durch die Verwendung von sprintf(), was das String-Rein-Raus beim Einfügen der variablen Teile beseitigt.
$sql = sprintf("UPDATE users
SET country
= '%s' WHERE userid
= '%s'"
mysql_real_escape_string($_POST['country']),
mysql_real_escape_string($_SESSION['userid']));
Und am feinsten wird das ganze durch den Einsatz von mysqli und Prepared Statements.
echo "$verabschiedung $name";