Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana nicku przez usera
Forum PHP.pl > Forum > PHP
Mody23
Witam!

Mam pytanko - mam w bazie pole "username" - tam jest zapisany nick usera. Teraz tworzę sklep i chcę zrobić zmianę nicku za sms. No i w profilu usera, jeśli zmienił nick chociaż raz, chcę wyświetlić o tym informacje, np.

User X zmienił nick dnia Y na nick: Z

No i mogę dodać pole w bazie o nazwie np. "old username", "date_change_username" i będzie ok. Ale chodzi o to, że jeśli user zmieni nick np. 3 razy to to mi już wyjdzie z obiegu, bo to będzie zapisywać zmiany tylko z obecnego na nowy (i wtedy obecny wchodzi jako stary, a nowy jako nowy - wiadomo). Jak zapisać większą ilość zmian nicku? I jak uzyskać liczę, ile user razy zmienił ten nick?
wookieb
Oddzielna tabela gdzie każdy rekord opisuje zmianę nicku?
Mody23
Dobrze, ale spójrz.

Powiedzmy, że teraz mam nick Mody23 i zmieniam go na Mody.

W bazie mam pola username (obecny nick usera) i old_username (stary nick usera).

Czyli zmieniając z mody23 na mody w bazie wygląda to tak:

$row['username'] = mody
$row['old_username'] = mody23


No i teraz powiedzmy kolejny raz chcę zmienić nazwę użytkownika. To co, znów muszę tworzyć nowe pole w bazie? Jeśli user zmieni nick usera 50 razy, to ja muszę tworzyć 50 pól w bazie? Na pewno jest jakiś sposób na to i właśnie chciałbym żebyście mnie nakierowali na ten sposób.
wookieb
tabela nick_change
id, user_id, from_nick, to_nick [, created - tu data utworzenia rekordu]

Przy każdej zmianie zapisujesz kolejny rekord.
Kod
1 1 "Mody23" "Mody"
2 1 "Mody" "Mody 24"


Pobierasz wszystkie rekordy z tej tabeli i dzięki temu masz historię zmian
Mody23
Chcę się upewnić tylko.

User ma nick: Mody23 i zmienia go na Mody. Kod wygląda tak:
  1. $nowynick = $_POST['newusername'];
  2. $obecnynick = $userdata['username'];
  3.  
  4.  
  5. $sql = "UPDATE " . NAZWA_TABELI . " SET from_nick = $obecnynick WHERE user_id = 'X'";
  6. $sql2 = "UPDATE " . NAZWA_TABELI . " SET to_nick = $nowynick WHERE user_id = 'X'";

Dobrze myślę?

EDIT:

Nie, źle bo to będzie uaktualniać rekord w bazie, a ja mam utworzyć nowy rekord. Możesz mi podać jakiś przykład jak to powinno być zrobione?

EDIT2:

  1. INSERT INTO nazwa_tabeli (id, user_id, from_nick, to_nick, date) VALUES (NULL, '$userdata['user_id]', '$starynick', '$nowynick', '$date');


Tak?
wookieb
1) Zmiana z nicku mody23 na mody
  1. INSERT INTO zmiany_nick(user_id, from_nick, to_nick, created) VALUES(1, 'mody23', 'mody', now());


2) Zmiana z nicku mody na mody24
  1. INSERT INTO zmiany_nick(user_id, from_nick, to_nick, created) VALUES(1, 'mody', 'mody24', now());


Każda zmiana nicku = nowy rekord, więc dlaczego robisz UPDATE?
Mody23
Jesteś wielki. Ostatnie pytanie.
Jak ma to wyglądać z tym polem ID? Bo wiadomo, że pole ID w bazie samo sobie ustala ID, więc ja mam mieć tam wpisane NULL, tak?
I jak mogę uzyskać datę utworzenia rekordu? Tak, żeby wstawić to w INSTERT INO za pomocą zmiennej?
wookieb
W przykładzie masz użycie funkcji NOW(), która zwraca Ci aktualną datę.
Jeżeli id jest auto_increment to nie musisz go uwzględniać przy insercie.
Mody23
Ale ja w bazie mam zapisane różne inne wyniki i one są chyba inaczej zapisywane niż NOW();

Spójrz, przykładowe pole "date":

Typ pola: int(11) i zawartość: 1319311489

Jak takie coś uzyskać tutaj, w tej zmianie nicku? To jest ta funkcja NOW(); ?

To jest chyba ta metoda, co zlicza ilość sekund, które upłynęły od 1970r. tylko też nie wiem jak to się nazywa, ani jak uzyskać taki efekt?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.