Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP]Porównanie ilości punktów z rangą
Forum PHP.pl > Forum > Przedszkole
Asig
Witam.

Mam tego typu problem, że Nie mam pomysłu/nie wiem jak zrobić porównanie ilości punktów użytkownika z Rangą którą będzie miał od tylu punktów.

Użytkownik ma jakąś tam liczbę punktów, np. 30.

W bazie danych mam kolumny "tytul", "punkty".

I przykładowe rekordy:

Początkujący 10
Bywalec 20
Zaawansowany 40
Mistrz 60

I nie wiem jak zrobić, aby ten użytkownik miał tytuł "Bywalec" a nie np. Początkujący.

W jaki sposób tego dokonać?
Pozdrawiam!
ZaXaZ
  1. $zmienna['punkty'] = 23;
  2.  
  3. $title='Nowy';
  4. if ($zmienna['punkty']>=10) $title='Początkujący';
  5. if ($zmienna['punkty']>=20) $title='Bywalec';
  6. if ($zmienna['punkty']>=40) $title='Zaawansowany';
  7. if ($zmienna['punkty']>=60) $title='Mistrz';
  8.  
  9. echo 'Ranga = '.$title;


mysle ze tak najlatwiej, nie wiem jak z optymalnoscia.

edit: skasowalem if na 0-9 punktow
Asig
Cytat(ZaXaZ @ 13.08.2014, 19:48:34 ) *
  1. $zmienna['punkty'] = 23;
  2.  
  3. $title='Nowy';
  4. if ($zmienna['punkty']>=10) $title='Początkujący';
  5. if ($zmienna['punkty']>=20) $title='Bywalec';
  6. if ($zmienna['punkty']>=40) $title='Zaawansowany';
  7. if ($zmienna['punkty']>=60) $title='Mistrz';
  8.  
  9. echo 'Ranga = '.$title;


mysle ze tak najlatwiej, nie wiem jak z optymalnoscia.

edit: skasowalem if na 0-9 punktow


W ten sposób naturalnie wiem, ale mi chodzi o jakiś jeden warunek który będzie wybierał rangę na podstawie ilości punktów, że dodaję nową rangę do bazy i to od razu działa, a nie modyfikować za każdym razem kod PHP gdy jest nowa ranga.
golabow
tak na szybko.

  1. <?php
  2. function getTableRangi() {
  3. $db = connectDB(); // laczenie z baza danych, uzyj wlasnej funckcji
  4. $q = $db->query( 'SELECT * FROM rangi' );
  5. $arr = array(); // tablica bedzie zawierac wszystkie rangi
  6. while ( $row = $q->fetch_assoc() ) {
  7. $arr[ $row['tytul'] ] = $row['punkty'] ;
  8. }
  9.  
  10. return $arr;
  11. }
  12.  
  13. function getRanga( $ilePunktow, $rangi ) {
  14. $ranga = null;
  15. foreach( $rangi as $k => $v ) {
  16. if ( $ilePunktow >= $v ) $ranga = $k;
  17. else break;
  18. }
  19.  
  20. return ( $ranga ) ? $ranga : 'brak rangi';
  21. }
  22.  
  23. $arr = getTableRangi(); // pobieram rangi
  24. $ranga = getRanga( 30, $arr ); // moge pobrac range dla dowolnego uzytkownika
  25. ?>


edit: testowalem powinno dzialac, tablice z rangami generuj na początku skryptu, następnie możesz dla każdego użytkownika pobierać range, podając
jego ilość punktów i tablice z rangami.
Michael2318
Skoro w bazie masz te wszystkie rangi i ich punkty zapisane to najlepiej pobierać z bazy te rangi i analizować z tym co posiada user:

  1. $punkty_usera = 15; // liczba punktów usera
  2.  
  3. $sql = "SELECT * FROM `tabela_z_rangami`";
  4. if ( !($result = mysql_query($sql)) )
  5. {
  6. die('error<br>'.mysql_error());
  7. }
  8.  
  9. $rangi_txt = array();
  10. $rangi_int = array();
  11. while($row = mysql_fetch_assoc($result))
  12. {
  13. $rangi_txt[] = $row['tytul'];
  14. $rangi_int[] = $row['punkty'];
  15. }
  16.  
  17. for($i=0; $i=(count($rangi_txt)-1); $i++)
  18. {
  19. if ( $i !== (count($rangi_txt)-1) ) // jeśli obecny rekord nie jest ostatnim przelatywanym przez pętlę...
  20. {
  21. if ( $rangi_int[$i] <= $punkty_usera && $rangi_int[($i+1)] >= $punkty_usera )
  22. {
  23. $ranga_usera = $rangi_txt[$i];
  24.  
  25. break; // stopujemy pętlę
  26. }
  27. }
  28. else
  29. {
  30. $ranga_usera = $rangi_txt[$i]; // przypisujemy z automatu najwyższą możliwą rangę, bo user ma więcej punktów niż określono w bazie
  31. }
  32. }


Zapytanie z bazy najlepiej cachować bo przypuszczam, że nie będziesz co chwilę dodawał nowych rang. Przy dodawaniu nowych rang trzeba by wyczyścić cache, jeśli będziesz je dodawał z poziomu strony (np. panel admina) to żaden problem dodać mechanizm czyszczący cache.
Asig
Cytat
Michael2318


Przeanalizowałem twój kod i napisałem go bardziej po swojemu:
  1. $tytuly_query = mysql_query("SELECT * FROM users_title");
  2.  
  3. while($tytuly_row = mysql_fetch_assoc($tytuly_query)) {
  4. $tytul_nazwa[] = $tytuly_row['nazwa'];
  5. $tytul_posty[] = $tytuly_row['posty'];
  6. }
  7.  
  8. for($i=0; $i<=count($tytul_nazwa); $i++) {
  9. if($i !== (count($tytul_nazwa)-1)) {
  10. if($tytul_posty[$i] <= $autor_posta['posty'] AND $tytul_posty[($i+1)] >= $autor_posta['posty']) {
  11. $tytul = $tytul_nazwa[$i];
  12. break;
  13. }
  14. } else {
  15. $tytul = $tytul_nazwa[$i];
  16. }
  17. }


Wszystko działa prawie OK.
Jest tylko jedna mała wada...

Gdy jakiś rekord jest nie po kolei w bazie, np. tak:

Nowy 0
Początkujący 10
test 20
super 15

To kod omija ostatni rekord który ma mniejszą liczbę niż poprzedni.

Jest też może na to rada?

Pozdrawiam.

------------------------
@EDIT:
Bardzo prosta sprawa, dziwię się, że od razu na to nie wpadłem.
Wystarczy po prostu zapytanie posortować według liczby punktów/postów, czyli "ORDER BY posty ASC" i sprawa załatwiona.
Dzięki wielkie za pomoc wink.gif
Pozdrawiam.
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.