Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Moin Leute...

Ich hab da (mal wieder) ein PHP-Problem...

Also, ich hab eine User-Verwaltung, die auf MySQL basiert. Dort werden Benutzername, E-Mail, Passwort und einige andere Dinge gespeichert!

Jetzt soll man z.B. das Passwort ändern können. Beim Login wird der Benutzername in eine Session geschrieben. Diesen Namen will ich daher in eine Variable speichern und über diese Variable in der Datenbank den Datensatz heraussuchen, der dem angemeldeten Benutzer entspricht, um dort sein Passwort zu ändern...

Das ganze funktioniert aber nicht, da kein passender Datensatz gefunden wird (obwohl er existiert)!

Mit einem konstanten Wert, der dem Benutzernamen entspricht, funktioniert's, und es klappt auch, wenn ich der Variable anstatt des Session-Wertes den Benutzernamen als Text selbst übergebe...

So langsam verzweifle ich, weiß echt nicht weiter!

Kann es sein, daß MySQL es nicht mag, wenn man eine Variable benutzt, die wiederum den Inhalt einer anderen Variable enthält?

Bin für jeden Tip dankbar - vielleicht weiß ja auch jemand ne andere Idee, wie ich das Vorhaben umsetzen kann...

Geschrieben

Also wenn ich das richtig verstanden habe brauchst Du ja nur ein Login-Modul zu schreiben + ein Modul zur Passwortänderung.

In diesem Fall würde ich ein Login-Formular erstellen und dort Benutzername/Passwort abfragen, diese Daten (Passwort MD5-verschlüsselt) mit einem Eintrag in der Datenbank vergleichen => falls der Login korrekt ist in eine Tabelle die Session-ID hineinschreiben und die User-ID (von der User-Tabelle) ... dass sollte problemlos funktionieren :o)

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von m0rpheus:

<STRONG>Also wenn ich das richtig verstanden habe brauchst Du ja nur ein Login-Modul zu schreiben + ein Modul zur Passwortänderung.

In diesem Fall würde ich ein Login-Formular erstellen und dort Benutzername/Passwort abfragen, diese Daten (Passwort MD5-verschlüsselt) mit einem Eintrag in der Datenbank vergleichen => falls der Login korrekt ist in eine Tabelle die Session-ID hineinschreiben und die User-ID (von der User-Tabelle) ... dass sollte problemlos funktionieren :o)</STRONG>

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von beetFreeQ:

<STRONG>

Mit ner User-ID anstatt des Usernamen hab ich's noch nicht probiert... - allerdings hat bisher kein Wert funktioniert, den ich verwenden wollte...

Wieso soll die Session-ID denn in eine Tabelle geschrieben werden? Verstehe ich jetzt nicht so ganz... Ich dachte da eher, ich schreib die User-ID in die Session, aber das wäre ja wieder das selbe, wie der Username - nur halt ein Integer statt eines Strings...</STRONG>

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von m0rpheus:

<STRONG>

Also ich meinte eine User-ID zusätzlich ... nicht anstatt dem Usernamen. Diese User-ID mit auto_increment, ... dann schreibst Du die User-ID und die Session-ID in eine neue Tabelle z. B. user_online ... beim ausloggen löschst Du diesen Eintrag einfach wieder :o)

Nun alles verstanden?</STRONG>

Geschrieben

Biddeschön:

CREATE TABLE user (

   ID int(11) NOT NULL auto_increment,

   name varchar(20) NOT NULL,

   passwort varchar(20) NOT NULL,

   email varchar(30) NOT NULL,

   angemeldet datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,

   logins int(11) DEFAULT '0' NOT NULL,

   lastlogin datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,

   class varchar(10) NOT NULL,

   PRIMARY KEY (ID)

);
Die Felder haben folgende Funktionen: User-ID (Primary Key) Name (der Benutzername) Passwort (das Passwort in verschlüsselter Form) email (E-Mail-Adresse) angemeldet (Datum und Uhrzeit der Anmeldung) logins (Anzahl bisheriger Logins) lastlogin (Datum und Uhrzeit des letzten Logins) class (Art des Benutzers zur Definition der Benutzerrechte, wie User, Admin etc.) Hier einmal der Quelltext einer der betroffenen PHP-Dateien:
<?php


 // variablen definieren

 $titel = "main - account - e-mail ändern";


 $baum[1] = "<a href=\"m_start.php\">start</a>";

 $baum[2] = "<a href=\"c_account.php\">account</a>";

 $baum[3] = "e-mail ändern";


 $ok = "";


 $email = $HTTP_POST_VARS["email"];

 $name = $HTTP_SESSION_VARS["name"];


 /* wenn $email nicht leer ist, wurde das formular bereits gesendet und kann bearbeitet werden. ist die variable leer, wird zum else gesprungen. */

 if($email != "")

 {


   // mysql-verbindung herstellen und user ueberpruefen

   $sql = "SELECT * FROM user WHERE name='$name'";


   include ("../config/mysql_conn.php");


   mysql_select_db($dbname,$conn);


   $ergebnis = mysql_query($sql,$conn);

   $user = mysql_fetch_array($ergebnis);


   // ist der user richtig, wir die neue e-mail in die db eingetragen

   if($user[name] != "")

   {

     $sql2 = "UPDATE user SET email='$email' WHERE name LIKE '$user[name]' AND passwort=PASSWORD('$passwort')";

	 mysql_query($sql2,$conn);

     mysql_close();

	 $ok = "ja";

   }

   else

     $meldung = "<p class=\"b\">du bist nicht angemeldet! melde dich erst an und ändere dann deine e-mail-adresse!</p>";


 }


 include ("includes/mainhead.php");


