Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]złe przypisywanie punktów
Forum PHP.pl > Forum > Przedszkole
damian238
cześć,
mam coś takiego:
  1. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  2. INNER JOIN players on players.id=user_id ORDER BY bieg DESC LIMIT 30', null, 'fetch_all');
  3.  
  4. $points = 50;
  5. foreach($players_list['fetch'] as $player)
  6. {
  7. query('UPDATE zawody SET punkty='.$points.' WHERE id=?', array($player['conID']));
  8.  
  9. $points--;
  10. }

a gdy sb to wykonam to mi do każdego gracza przypisuje jakąś liczbę punktów z tą różnicą tylko,
że nie w kolejności od najlepszego do najgorszego, a jakoś tak chaotycznie, bez żadnej reguły
Proszę o pomoc smile.gif
timon27
Co zawiera kolumna 'bieg' po której sortujesz?
Jakiego jest typu?

Przykład:
Jeśli zawiera czas przebiegnięcia w formacie tekstowym, to może być sortowane leksykograficznie:
1,10,11,2,222,23,242,3,34...
damian238
kolumna bieg:
`bieg` decimal(4,2) NOT NULL,
Damonsson
1.
  1. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  2.  
  3. INNER JOIN players on players.id=user_id ORDER BY bieg DESC LIMIT 30', null, 'fetch_all');
  4.  
  5. echo '<pre>';
  6.  
  7. var_dump($players_list);
  8.  


1 ---> Jeśli wyświetlone są w kolejności przejdź do 1a

1----> Jeśli nie są wyświetlone w kolejności, masz błędnie skonstruowane zapytanie SQL, pokaż wynik 1.

1a

  1. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  2.  
  3. INNER JOIN players on players.id=user_id ORDER BY bieg DESC LIMIT 30', null, 'fetch_all');
  4.  
  5. $points = 50;
  6.  
  7. foreach($players_list['fetch'] as $player)
  8.  
  9. {
  10. echo 'Punktów: ' . $points . ' - Dla: ' . $player['conID'] ' użytkownika';
  11. echo '<br />'
  12.  
  13. $points--;
  14.  
  15. }


1a ----> Pokaż wynik 1a
damian238
po wpisaniu 1 wyskakuje lista graczy i pokazuje wszystkie ich dane takie jak id, login, hasło itd.
a po wpisaniu 1.a:
  1. Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in /virtual/s/k/adresstrony.pl/files/cron_bieg.php on line 25

i nic się nie zmienia nadal sad.gif

nie wiem czy coś to da, ale w tym cronie jeszcze mam na początku:
  1. include('../includes/config.php');
  2.  
  3. $roznica = 5407;
  4.  
  5. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  6. INNER JOIN players on players.id=user_id ORDER BY time ASC', null, 'fetch_all');
  7. foreach($players_list['fetch'] as $player)
  8. {
  9. $n++;
  10. $bieg = biegnij($player['skill_szybkosc'], $player['skill_technika'], $player['skill_kondycja']);
  11. query('UPDATE zawody SET bieg='.$roznica.'-'.$bieg.' WHERE id=?', array($player['conID']));
  12.  
  13. }
Damonsson
Przeczytaj jeszcze raz mój poprzedni post, jeśli przeczytasz dokładnie i nadal będziesz musiał wykonać punkt 1a, to popraw błąd, który zrobiłem. Błąd jest najprostszym możliwym błędem w języku PHP, jeśli nie będziesz w stanie go naprawić, nie masz co pisać dalej.
damian238
dobra, coraz bardziej ogarniam smile.gif
poprawiłem błąd i zrobiłem tak:
w bazie mam takie rubryki:
  1. id user_id time bieg punkty
  2. 1 5 1385480672 2458.78 50
  3. 2 6 1385480690 2518.34 49
  4. 3 7 1385480712 2488.56 48
  5. 4 8 1385480730 2726.8 47
  6. 5 9 1385480750 2518.34 46
  7. 7 4 1385816738 2607.68 45

jeśli sb zrobię punktowanie według time:
  1. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  2. INNER JOIN players on players.id=user_id
  3. ORDER BY time ASC', null, 'fetch_all');
  4.  
  5. $points = 50;
  6. foreach($players_list['fetch'] as $player)
  7. {
  8. echo 'Punktów: '.$points.' - Dla: '.$player['conID'].' użytkownika';
  9. echo '<br />' ;
  10.  
  11. $points--;}

to mam wtedy:
  1. Punktów: 50 - Dla: 1 użytkownika
  2. Punktów: 49 - Dla: 2 użytkownika
  3. Punktów: 48 - Dla: 3 użytkownika
  4. Punktów: 47 - Dla: 4 użytkownika
  5. Punktów: 46 - Dla: 5 użytkownika
  6. Punktów: 45 - Dla: 7 użytkownika


ale jak według bieg:
  1. ORDER BY bieg', null, 'fetch_all');

to wtedy mam:
  1. Punktów: 50 - Dla: 1 użytkownika
  2. Punktów: 49 - Dla: 4 użytkownika
  3. Punktów: 48 - Dla: 2 użytkownika
  4. Punktów: 47 - Dla: 5 użytkownika
  5. Punktów: 46 - Dla: 3 użytkownika
  6. Punktów: 45 - Dla: 7 użytkownika

