Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operacje na tabliacach + MySQL
Forum PHP.pl > Forum > PHP
lukasamd
Witam,
mam kod, który spełnia swoje zadanie, jednak nie jestem pewien, czy oby na pewno jest do końca poprawny i optymalny.

W bazie danych w tabeli z użytkownikami mam tekstowe pole user_ulubione, zawierające informacje o ulubionych grach użytkownika (id łączone kropką np. 1.5.21.32). Operacja kodu sprowadza się do usunięcia jednej z gry, dla testu przyjąłem id usera 1 i id gry 1.

Najpierw pobieram wartości z bazy, następnie tworzę z nich tablicę dzieląc wartości znakiem kropki.
Później szukam w tabeli określonej wartości (id gry), w wyniku otrzymuję klucz.
Usuwam z tabeli wartość o podanym kluczu.
Sortuję tablicę wg. wartości.
Tworzę zmienną typu string, do której wrzucam pierwszy element tablicy a zarazem usuwam go z niej.
W pętli while doklejam do zmiennej pozostałe wartości i znaki kropek je oddzielające.
Uaktualniam pole w bazie danych.


  1. <?php
  2. $user_id = 1;
  3.  $gra_id = 1;
  4.  
  5.  $ulubione = mysql_fetch_array(mysql_query("SELECT user_ulubione FROM ".DB_USERS." WHERE user_id = '".$user_id."'"));
  6.  $ulubione = explode('.' , $ulubione['user_ulubione']);
  7.  
  8.  $id = array_search($gra_id, $ulubione);
  9.  unset($ulubione[$id]);
  10.  asort($ulubione);
  11.  
  12.  $nowa = array_shift($ulubione);
  13.  while($krok = array_shift($ulubione)) {
  14.    $nowa .= '.'.$krok;
  15.  }
  16.  
  17.  mysql_query("UPDATE ".DB_USERS." SET user_ulubione = '".$nowa."' WHERE user_id = '".$user_id."'");
  18. ?>



Czy dobrze to zrobiłem, czy da się lepiej? Zależy mi na wydajności, sposób zapisywania informacji o ulubionych w bazie musi pozostać taki jaki jest.
blooregard
Ja bym to rozdzielił: tabela 'Ulubione', 'User' oraz 'Ulubione_to_user', gdzie jeden rekord to relacja ulubiona->user

Rozwiązania z wieloma wartościami w jednym polu, rozdzielane kropeczkami, czy też innym znaczkami, są fajne i proste do czasu, gdy nie trzeba z tymi danymi zrobić czegos bardziej skomplikowanego. Albo jak tych ulubionych będzie kilkaset.
lukasamd
Tyle raczej nie będzie, max. 100?
Oprócz dodawania / usuwania i wyświetlania w profilu usera na bank nic więcej nie będzie robione z ulubionymi.

Gdy rozdzielę, to przy usuwaniu i dodawaniu wykonuję tylko 1 zapytanie i nic poza tym, więc wydaje się ok.
Z drugiej strony, przy sprawdzaniu czy gra znajduje się w ulubionych muszę wykonać 1 zapytanie więcej. Przy wyświetlaniu ulubionych również (dane z tabeli użytkowników i tak są pobierane, więc gdy te informacje są w niej, można to pominąć).

Tak więc pytanie: więcej zapytań czy więcej pracy po stronie PHP?
trionet
Ja bym wybrał więcej zapytań. Podział na kilka tabel może zaowocować w przyszłości smile.gif Poza tym zapytanie może być nadal jedno - wystarczy połączyć tabele join-em w zapytaniu smile.gif
lukasamd
W sumie już zauważyłem, że mogę dodać np. datę kiedy gra została dodana do ulubionych, wtedy tylko jako osobna tabela.
Dodałem więc tabelę ulubione i w niej (póki co) 3 pola:

- ulubione_user (indeks)
- ulubione_gra (indeks)
- ulubione_czas

Operacja zarówno dodania lub usunięcia gry z ulubionych ogranicza się do:

  1. <?php
  2. mysql_query("DELETE FROM ".DB_ULUBIONE." WHERE ulubione_user = '".$user_id."' AND ulubione_gra = '".$gra_id."'");
  3. ?>


lub
  1. <?php
  2. $czas = time();
  3. mysql_query("INSERT INTO ".DB_ULUBIONE." VALUES ('".$user_id."', '".$gra_id."', '".$czas."')");
  4. ?>
blooregard
No i o to chodziło.
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.