Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] UPDATE wielu rekordów w pętli
Forum PHP.pl > Forum > Przedszkole
jg44
Witam,
mam dwie następujące tabele: turnieje_zapisy (pola: nazwa_turnieju,zawodnik) oraz turnieje_pary (pola: nazwa_turnieju,gracz1,gracz2). Ogólnie chodzi o to, że do tabeli turnieje_zapisy zapisywane są nazwiska ludzi jedno pod drugim, którzy chcą wziąć udział w turnieju, w tabeli turnieje_pary wylosowane do gry. Dobór w pary wygląda tak, że sprawdzam, ile zapisanych jest w turnieje_zapisy, i pierwszą połowę zapisanych przenoszę do turnieje_pary (gracz1) za pomocą INSERT INTO ... . Drugą połówę chciałbym UPDATE'ować do kolumny gracz2. Problem jest w tym, że UPDATE mi źle działa, a konkretnie LIMIT - jeśli np. pętla biegnie od 8 do 4, to zamiast UPDATE'ować rekordy z kolejnymi wartościami LIMIT $i,1, on leci jak przez sito, po czym 4 razy UPDATE'uje ten sam rekord, w tym przypadku ten, który jest pod LIMIT 4,1. Tak jakby w kolejnych przebiegach pętli $i wcale nie było zmniejszane wewnątrz zapytania.

  1. $r1 = mysql_query("SELECT * FROM turnieje_zapisy WHERE nazwa_turnieju='$this->tournament'")or die(mysql_error());
  2. $count = mysql_num_rows($r1); //liczebność tabeli
  3. $interval = ceil($count/2); // wyznaczenie połowy
  4. $max = $count-1;
  5. if($count % 2 != 0) // jeśli liczba zapisanych jest nieparzysta, to dopisuję 'kreskowy' rekord, aby było parzyście
  6. {
  7. mysql_query("INSERT INTO turnieje_zapisy (nazwa_turnieju,zawodnik) VALUES ('$this->tournament','---')");
  8. }
  9.  
  10. for($i=$max; $i>=$interval; $i--)
  11. {
  12. mysql_query("UPDATE turnieje_pary SET gracz2=(SELECT zawodnik FROM turnieje_zapisy WHERE nazwa_turnieju='$this->tournament' LIMIT ".$i.",1) WHERE nazwa_turnieju='$this->tournament' LIMIT ".$i)or die(mysql_error());
  13. }

Proszę o podpowiedź
Z góry dziękuję
qrzysztof
Trzymanie jakichś "kreskowych" rekordów w bazie jest strasznie nieprofesjonalne. Te kreski powinieneś dodawać już po odczycie z bazy, na samym wyjściu za pomocą html/css.

Na końcu nie powinno być przypadkiem

  1. LIMIT ".$i.",1


?
hondek
A nie pomyślałeś o tym, żeby nie męczyć mysqla tym wszystkim, sparować ludzi w php i insertować juz gotowe rekordy? smile.gif
jg44
qrzysztof, po pierwsze jeśli będzie nieparzysta liczba, to ktoś nie będzie miał pary do gry i zazwyczaj na turniejach tenisowych daje mu się 'dziką kartę' i jego nieistniejącego 'wirtualnego' rywala właśnie się kreskuje. Ok, jak skrypt będzie działał, to zrobię jak mówisz.
Po drugie, na końcu nie powinno być $i.",1, bo to jest polecenie UPDATE. A w tym poleceniu nie można używać LIMIT z dwoma parametrami, bo będzie błąd składni.
http://dev.mysql.com/doc/refman/5.0/en/update.html

hondek, właśnie nie bardzo mam pomysł, jak taką funkcję napisać. wink.gif bezpośrednio w bazie jest teoretycznie łatwiej.
hondek
przeciez spokojnie możesz wykorzystań arraye np.

tworzysz arraya:
  1. $players = array();


pobierasz sobie pierwszą połowę zawodników do $mysql_players, a do $others_players resztę i przepisujesz do tablicy wyniki:

  1. $i = 0;
  2. foreach( $mysql_players as $player ) {
  3. $players[$i] = array();
  4. $players[$i]['first_player'] = $player['name'];
  5. $players[$i]['second_player'] = jakis_rand_z_arraya_plus_usuniecie_rekordy_z_tablicy( $others_players );
  6. $i++;
  7. }
jg44
Faktycznie, niezły pomysł wink.gif
dzięki smile.gif
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.