UPDATE Funktion

Hallo Leute,

ich möchte, dass der Eingeloggte sein Username ändern kann.

Datenbankkonstruktion:

login

id | user | …
1 | Frank | …
usw.

Nun hab ich im Script
[PHP] $usernamealt = $_SESSION[„username“];
$usernameneu = $_POST[„username“];

$verbindung = mysql_connect(„localhost“, „rookie-cup“, „*********“)
or die („Fehler im System“);

mysql_select_db(„rookie-cup“)
or die („Verbindung ist schief gelaufen…“);

$abfrage = „SELECT user FROM login“;
$ergebnis = mysql_query($abfrage);

while($row = mysql_fetch_object($ergebnis))
{

if($_POST[‚submit‘] == „Ändern“){
$sql = "
UPDATE
login
SET
user = $usernameneu
WHERE
user = $usernamealt
";
echo „Username erfolgreich geändert!“;

if (mysql_query($sql)) {
}
else {
die(mysql_error());
}
}
}[/PHP]

Mein HTML

[HTML]
Aktueller Username: <?php echo $_SESSION["username"]; ?>
Neuer Username:


[/HTML]

Nun jetzt funktioniert es nicht… Liegt es an den
[PHP]UPDATE
login
SET
user = $usernameneu
WHERE
user = $usernamealt[/PHP]
???

Die beiden Variablen stimmen hab es schon ausprobiert

Danke für die Hilfe

Das ist keine Problembeschreibung! :frowning: Fehlermeldung?

Und wozu brauchst du da die Schleife???

