Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] UPDATE wielu rekordów w pętli
jg44
post 28.11.2011, 17:03:48
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

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


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ę
Go to the top of the page
+Quote Post
qrzysztof
post 28.11.2011, 17:34:20
Post #2





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


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


?

Ten post edytował qrzysztof 28.11.2011, 17:51:28


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
hondek
post 28.11.2011, 18:12:22
Post #3





Grupa: Zarejestrowani
Postów: 355
Pomógł: 50
Dołączył: 20.08.2007
Skąd: Częstochowa

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


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


--------------------
przetwornik yt na czasie :)
Go to the top of the page
+Quote Post
jg44
post 28.11.2011, 18:22:01
Post #4





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

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


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.

Ten post edytował jg44 28.11.2011, 18:24:16
Go to the top of the page
+Quote Post
hondek
post 28.11.2011, 18:31:08
Post #5





Grupa: Zarejestrowani
Postów: 355
Pomógł: 50
Dołączył: 20.08.2007
Skąd: Częstochowa

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


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. }


--------------------
przetwornik yt na czasie :)
Go to the top of the page
+Quote Post
jg44
post 28.11.2011, 18:36:47
Post #6





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

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


Faktycznie, niezły pomysł wink.gif
dzięki smile.gif
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 10:33