?>


<h2>e-mail ändern</h2>

<?php if($ok == "ja"): ?>


<p>änderung war erfolgreich!</p>


<p><a href="c_account.php">account</a></p>


<?php

 else:

   echo $meldung;

?>


<p>wenn sich deine e-mail-adresse geändert hat, kannst du sie hier für deinen freeQnet-account eintragen.</p>


<form method="post">

<table border="0" cellpadding="0" cellspacing="10">

  <tr>

	<td>

	  email:<br>

	  <input type="text" name="email" size="10" maxlength="30">  <input class="button" type="submit" value="ändern">

	</td>

  </tr>

</table>

</form>


<?php


 echo "<a href=\"$url\">zurück</a>";


 endif;


 include ("includes/mainfoot.php");


?>

Hier wird ein Formular ausgefüllt, und an sich selbst geschickt. Am Anfang steht eine Überprüfung, ob die Formular-Variable einen Inhalt hat, ist das der Fall, dann wird das Script ausgeführt, andernfalls wird erstmal das Formular angezeigt. Um zu prüfen, ob die Änderungen erfolgreich waren, wird die Variable $ok am Anfang leer erzeugt und nur dann auf "ja" gesetzt, wenn der Datenbankeintrag erledigt ist. In dem Fall wird eine Bestätigung eingeblendet, in allen anderen Fällen erscheint das Formular und ggf. eine Fehlermeldung ($meldung).

Hoffe, das hilft irgendwie.

Werte aus einem Formular verarbeitet die Tabelle übrigens auch problemlos, nur eben die Werte aus der Session nicht. Dabei sehe ich eigentlich keinen wesentlichen Unterschied zwischen HTTP_POST_VARS und HTTP_SESSION_VARS...

Zur Not würde ich in diesem Formular auch zusätzlich Benutzername und Passwort abfragen, um die Session zu umgehen, aber das wäre ja irgendwie nicht grad der Sinn einer Session... ;)

Geschrieben

Also ich würde einfach ne selbstgenerierte Session-ID an die Links und an den Post dranhängen... dass kannst Du ja problemlos machen.

Zur Erzeugung einer Session-ID kannst Du ja

md5 (uniqid (rand())) benutzen ... also z. B.

$sid = md5 (uniqid (rand()));

Dann hängst Du $sid an Deine Formular-Post-URL bzw. an "normale" Links einfach dran. In den Scripts suchst Du nach der Session-ID in dem User-table der Datenbank ... dann kannst Du problemlos alles auslesen :o) - Falls die Session-ID nicht in der Datenbank vorhanden ist leitest Du den User einfach auf eine Login-Seite weiter :o)

Bei der Logout-Funktion die generierte Session-ID aus der Datenbank entfernen... :o)

Geschrieben

Danke für deine ganzen Tips! Aber das Problem hat sich glücklicherweise grad gelöst! Der Teufel steckte mal wieder in einem wichtigen aber kleinen Detail, das bei meinem geposteten Quelltext garnicht so klar wurde:

Ich hab die Session nämlich in der Datei "mainhead.php" initialisiert. Dummerweise wird diese Datei aber erst nach dem Datenbank-Zugriff includiert. Klar, daß es da noch keine Session-Variable geben kann...

Trotzdem nochmal danke, aber ich glaub, ich bleib erstmal bei meiner doch etwas einfacheren Lösung...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...