Richtig debuggen

  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set(‚display_errors‘, true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (…not a valid MySQL result resource…): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

Keine Fehlermeldung er zeigt nichts an…

Ich hab schonmal so etwas ähnliches gehabt und hab dann einfach nur das kopiert und hier eingefügt. Die Schleife brauchte ich da halt…

Hab ich gemacht. Jetzt sagt er folgendes:
Deprecated: mysql_select_db() [function.mysql-select-db]: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /users/rookie-cup/www/Login/aendern2.php on line 100

Wenn ich das mysql_select_db(„rookie-cup“)
umändere auf mysqli_select_db(„rookie-cup“)
Sagt er mysqli_select_db() expects exactly 2 parameters, 1 given in /users/rookie-cup/www/Login/aendern2.php on line 100

Das Lesen der Doku ist nicht gesundheitsgefährdend! Siehe http://de1.php.net/manual/de/mysqli.select-db.php

Quatsch!
Ungetestet:
[PHP]if (isset($_SESSION[„username“]) && isset($_POST[„username“]))
{
$username = trim($_POST[„username“]);

if (strlen($username))
{
$link = mysqli_connect(„host“, „user“, „passwort“, „datenbankname“)
or die("MySQL-Error " . mysqli_error($link));

  $query = "Update
               `login`
             set
               `user`='" . mysqli_real_escape_string($link, $username) . "'
             where
               `user`='" . mysqli_real_escape_string($link, $_SESSION["username"]) . "'";

  mysqli_query($link,, $query)
     or die ("MySQL-Error: " . mysqli_error($link));
 
  if (mysqli_affected_rows($link))
     echo "Username erfolgreich ge&auml;ndert!";
  else
     echo "Username nicht ge&auml;ndert!";

}
else
echo „Keinen Usernamen eingegeben“;
}[/PHP]

Danke!

Jetzt hab ich Schritt 5 auch erledigt → $usernamealt und $usernameneu lassen sich richtig anzeigen.

Nun da er jetzt keine Fehler mehr anzeigt muss ich jetzt wohl Schritt 8 machen… Er ändert immer noch nicht die Tabelle :frowning: Er zeigt einfach nichts an… (bzw. zeigt er an: Kein Datenbankeintrag)

[PHP]if($_POST[‚submit‘] == „Ändern“){
$sql = "
UPDATE
login
SET
user = $usernameneu
WHERE
user = $usernamealt
";
echo „Username erfolgreich geändert!“;

if (mysql_query($sql)) {
}
else {
die(mysql_error());

}
} else {
echo „Kein Datenbankeintrag“;
}[/PHP]

Bei deinem Script zeigt er sehr viel an: NICHTS :frowning:

Ähm, ich hab’ dir eine Lösung schon geschrieben.

Und vermutlich wird das falsch sein:

if($_POST[‚submit‘] == „Ändern“)

Ok habs selber gelöst Danke dir !!!

Du solltest aber trotzdem meine Lösung nehmen, weil bei dir noch Macken drin sind.

ceddy könntest du uns einen Link zu deiner Seite geben? Ich würde dir gerne deine Datenbank kaputt machen. :smiley:
Höre besser auf bdt600, wenn er sagt das du seinen code unbedingt nehmen musst. Auch wenn der mehr Sonderzeichen enthält die dich evtl verwirren. :slight_smile:

OK, mache ich
Mit dem Username ändern geht jetzt :wink:

Jetzt probiere ich es mit dem Passwort und es geht nicht WIESO?

[PHP] $username = trim($_SESSION[„username“]);
$passwort = trim($_POST[„passwort“]);
$wdh = trim($_POST[„wdh“]);

if ($passwort != $wdh) {
echo „Die Passwörter stimmen nicht überein. zurück“;
} else {

if (isset($_POST[„passwort“]))
{
if (strlen($passwort))
{
$link = mysqli_connect(„localhost“, „rookie-cup“, „***********“, „rookie-cup“)
or die("MySQL-Error " . mysqli_error($link));

  $query = "Update
              `login`
            set
              `passwort`='" . mysqli_real_escape_string($link, $_POST["passwort"]) . "'
            where
              `user`='" . mysqli_real_escape_string($link, $username) . "'";
  mysqli_query($link, $query)
     or die ("MySQL-Error: " . mysqli_error($link));

  if (mysqli_affected_rows($link))
     echo "Passwort erfolgreich ge&auml;ndert! Ab den n&auml;chsten Login gilt das neue Passwort!";
  else
     echo "Passwort nicht ge&auml;ndert!";

}
else
echo „Keinen Passwort eingegeben“;
}
}
[/PHP]
Er gibt keine Fehler aus und sagt nur: Passwort nicht geändert… WARUM :(o_O

Ich gehe mal eben die Theorie durch, wie ich so ein System bauen würde.

In meiner Session sind User daten gespeichert die ich öfter brauche.
Z.b. die ID und der Name des Users.

Wenn ich jetzt den Benutzernamen ändern will, gebe ich dem Benutzer ein Formular welches er ausfüllt.
Das Feld für den neuen benutzernamen nenne ich einfach mal ‚new_username‘.
Wenn ein formular abgeschickt wurde kontrolliere ich zuerst ob ich gerade einen user in meiner session habe. (*)
Wenn ja, (vergessen wir mal kurz XSS sicherheitsmaßnahmen) frage ich erstmal die datenbank ob es den neuen benutzernamen schon gibt.
wenn nein, sage ich meiner datenbank das sie den benutzer eintrag mit der ID meines aktuellen benutzers updaten soll und den benutzernamen auf ‚new_username‘ ändern soll.

Wenn ich jetzt das passwort ändern will, muss mein user sein aktuelles passwort einmal angeben in meinem formular und das neue passwort 2 mal.
So wissen wir, dass es wirklich der benutzer ist und können ein kleinen wenig was gegen session hijacking unternehmen, falls es schon dazu gekommen sein sollte.
Außerdem können wir dem benutzer nun sagen, falls er einen schreibfehler gemacht hat. Wäre ja blöd, wenn der benutzer sein passwort auf ein unbekanntes ändert.
nun speichern wir das neue passwort wieder anhand der ID des benutzers in die datenbank.

Natürlich sind all unsere passwörter ungefähr so verschlüsselt.

[php]$sPassword = sha1(‚aithexi7nahGhietaip7Aitoo0eiR8ee‘ . $_POST[‚password‘] . ‚ueba6quohh3aiCae9gaeveiz1agiex3k‘);[/php]

Damit niemand etwas mit unseren hashes anfangen kann, falls er sie einmal in die finger bekommt.

PS: Wenn ein UPDATE befehl einen eintrag auf das gleiche ändern soll, was schon drin steht, sagt die affected rows funktion, dass ncihts geändert wurde. :wink: