Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Select => Insert || Update
Forum PHP.pl > Forum > Przedszkole
Fifi209
Witam, mam w bazie trzy tabele, które akurat Nas będą interesowały:

Tabela servers:
id smallint(5) UNSIGNED auto_increment
name varchar(20) utf8_polish_ci

Tabela players:
id smallint(5) UNSIGNED auto_increment
server_id smallint(5) UNSIGNED
name varchar(50) latin2_general_ci

Tabela online:
id smallint(5) UNSIGNED
player_id smallint(5) UNSIGNED auto_increment
time bigint(20) UNSIGNED

Wszystko na silniku InnoDB

A tutaj jak są połączone:

`players`.`server_id` => `servers`.`id`

`online`.`player_id` => `players`.`id`

Z serwera pobieram graczy, którzy są aktualnie zalogowani na 3 serwerach, wyniki mam w zmiennych:
  1. $matches[1]; // serwer pierwszy
  2. $matches[2]; // serwer drugi
  3. $matches[3]; // serwer trzeci


Z MySQL wyciągam wszystkich graczy, których mam w bazie sortując po `server_id` :
  1. SELECT `name`, `server_id` FROM `players` ORDER BY `server_id`


Wyciągniętych graczy ładuję do zmiennej:
  1. $players = array();
  2.  
  3. while($data = mysql_fetch_array($select)) {
  4. $players[$data['server_id']][] = $data['name'];
  5. }


Teraz muszę sprawdzić, których graczy z jakiego serwera mam w bazie. Jeżeli mam to wrzucić do zmiennej:
  1. $update = array();

Jeżeli nie to wrzucić do innej zmiennej np. :
  1. $insert = array();


Próbowałem na różne sposoby, urywałem sobie głowę jednak bezskutecznie... Ma ktoś pomysł jakby to rozwiązać ?

Pozdrawiam.
thek
A nie można by kombinować w stronę różnicy tablic? Od tablicy z userami z serwera odejmujemy tych w naszej bazie -> Ci co zostaną lecą do inserta. A reszta oznacza już istniejących, czyli niejako od wszystkich odejmiesz tych co się insertują, ewentualnie szukasz części wspólnej. Tak czy inaczej pomocne będą zapewne array_diff i array_intersect.
Fifi209
Pozostaje kwestia różnych id serwerów... Hmm, ale pomyślę nad tym.

Szybko zmieniam zdanie, działa:
  1. $update = array();
  2. $insert = array();
  3. for ($i=1; $i < 4; $i++) {
  4. $update[$i] = array_diff($players[$i], $matches[$i][1]);
  5. $insert[$i] = array_diff($matches[$i][1], $players[$i]);
  6. }


I po sprawie winksmiley.jpg

@edit
Jednak zbyt szybko się cieszyłem, pozostaje sprawa dodawania i aktualizacji bazy. Problem polega na powiązaniach w tabelach, i teraz kompletnie głupiałem.

@edit2
Mała zmiana, usunięta tabela online, teraz w players pojawiło się nowe pole `time`

@edit3
Kolejna zmiana:
  1. $update[$i] = array_merge(array_diff($players[$i], $matches[$i][1]), $players[$i]);


I wszystko działa.
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.