Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Operacje na tabliacach + MySQL, Pytanie o poprawność kodu
-lukasamd-
post 23.06.2009, 11:16:03
Post #1





Goście







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.
Go to the top of the page
+Quote Post
blooregard
post 23.06.2009, 11:23:59
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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.


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
-lukasamd-
post 23.06.2009, 11:33:18
Post #3





Goście







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?

Ten post edytował lukasamd 23.06.2009, 11:34:21
Go to the top of the page
+Quote Post
trionet
post 23.06.2009, 11:59:25
Post #4





Grupa: Zarejestrowani
Postów: 12
Pomógł: 1
Dołączył: 6.08.2008
Skąd: Gostyń

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


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
Go to the top of the page
+Quote Post
-lukasamd-
post 23.06.2009, 13:13:29
Post #5





Goście







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. ?>
Go to the top of the page
+Quote Post
blooregard
post 23.06.2009, 19:41:29
Post #6


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




No i o to chodziło.


--------------------
Life's simple... You make choices and don't look back...
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: 16.07.2025 - 05:23