Feld nach update leer
Andreas H.
- php
Auf einer Seite, wo Benutzer ihre Daten ändern können, hat sich irgendwie ein Fehler eingeschlichen. Password ist änderbar, aber wenn ich das Herkunftsland ändern will, bleibt das aktuelle Feld einfach leer. Es erscheint keinerlei Fehlermeldung.
if (!empty($_POST['chgcountry']))
{
$rsCountry = mysql_query("SELECT country FROM users WHERE userid='".$_SESSION['userid']."'") or die(mysql_error());
list ($oldcountry) = mysql_fetch_row($rsCountry);
$chgcountry = $_POST['country'];
$sql = ("UPDATE `users`
SET `country` = '".$chgcountry."'
WHERE `userid`= '".$_SESSION['userid']."'
");
mysql_query($sql) or die(mysql_error());
}
Hallo Andreas!
Welches ist denn die richtige POST-Variable?
$_POST['chgcountry']
$_POST['country']
Grüße
crille
Hallo Andreas!
Welches ist denn die richtige POST-Variable?
$_POST['chgcountry']
$_POST['country']Grüße
crille
Hey,
Ups, das war der Fehler. Jetzt klappts auch.
$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.
Dies stand beim Passwort teil welches funktionierte, daher hatte ich es mal ähnlich probiert. Aber ist klar, dass es eigentlich sinnlos ist ;)
Danke auch dedlfix. Das überflüssige umkopieren lass ich auch dann weg. Ich hatte über mysql_real_escape_string nachgedacht, aber fragte mich gerade, ob es reicht, es einfach in jede Mysql Anfrage zu schreiben? Das sollte dann ja eigentlich die Anfälligkeit auf SQL-Injections verringern.
Sprintf kenne ich nicht, daher zögere ich dort noch ein wenig ;)
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";