Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Jak to jest zrobione?, użytkownicy którzy odwiedzili twój profil...
kosma
post 5.09.2009, 22:39:18
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.11.2007

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


Tak się zastanawiam jak wygląda konstrukcja zapisu do bazy użytkowników którzy czytali moje artykuły, odwiedzili moją stronę lub oglądali mój profil? Dla jasności dodam, że chodzi mi o np. wykaz 100 ostatnich użytkowników którzy oglądali mój profil, jak coś takiego zrobić?
Go to the top of the page
+Quote Post
tomsi
post 6.09.2009, 04:37:36
Post #2





Grupa: Zarejestrowani
Postów: 379
Pomógł: 45
Dołączył: 30.06.2007

Ostrzeżenie: (10%)
X----


Tworzysz sobie tabelę w bazie z ID użytkownikami, do tej tabeli dodajesz np. ID artykułu, który ten użytkownik czytał. Możesz sobie wtedy dodawać datę i godzinę.
W PHP przy pomocy grupowania konkretnego ID możesz wyświetlić ile chcesz osób, które czytały dany artykuł, o której godzinie i którego dnia.
Dla profili robisz analogicznie.


--------------------
Jeśli Ci pomogłem kliknij "Pomógł"
Jeśli Ty mi pomogłeś kliknę "Pomógł"
Go to the top of the page
+Quote Post
kfc4
post 6.09.2009, 09:57:27
Post #3





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

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


Dodajesz w bazie
Cytat
co_odwiedzil|kto_odwiedzil|kiedy_odwiedzil

Przy wyświetlaniu strony uzupełniasz to. Chyba nie trzeba tłumaczyć co gdzie wpisać. Później wyciągasz te dane limitując sobie jakoś.
Go to the top of the page
+Quote Post
kosma
post 6.09.2009, 13:26:27
Post #4





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.11.2007

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


Dziękuję za odpowiedzi, miałem nadzieję że jest to możliwe bez tworzenia nowej tabeli, tj nadpisując rekord z id użytkowników, tylko głowiłem się jak ograniczyć jego "pojemność" do określonej ilości. Tzn aby nadpisując nowe, usuwało te najstarsze. Skoro trzeba utworzyć nową tabelę i w niej zapisywać użytkowników odwiedzających to teraz zastanawiam się jak skonstruować zapytanie aby wyciągało id nie dublujące się w danym dniu? Jeśli X odwiedził mnie dziś 20 razy to aby wyświetliło tylko ten ostatni i o ile skorzystać mogę z DISTINCT aby to osiągnąć to czy da się tak skonstruować zapytanie aby DISTINCT odnosiło się do jednego dnia, wyszukując tych dni np 30?
Jako że być może mało zrozumiale się wypowiadam zobrazuje na przykładzie:
- dzisiaj X odwiedził mnie 5 razy,
- wczoraj X odwiedził mnie 3 razy,
- przedwczoraj X odwiedził mnie 7 razy
- itd z co najmniej kilkoma odwiedzinami w jednym dniu
Da się za pomocą jednego zapytania wyciągnąć id użytkowników bez dublowania ich w kolejnych dniach?
Go to the top of the page
+Quote Post
Crozin
post 6.09.2009, 14:38:01
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


GROUP BY
Go to the top of the page
+Quote Post
kosma
post 7.09.2009, 17:23:36
Post #6





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.11.2007

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


Pobieram id użytkownika i datę aktualizacji rekordu:
  1. $sql=mysql_query("SELECT kto_id, kiedy FROM tabela");

Zapisuje pobrane dane do tablicy dwuwymiarowej:
  1. while ($row = mysql_fetch_array ($sql))
  2. {
  3. $kto=$row['kto_id'];
  4. $kiedy[$kto]=$row['kiedy'];
  5. }


Uzyskałem dzięki temu tablicę w której numerowi id użytkownika przypisana jest data aktualizacji rekordu i wygląda to tak:
Cytat
Array ( [441] => 2009-09-06 23:22:34 [439] => 2009-09-07 17:52:10 )


Jak teraz pobrać dane użytkownika z innej tabeli na podstawie id które zapisałem w tablicy?
I czy oby ja nie idę jakoś na około?questionmark.gif?
W wyniku chciałbym uzyskać dane użytkownika (kto_id) i datę kiedy mnie odwiedził (kiedy).
Go to the top of the page
+Quote Post
Chelo
post 7.09.2009, 21:06:28
Post #7





Grupa: Zarejestrowani
Postów: 178
Pomógł: 8
Dołączył: 19.03.2007

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


jest na przemo takowa modyfikacja, pobierz i analizuj.
Go to the top of the page
+Quote Post
kosma
post 7.09.2009, 22:25:55
Post #8





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.11.2007

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


Znalazłem tą modyfikację a w niej:
  1. $sql = "SELECT p.*, u.user_avatar_type, u.user_allowavatar, u.user_avatar FROM ".PROFILE_VIEW_TABLE." p, ".USERS_TABLE." u
  2. WHERE p.viewer_id = u.user_id
  3. AND p.user_id = ".$user_id;

