Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL]moduł osiągnięcia na 30dni
phpuser88
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Załóżmy, że chce wyświetlić użytkownikowi możliwość zdobywania osiągnięć, a każde osiągnięcie ma swój własny postęp i zostanie zrealizowane gdy osiągnie swój max.postęp - o ile max.postęp zostanie osiągnięty w max.30dni od chwili zrealizowania pierwszego postępu.
Przykład:
1. Tytuł osiągnięcia: Aktywny komentator
2. Opis osiągnięcia: podejmij się napisania 15x różnorodnych komentarzy powyżej 100 znaków w ciągu 30 dni.
3. Postęp: 0 / 15

Stworzyłem sobie funkcje, która wyświetla właściwy html, ale mam zagwozdkę jak rozsądnie stworzyć bazę danych, bo każde osiągnięcie można zrealizować wciągu 30 dni od chwili zrealizowania pierwszego "postępu", a to wyklucza proste i optymalne rozwiązanie jakim jest wrzucenie wszystkiego w jedną tabele pod ID_USERA i jedynie updatowanie poszczególnych osiągnięć +1 w danym wierszu. Tutaj raczej trzeba dodać jeszcze date realizacji i ew. crona do czyszczenia, a to generalnie zrobi wielki ruch w tabeli, bo z np. 1000000 wpisów zrobi się 1000000*ilość osiągnięć*max.postęp.
Nie jestem zbyt zaawansowany więc niestety nie znam wielu fajnych rozwiązań więc zanim zrobię to tak, jak to widzę w powyższym okropnym opisie wolę zapytać czy istnieje lepszy pomysł?
Tak to widzę:
  1. #BazaSQL:
  2. id_usera | dataRealizacji | osiagniecie1 | osiagniecie2 | osiagniecie3 |
  3. 123456 | 21.01.22 | 0 | 0 | 1 |
  4. 123456 | 21.04.22 | 0 | 0 | 1 |
  5. 123456 | 28.04.22 | 0 | 0 | 1 |
  6. 123456 | 01.05.22 | 0 | 0 | 1 | //to jest ID_usera, który ma postęp 3x w Osiągnięciu3
  7.  
  8. #PHP
  9. function osiagniecia($tytul,$postep,$postepMax,$opis){...}
  10.  
  11. echo osiagniecia("tytul osiagniecia",$row['osiagniecie3 '],15,"opis osiagniecia do zrealizowania");
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
phpuser88
post
Post #2





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


może przystąpić jeszcze raz, ważne aby osiągnął komplet w 30 dni - jeżeli nie osiągnie kompletu, to kolejno każdy postęp osiągnięcia będzie wygasać po 30 dniach.

edit:
Teraz wpadłem na trochę inny pomysł,a mianowicie stworze 30 kolumn odpowiadające za każdy dzień z trzydziestu i jeśli jakieś osiągnięcie zostanie zrealizowane danego dnia, to przypisze mu unikalny identyfikator z sumą i wpakuje do bazy, a później jakoś w PHP to poskładam w całość:
Coś tego typu:
  1. #BazaSQL:
  2. id_usera | dzien1 | dzien2 | dzien3 | dzienX |
  3. 123456 | #id:2=1 | 0 | 0 | 0 |
  4. 123456 | 0 | #id:2=1#id:4=1 | 0 | 0 |
  5. 123456 | 0 | 0 | 0 | #id:2=1 |

Ale to nadal tylko gdybanie nad sensownym rozwiązaniem.

edit2:
To rozwiązanie jest niewypałem... bo jeśli user zrealizuje pierwsze osiągnięcie 30 dnia, to powinien mieć czas 30 dni na realizacje całego postępu, a tu w teorii wszystko powinno być kasowane (IMG:style_emoticons/default/dry.gif)
Czyli całość musi być oparta na datach i wychodzi na to, że pierwsze założenie jest niestety prawidłowe. (IMG:style_emoticons/default/sciana.gif)

edit3:
Chyba że dodam kolejną kolumnę z nazwą osiągnięcia i pierwszy postęp to będzie `dzien1`.
Następnie z wszystkich kolumn stworze tzw. licznik aby wiedzieć na którym dniu jest aktualnie dane osiągnięcie. Mogę to chyba zrobić za pomocą crona dodając każdego dnia +1 do `dzien2` (tj. nastepnego dnia gdzie dzienX==0) - w sensie jeśli dzień >0 i następny dzień==0, to jest to ten dzień na którym stoi całe osiągnięcie. Później w PHP odejmę 1 od każdego dnia i uzyskam prawidłową sume postępu danego osiągnięcia...
Dzięki temu zredukuje tone wpisów i liczenia o ile myślę w prawidłowy sposób haha (IMG:style_emoticons/default/co_jest.gif)
  1. #BazaSQL:
  2. id_usera | osiagniecie | dzien1 | dzien2 | dzien3 | dzienX |
  3. 123456 | 10 | 2 | 2 | 2 | 0 | //=3
  4. 123456 | 50 | 2 | 1 | 2 | 0 | //=2

Tu jest chyba taki minus, że każdy postęp osiągnięcia NIE będzie wygasać po 30 dniach, a zamiast tego wygaśnie całe osiągnięcie wraz z wszystkimi postępami, ale to raczej lepsze rozwiązanie od pierwszej metody.

Ten post edytował phpuser88 1.05.2022, 15:09:22
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 00:38