i to się w żaden sposób nie trzyma niczego co_jest.gif
Damonsson
Czego się nie trzyma? Sortowanie jest poprawne w każdym przypadku (bieg/time), więc gdzie tkwi problem?
damian238
no bo przy takim przypadku:
  1. id user_id time bieg punkty
  2. 1 5 1385480672 2458.78 50
  3. 2 6 1385480690 2518.34 48
  4. 3 7 1385480712 2488.56 46
  5. 4 8 1385480730 2726.8 49
  6. 5 9 1385480750 2518.34 47
  7. 7 4 1385816738 2607.68 45


punktacja powinna być taka:
  1. punkty id
  2. 50 1
  3. 49 3
  4. 48 2 lub 5
  5. 47 2 lub 5
  6. 46 7
  7. 45 4


no bo np. user o id 1 ma najniższą wartość (2458.78) więc ma 50 punktów, ale np gracz o id 3 ma wartość 2488.56 więc on jest kolejny i to on powinien mieć 49 punktów, a nie gracz o id 4
Damonsson
Mój błąd, myślałem, że poprawnie posortowało.


Czyli problem jest z kolumną bieg. I już nawet widzę jaki.

Masz liczbę XXXX.XX

czyli 6 znaków łącznie, 2 znaki po kropce

Więc nie `bieg` decimal(4,2) NOT NULL,
a: `bieg` decimal(6,2) NOT NULL,


Tylko jakim cudem, zmieściłeś to w kolumnie? Powinieneś dostać błąd, albo każdy bieg powinien wynosić maksymalną wartość czyli 99.99.
damian238
poprawiłem, ale nadal coś jest źle
zacznę jeszcze raz pisać wszystko teraz po edycji
1.gdy mam:
  1. <?php
  2. include('../includes/config.php');
  3.  
  4. $roznica = 5407;
  5.  
  6. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  7. INNER JOIN players on players.id=user_id ORDER BY bieg', null, 'fetch_all');
  8. foreach($players_list['fetch'] as $player)
  9. {
  10. $n++;
  11. $bieg = biegnij($player['skill_szybkosc'], $player['skill_technika'], $player['skill_kondycja']);
  12. query('UPDATE zawody SET bieg='.$roznica.'-'.$bieg.' WHERE id=?', array($player['conID']));
  13. }
  14.  
  15. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  16. INNER JOIN players on players.id=user_id
  17. ORDER BY bieg', null, 'fetch_all');
  18.  
  19. $points = 50;
  20. foreach($players_list['fetch'] as $player)
  21. {
  22. echo 'Punktów: '.$points.' - Dla: '.$player['conID'].' użytkownika';
  23. echo '<br />' ;
  24.  
  25. $points--;}
  26. ?>

to mi się wyświetla:
  1. 0
  2. 2680.2
  3. 0
  4. 2739.76
  5. 0
  6. 2709.98
  7. 0
  8. 2739.76
  9. 0
  10. 2799.32
  11. Punktów: 50 - Dla: 1 użytkownika
  12. Punktów: 49 - Dla: 4 użytkownika
  13. Punktów: 48 - Dla: 2 użytkownika
  14. Punktów: 47 - Dla: 5 użytkownika
  15. Punktów: 46 - Dla: 3 użytkownika


2.a jak mam:
  1. <?php
  2. include('../includes/config.php');
  3.  
  4. $roznica = 5407;
  5.  
  6. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  7. INNER JOIN players on players.id=user_id ORDER BY bieg', null, 'fetch_all');
  8. foreach($players_list['fetch'] as $player)
  9. {
  10. $n++;
  11. $bieg = biegnij($player['skill_szybkosc'], $player['skill_technika'], $player['skill_kondycja']);
  12. query('UPDATE zawody SET bieg='.$roznica.'-'.$bieg.' WHERE id=?', array($player['conID']));
  13. }
  14.  
  15. $players_list = query('SELECT players.*, zawody.id as conID FROM zawody
  16. INNER JOIN players on players.id=user_id ORDER BY bieg', null, 'fetch_all');
  17.  
  18. $points = 50;
  19. foreach($players_list['fetch'] as $player)
  20. {
  21. query('UPDATE zawody SET punkty='.$points.' WHERE id=?', array($player['conID']));
  22.  
  23. $points--;
  24. ?>

to w bazie się wyświetla:
  1. id user_id time bieg punkty
  2. 1 4 1386170055 2548.12 50
  3. 2 5 1386170085 2488.56 48
  4. 3 6 1386170111 2726.80 46
  5. 4 7 1386170140 2667.24 49
  6. 5 8 1386170179 2577.90 47


jak w drugim przykładzie tego crona wykonam nawet 100 razy to w kolumnie bieg wartość zawsze się zmienia na inną, ale punkty zawsze w każdym wierszu zostają w takiej samej ilości,
i podobnie jest w pierwszym przypadku, bo również zawsze zostaje taka sama ilość punktów dla tego msamego gracza
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.