jak dla mnie to...chińszczyzna, za cieńki jestem mad.gif
Z tego co widzę zapytanie jest do dwóch tabel jednocześnie i wlaśnie o to mi chodziło, a mianowicie jak wyszukać w tabeli nr 2 wedle wyniku z kryteriów wyszukiwania w tabeli nr 1?
Wcześniej znalazłem coś takiego:
  1. SELECT *, (SELECT SUM(ilosc) FROM Y WHERE Y.id_x = X.id) AS suma FROM X ORDER BY suma

i po tym zorientowałem się że da się to osiągnąć w jednym zapytaniu, tylko nie wiem jaka ma być składnia tego zapytania?

Mózg mi się zapalił laugh.gif
I wymyśliłem coś takiego:
  1. SELECT tabela1.*, tabela2.kto, kiedy FROM tabela1, tabela2 WHERE tabela2.'kryterium drugiej tabeli' AND tabela2.kto_id=tabela1.id

i zaraz zabieram się do sprawdzania jak to zadziała.

Pytanie czy da się tutaj zastosować DISTINCT aby nie wyświetlało zdublowanych użytkowników?

Ten post edytował kosma 7.09.2009, 22:52:38
Go to the top of the page
+Quote Post
CyberDuck_
post 7.09.2009, 23:34:24
Post #9





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

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


Ktos Ci tutaj podpowiadal zebys zastosowal GROUP BY, a nie
distinct ... np tak :
  1. SELECT id, artist FROM `" . TABLE_PREFIX . "tabela`GROUP BY `artist` ORDER BY `artist` ASC
Go to the top of the page
+Quote Post
kosma
post 8.09.2009, 02:05:17
Post #10





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.11.2007

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


Dzięki CyberDuck_ za nakierowanie bo choć pamiętałem o GROUP BY to zamierzałem po nie sięgnąć tj. zgłębić działanie tej dyrektywy troszkę później.
Nie mniej naprostowałeś mnie i wyszło mi teraz coś takiego:
  1. SELECT tabela1. id, login, i_co_tam_potrzeba, tabela2.odbiorca, data_nadania
  2. FROM tabela1, tabela2 WHERE tabela2.nadawca='$id' AND tabela2.odbiorca=tabela1.$id GROUP BY $id ORDER BY data_nadania

Zapytanie troszkę inaczej wygląda niż poprzednie ponieważ w międzyczasie naszła mnie myśl aby zmienić tak jak mam w tabeli pw i zmieniłem:
Cytat
kto_id => nadawca
kogo_id => odbiorca
kiedy => data_nadania

co pozwoliło mi powyższe zapytanie zastosować też do PW (wiadomości) i teraz jednym kliknięciem mam kto mnie odwiedził albo kogo ja odwiedzałem jak i też kto do mnie pisał lub też do kogo ja pisałem.
Tylko jakoś takie karkołomne to zapytanie jak na moje amatorskie oko, a co dziwne działa!!!!

Go to the top of the page
+Quote Post
CyberDuck_
post 8.09.2009, 09:22:26
Post #11





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

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


Jak rozwiazesz dane tak bedzie ...
Ja to troszke na jednej ze stron inaczej zrobilem.
Zazwyczaj do tabeli uzytkownikow dodaje sie jakis sposob
numerowania. Moze to byc ID uzytkownika.
Jesli odwiedza sie czyjs profil to jest zawsze znane
ID tego uzytkownika w skrypcie. Wystarczy dodac pole do
tabeli np 'odwiedzane' jako text i odpowiednio zorganizowac
sobie dane zapisywane. Mozna kolejne wpisy oddzielac znakiem
':' . W ten sposob kolejne zapisy beda wygladaly tak
':223:345:234783:233423:'.
Zeby sie dowiedziec kto mnie odwiedzal wystarczy zadac pytanie :
$ja = ':345:';
  1. $sql = mysql_query("SELECT login FROM uzytkownicy WHERE odwiedzane LIKE '%:345:%'");

Jesli chcesz dodac do tego date odwiedzania to tez nie ma problemu bo wystarczy
jesli rozroznisz rekordy np literka :
':223:d123234234213:345:d3345435456456:234783:d2342313223:233423:d9872983748:'.
Spojrz na zalety takiego rozwiazania. Zeby sie dowiedziec czegokolwiek
o odwiedzinach wystarczy zadac jedno pytanie. Zeby sprawdzic czy juz
byl zapis o tym ID tez nie potrzeba zadnej petli. Kompresja danych
jest dosc znaczna bo rekordy sa umieszczone w jednym polu.

Na innej ze stron zrobilem podobnie jak Ty, ale dla odwiedzin zrobilem
zupelnie osobna tabele. Jak sobie rozwiazesz tak bedziesz miec.
Ogolnie staraj sie zawsze tak konstruowac sobie dane zeby zadawac
do bazy danych pozniej jak najmniej pytan przy przegladaniu strony.
Rzadziej sie zapisuje dane do bazy danych niz odczytuje i to ma
znaczenie przy duzej ilosci odwiedzin.
Hehe na pierwszej stronie jaka pisalem to bylo okolo 21 zapytan przy
generowaniu calej strony. Z mala strona serwer sobie poradzi, ale jesli
zacznie przybywac odwiedzin zaczyna sie robic masakra. Dzisiaj
to jest na cala strone max 7 zapytan przy czym na stronach sa tabele
poczty, profili, wlasnych ustawien, odwiedzin, itd ...
Go to the top of the page
+Quote Post
kosma
post 8.09.2009, 12:53:16
Post #12





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.11.2007

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


Dziękuję CyberDuck_ za obszerną wypowiedź i wskazówki. Ja nie znam się na budowaniu stron i jak widać raczkuję w tym temacie, zapewne nie będzie to ma profesja, a jedynie hobby. Również staram się unikać zapytań jak tylko mogę i już w trakcie budowy czasem mi tych zapytań ubywa, bo i co dnia inaczej to wszystko widzę i choć mało to jednak więcej już wiem niż wiedziałem. Zastanawia mnie jednak czy oby zwiększanie wydajności w ograniczaniu zapytań ma sens, jeśli przy tym samym przybywa mi zmiennych, gdyż dane których potrzeba czerpię nie z zapytania, a z sesji w której je przechowuję. A u mnie właśnie tych zapytań ubyło odkąd nauczyłem się zapisywać zmienne w sesjach, zwłaszcza w tablicach dwuwymiarowych.
Go to the top of the page
+Quote Post
CyberDuck_
post 8.09.2009, 13:08:03
Post #13





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

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


Ma sens. Przy kazdym zapytaniu do bazy danych
jest wywolywany bardzo skomplikowany skrypt i sam
program bazy danych, a procz tego wszystko jest czytane
z dysku bo baza danych tak na prawde jest zapisywana
w postaci plikow na dysku serwera. Podobnie jest z
sesjami, albo zmiennymi. Zmienne trafiaja do pamieci, a jesli
ta juz jest zapchana to trafia to do pamieci podrecznej swap.
Przy sesjach wszystkie zmienne sa zapisywane na dysku, ale
obsluguje je sam interpreter php. Iloscia zmiennych nie musisz
sie przejmowac. Kiedys mialem starszy skrypt forum przema, a to
wyciska z serwera ostatnie poty. W tym starszym skrypcie do bazy
bylo zadawanych okolo 30 .. nawet do 40 zapytan do bazy.
Mialem wtedy spore problemy z forami na hostach, ktore odkupowalem
od innych. Dzisiaj nie ma takich problemow poniewaz to samo forum
zadaje tylko max 9 zapytan do bazy. Przy zwiekszonej ilosci
uzytkownikow mimo to spadl load na serwerze. Nie martw sie, ze sie
dopiero uczysz. Jak sobie wymyslisz skrypty i organizacje danych tak
bedziesz mial. Wazne zeby dzialalo, a sposoby rozwiazan przyjda same
z czasem. Ja tez sie nie uwazam za guru w tych sprawach, ale staram
sie cos niecos podpowiedziec.
Go to the top of the page
+Quote Post
phpion
post 8.09.2009, 13:22:44
Post #14





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(CyberDuck_ @ 8.09.2009, 10:22:26 ) *
Wystarczy dodac pole do
tabeli np 'odwiedzane' jako text i odpowiednio zorganizowac
sobie dane zapisywane. Mozna kolejne wpisy oddzielac znakiem
':' . W ten sposob kolejne zapisy beda wygladaly tak
':223:345:234783:233423:'.
Zeby sie dowiedziec kto mnie odwiedzal wystarczy zadac pytanie :
$ja = ':345:';
  1. $sql = mysql_query("SELECT login FROM uzytkownicy WHERE odwiedzane LIKE '%:345:%'");

Jesli chcesz dodac do tego date odwiedzania to tez nie ma problemu bo wystarczy
jesli rozroznisz rekordy np literka :
':223:d123234234213:345:d3345435456456:234783:d2342313223:233423:d9872983748:'.

Co za brednie! Ile ten serwis ma odwiedzin? 3 na dobę? Piszesz o "zaletach" (kwestia sporna) tego rozwiązania. Ok, super, jesteś nim podniecony. Ale poproszę o podanie listy użytkowników (loginy), który odwiedzili mój profil - już zaczniesz się ksztusić. No to dalej: ograniczamy tą listę do ostatnich 60 minut. Potem jeszcze chciałbym wykaz kto odwiedził i ile razy w przeciągu ostatnich 60 minut.

Człowieku: to co piszesz to totalna amatorszczyzna, nie masz podstaw w projektowaniu baz danych/systemów. Sugeruję zapoznanie się z pojęciem normalizacji baz danych, a także wydajności klauzuli LIKE (w szczególności z obustronnym %). Ciekaw jestem tylko, czy za wspominany serwis ktoś ci zapłacił...
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: 28.04.2024 - 14:14