Passwortänderung mit Session
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
abfragen
anfangen
benutzer
benutzerdaten
code
dank
datenbank
datum
fehler
header
kennwort
klammern
problem
session
set
spalte
update
url
vorname
-
Hallo,
ich habe ein Problem was die Passwortänderung während einer Session betrifft.
Wenn ich das Passwort vom Benutzer ändern lassen möchte kommt zwar keine Fehlermeldung, aber das UPDATE wird nicht ausgeführt. Vielleicht mache ich da ja etwas komplett falsch.
Ich dachte, dass es vielleicht an der Session liegen könnte, finde aber keinen Ansatz zum Problem/Lösung.
Hier mein Code zur Passwortänderung:
<?php $pwd_alt=$_POST["pwd_alt"]; $pwd_neu=$_POST["pwd_neu"]; $pwd_neu_wiederholt=$_POST["pwd_neu_wiederholt"]; // Abfrage ob es leere Felder gibt if (empty($pwd_alt) or empty($pwd_neu) or empty($pwd_neu_wiederholt)) echo "Bitte tragen Sie alle Daten ein."; else { $pwd_laenge = strlen($pwd_neu); if ($pwd_laenge < 6) echo "Ihr neues Passwort ist zu kurz"; else { // Abfrage ob das neue und wiederholte Passwort überein stimmen if ($pwd_neu != $pwd_neu_wiederholt) echo "Das neue Passwort stimmt nicht ueberein."; else { // ID und verschlüsseltes Kennwort des Benutzers auslesen $sql2 = "SELECT ". "ID, Kennwort FROM ". "benutzerdaten ". "WHERE ". "(Nickname like '".$_SESSION["user_nickname"]."') AND ". "(Kennwort = '".md5 ($pwd_alt)."')"; $result = mysql_query ($sql2); while ($row = mysql_fetch_array($result)) { $ID_benutzer=$row['ID']; $pwd_vergleich =$row['Kennwort']; } // Abfrage ob altes Passwort und Eingabe des alten Passwortes überein stimmen if ((md5($pwd_alt)) != $pwd_vergleich) { echo "Ihr eingegebenes aktuelles Passwort ist inkorrekt."; } else { echo "Ihr Kennwort ist korrekt."; // Eintragen des neuen Passwortes in die Datenbank // $pwd_neu_ende = md5($pwd_neu_ende); $s_vorname = $_SESSION["user_vorname"]; $s_nachname = $_SESSION["user_nachname"]; $s_nickname = $_SESSION["user_nickname"]; $s_id = $_SESSION["user_id"]; echo $pwd_neu; echo $ID_benutzer; $sql3 = 'UPDATE benutzerdaten SET benutzerdaten.Kennwort = MD5('.$pwd_neu.') WHERE benutzerdaten.ID = '.$ID_benutzer.' '; mysql_query ($sql3); if (mysql_affected_rows ($connectionid) > 0) { echo "Das Passwort wurde erfolgreich geändert.<br>\n"; } else { echo "Fehler beim Aendern des Passwortes.<br>\n"; } } } } } ?>
Mein LoginScript sieht folgendermaßen aus:
<?php // Session starten session_start (); // Datenbankverbindung aufbauen $connectionid = mysql_connect ("localhost", "root", ""); if (!mysql_select_db ("Urlaubsplanung", $connectionid)) { die ("Keine Verbindung zur Datenbank"); } $sql = "SELECT ". "ID, Nickname, Nachname, Vorname ". "FROM ". "benutzerdaten ". "WHERE ". "(Nickname like '".$_REQUEST["name"]."') AND ". "(Kennwort = '".md5 ($_REQUEST["pwd"])."')"; $result = mysql_query ($sql); if (mysql_num_rows ($result) > 0) { // Benutzerdaten in ein Array auslesen. $data = mysql_fetch_array ($result); // Sessionvariablen erstellen und registrieren $_SESSION["user_id"] = $data["ID"]; $_SESSION["user_nickname"] = $data["Nickname"]; $_SESSION["user_nachname"] = $data["Nachname"]; $_SESSION["user_vorname"] = $data["Vorname"]; if ($_SESSION["user_nickname"] == "admin") { header ("Location: backend.php"); } else header ("Location: intern.php"); } else { header ("Location: index.php?fehler=1"); } ?>
Wäre schön wenn mir da jemand helfen könnte.
Ilana -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hiho
0.5 Was die Session damit zu tun hat, dass eine Datenbank Abfrage fehlschlägt, ergibt sich mir noch nicht so ganz. ;)
1. Ein richtig gutes, abschreckendes Beispiel, warum man bei if-else-Konstrukten immer Klammern setzen sollte.
2. Die Datenbankabfrage nach der Benutzer ID und dem Passwort kannst du dir sparen, wenn du die Daten per Session weiter reichst. Das tust du etwas weiter unten dann ja sogar auch. Du musst das alte Passwort auch nicht auslesen um dann zu vergleichen ob es mit dem eingegebenen alten Passwort übereinstimmt, da würde es auch reichen wenn du einfach die Datenbank abfragen lässt ob es die Kombination aus UserID und Passwort gibt.
3. Funktionsnamen und die dazugehörigen Klammern auseinander zu ziehen ist nicht total falsch, sieht aber doch recht gewöhnungsbedürftig aus.
4. Wenn du die Resultate der Abfragen überprüfen lässt und nach mysql_query() ein mysql_error() setzt, wirst du oder wir deinen Fehler sicherlich schneller finden. ;) -
Fällt dir in dieser Zeile was auf?
$sql3 = 'UPDATE benutzerdaten SET benutzerdaten.Kennwort = MD5('.$pwd_neu.') WHERE benutzerdaten.ID = '.$ID_benutzer.' ';
es wäre mir neu, wenn sql mit md5 etwas anfangen kann -
Ok, ich habe (hoffentlich) alle Klammern nun ordnungsgemäß gesetzt :-)
mysql_error() habe ich ergänzt. Ich habe wohl etwas falsch geschrieben, so dass er denkt, dass meine neue Passworteingabe eine Spalte ist.
Folgende Fehlermeldung wird ausgegeben:
Unknown column 'e2b764068994715ed3bc13c21ac3ad79' in 'field list'
Habe aber noch nicht herausgefunden warum er das denkt.
Danke trotzdem schon mal für die Hilfe :-) -
Ich glaube, du musst Anführungszeichen um die Werte innerhalb der SQL-Abfrage machen!
Edit:
Also einfache:
$sql3 = "UPDATE benutzerdaten SET benutzerdaten.Kennwort = 'MD5(".$pwd_neu.")' WHERE benutzerdaten.ID = '".$ID_benutzer."' ';
Beitrag zuletzt geändert: 16.2.2011 18:08:54 von biolauri -
Ja, die Anführungszeichen sind wichtig.
Außerdem würde ich dir empfehlen, deine Passwörter nicht unverschlüsselt zu übertragen.
Übertrage sie lieber als MD5-Hashes und vergleiche diese, wenn nötig, direkt mit denen aus der Datenbank.
Bei Abfragen mit Zahlen braucht man keine Klammern.
$sql3 = "UPDATE benutzerdaten SET benutzerdaten.Kennwort = 'MD5(".$pwd_neu.")' WHERE benutzerdaten.ID = ".$ID_benutzer ;
Beitrag zuletzt geändert: 16.2.2011 19:10:04 von ku-shi -
Vielen Dank für eure vielen Antworten!
Das Problem ist nun gelöst. Es lag tatsächlich an den Anführungszeichen. Jetzt funktioniert alles problemlos.
Die Passwörter übertrage ich nun auch als MD5-Hashes, was natürlich besser ist.
Danke noch mal für eure Hilfe. Das Problem hat mir viel Kopfzerbrechen bereitet -
Mir ist es ein Rätsel wieso du die Userdaten in die Session schreibst. Mach doch einfach in die User-Datenbank ein zusätzliches Feld mit der Session-ID und speichere dort die session_id() ab, dann kannste die Daten bei Gebrauch aus der Datenbank laden (SELECT aten FROM usertabelle WHERE spalte-mit-sessionid = session_id()".
-
Ich kannte mich bisher mit Sessions noch nicht aus. Das ist das erste Mal dass ich damit arbeite.
Das mit der ID abspeichern ist eine gute Idee. Ich denke das werde ich so umschreiben.
Bin ja noch am lernen :-) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage