Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/SQL] Powiadomienia jak na facebooku
Forum PHP.pl > Forum > PHP
MTF
Umieściłem już tutaj na forum podobny temat w dziale MySQL ( Temat: PHP SQL Powiadomienia jak na facebooku )
Jednak z nikąd pomocy..

Postanowiłem zapytanie poprostu zgrupować i w PHP jakoś to obsłużyć..
Pytanie: jak?

  1. $powiadomienia_engine = mysql_query("SELECT * FROM powiadomienia WHERE do_usera = '".$user_info['id']."' GROUP BY what,type ORDER BY id DESC LIMIT 25");
  2.  
  3. if (mysql_num_rows($powiadomienia_engine) == 0 ) {
  4.  
  5. echo '<div class="nothing_here" style="margin-top: 220px;">Brak powiadomień ;)</div>';
  6.  
  7. } else {
  8.  
  9. while ($powiadomienie = mysql_fetch_array($powiadomienia_engine)) {
  10. //dalsza część kodu


mam zbite powiadomienia i nie wiem za bardzo jak je obsłużyć? Dodać do SQL 'COUNT' i dla każdego osobno wywołać kolejne "query" i na jego podstawie budować powiadomienie?

Chce powiedzieć że chce uzyskać coś takiego: "User1,User2 oraz User3 dodali komentarz do twojego wpisu"..

Może któryś z was "PHPowców" mi pomoże wink.gif bo w tamtym dziale nie uzyskam raczej pomocy smile.gif
P.s. chciałbym ograniczyć ilość połączeń a powyższy pomysł z COUNT do takich raczej nie należy ;x
sonquer
Chcesz pętlą odczytać wszystkie rekordy ?
krowal
Cytat
Chce powiedzieć że chce uzyskać coś takiego: "User1,User2 oraz User3 dodali komentarz do twojego wpisu"..

Imo najlepiej byłoby powiązać jakoś rekord "powiadomienie" z komentowanym elementem np dodać kolumnę "external_target_id". Wtedy po dodaniu komentarza do tego elementu będziesz mógł wyciągnąć konkretne powiadomienie i dodać mu informację o kolejnym komentarzu.
MTF
Dzięki za odpowidzi..

@krowal ale tam jest coś takiego smile.gif to jest "what" <- wskazuje ID np. komentarza czy wpisu wink.gif i rozróżniam różne typy powiadomień po "type"

@sonquer tak chce zrobić pętlę w środku której musiałbym zrobić kolejne zapytanie..

btw. w tych powiadomieniach są też zaproszenia do znajomych - nie chce ich grupować każde ma być oddzielnie..

brakuje mi pomysłów.
aachi
Zerknąłem na ten drugi wątek i nie wiem czy to o to Ci chodzi... ale jeśli chcesz zamiast 50 powiadomień, że ktoś skomentował jakiś wpis, tylko jeden, to zamiast grupować po prostu posortuj tak, by w osobnych tablicach miał te zdarzenia które chcesz umieścić w jednym powiadomieniu np (poniższy kod nie ma działać ma Ci podsunąć pomysł jak to rozwiązać)

  1. $db= new mysqli('localhost','login','pass','database');
  2.  
  3. //Pobierasz wszystkie nowe powiadomienia dla usera
  4. $r=$db->query('SELECT * FROM powiadomienia WHERE do_usera = '.$user_info['id']) {
  5. if (!$r) { die('Błąd zapytania, albo bazy'); }
  6. else {
  7. while($w=$r->fetch_assoc()) {
  8. //Zapisujesz do tablicy i odrazu "sortujesz" po wymaganych parametrach (czyli chyba chcesz po "type" i po "what")
  9. $wynik[$w['what']][$w['type']][$w['od_usera']]=$w; //['od_usera'] jest po to, że jeśli dany user wstawił 20 komunikatów do tego samego obiektu, to przy generowaniu pojawi się tylko informacja o jednym komunikacie
  10. }


I teraz w zmiennej $wynik masz posortowane elementy... Czyli jeśli user dostał 50 komentarzy (type=3) od różnych osób odnośnie tego samego elementu (what=10), to w $wynik[10][3] masz array zawierającą 50 wierszy z bazy z których chcesz utworzyć jeden komunikat

  1. $komunikat='Dodano komentarz do czegośtam od: ';
  2. foreach ($wynik[10][3] as $v) $komunikat.=$v['od_usera'].', ';


By ładnie wszystko działało będziesz musiał zagnieździć 3 foreach i dla każdego typu generować inny komunikat.

Edit: Jeśli niektórych typów nie chcesz grupować to też przy takim podejściu nie ma problemu... poprostu dla type=ileśtam generujesz wiele komunikatów zamiast jednego połączonego.
MTF
@aachi

dzięki.. jest to myśl.. użyć tablic..
i można by wpisać do niej akcje do danego typu i "zewnętrznego ID"..

Dałeś dobry pomysł wink.gif Zobaczę czy efekt będzie taki jak oczekuje i napiszę wam smile.gif
P.s. może to potrwać bo zająłem się uploadem zdjęć smile.gif

----edit---
dobra teraz mam pogrupowane wink.gif

zbudowałem potrójny foreach itp.. i narazie tak poprostu zobaczyłem czy działa - działa..

ale na liście muszą się pojawić jeszcze posortowane "czasowo" od najnowszego do najstarszego (ograniczam wyniki czasowo więc tablica nie urośnie ogromna)..
jak posortować to w tych tablicach? ;>
aachi
Cytat(MTF @ 29.08.2012, 21:46:20 ) *
...
ale na liście muszą się pojawić jeszcze posortowane "czasowo" od najnowszego do najstarszego (ograniczam wyniki czasowo więc tablica nie urośnie ogromna)..
jak posortować to w tych tablicach? ;>


W momencie gdy tworzysz treści powiadomień z wielu wpisów (w tym potrójnym foreach), musisz ustalić dodatkowy parametr "czas" i go zapisywać razem z już zgrupowanym powiadomieniem. Musisz wybrać czy czasem powiadomienia będzie czas kiedy pierwsza osoba dodała komentarz, czy też gdy ostatnia. Jeśli np. ważne jest pierwsza to nadpisujesz czas gdy jest wcześniejszy niż obecnie zapisany dla powiadomienia


  1. //Pobierasz dane z bazy do poniższej zmiennej
  2. $danezbazy=...;
  3.  
  4. $pogrupowanepowiadomienia=array(); //Tutaj będziesz zapisywał wszystkie treści już pogrupowanych powiadomień
  5. $sortowaniepoczasie[]=array(); //Tutaj będziesz zapisywał posortowane po czasie id do tablicy $pogrupowanepowiadomienia. Czasy będą trzymane jako klucze tej tablicy, a wartościami będą tablice zawierające id do $pogrupowanepowiadomienia.
  6. $takiliczniczek=0; //Tą zmienną będziesz indeksował tablicę $pogrupowanepowiadomienia (przy okazji będziesz wiedział ile ich masz).
  7.  
  8. //Tworzysz zgrupowane powiadomienia, czyli potrójne foreach
  9. foreach ($danezbazy as $k_what=>$v_what) {
  10. foreach ($v_what as $k_type=>$v_type) {
  11. //PONIŻEJ TWORZYSZ TE POŁĄCZONE POWIADOMIENIA
  12. switch ($k_type) {
  13. ...
  14. case '3' : $komunikat_tmp['tresc']='Dodano komentarz do obiektu o id='.$k_what.' od: ';
  15. $komunikat_tmp['czas']=$v_type[0]['time']; //Ustawiasz na pierwszy znaleziony czas
  16. foreach ($v_type as $v) {
  17. $komunikat_tmp['tresc'].=$v['od_usera'].', ';
  18. if ($komunikat_tmp['czas']>$v['time']) $komunikat_tmp['czas']=$v['time']; //Jeśli kolejny czas zdarzenia jest wcześniejszy niż obecnie ustawiony, to ustawiasz ten wcześniejszy
  19. }
  20. $pogrupowanepowiadomienia[$takiliczniczek]=$komunikat_tmp['tresc']; //zapisujesz ten nowo utworzony komunikat do tablicy przechowującej wszystkie pogrupowane powiadomienia (indeksujesz liczniczkiem)
  21. $sortowaniepoczasie[$komunikat_tmp['czas']][]=$takiliczniczek++; //Tablice $sortowaniepoczasie indeksujesz czasami powiadomień, a jako wartość podajesz tablice zawierającą id do tablicy $pogrupowanepowiadomienia; Jak już zrobisz wszystko to inkrementujesz liczniczek by nie nadpisać starszego powiadomienia
  22. break;
  23. case '4' : ...
  24. ...
  25. }
  26. }
  27. }
  28.  
  29. ksort($sortowaniepoczasie); //sortujesz tablicę tak by foreach zwracał kolejne klucze od najmniejszego do największego, bo foreach normalnie podaje elementy w kolejności ich tworzenia, bez względu na kolejność kluczy; Jeśli chcesz sortować od największego do najmniejszego to zerknij do manuala jakie parametry trzeba dodatkowo podać.


I teraz jak chcesz wyświetlić powiadomienia od najstarszego do najmłodszego to:
  1. foreach ($sortowaniepoczasie as $k=>$v) foreach ($v as $id) echo 'CZAS: '.$k.'; TREŚĆ: '.$pogrupowanepowiadomienia[$id];


KILKA UWAG:
- Tworzę osobną tablicę $sortowaniepoczasie, zamiast zapisywać czas w $pogrupowanepowiadomienia, bo jesli będziesz chciał jeszcze po czymś innym sortować, to wtedy poprostu dodajesz kolejną tablice analogicznie do tej z czasami. Jeśli nie chcesz, to czasy możesz zapisywać jako klucze w $pogrupowanepowiadomienia.
- Zwróć uwagę na dodatkowe (ostatnie) nawiasy w linii: $sortowaniepoczasie[$komunikat_tmp['czas']][] - są po to, że dla jednego czasu może pojawić się kilka powiadomień, więc bez nich mógłbyś trzymać pod tym czasem tylko jedno, ostatnio dodane.
- Troszkę pogmatwany ten kod wyszedł i pewnie przydałaby mu się jakaś optymalizacja... smile.gif Mam nadzieję, że nic nie pokręciłem i jakoś to ogarniesz.
MTF
Dzięki aachi

Żeby nie było tak pogmatwane w tych pętlach zrobiłem sobie funkcję która buduje powiadomienia i do niej odsyłam poprostu dane wink.gif

zaraz zajmę się zastosowaniem Twojego pomysłu wink.gif
Dzięki jestes bogiem! biggrin.gif

P.s. jak narazie mam coś takiego:



i dam po SQL ograniczenia czasowe by ich nie było niewiadomo ile wink.gif
Imo stwierdziłem że zaproszenia w takiej formie i tak mogą być pogrupowane wink.gif

aachi mój problem został rozwiązany! smile.gif

Wszystko działa i jest pogrupowane! smile.gif

Oba tematy można zamknąć smile.gif
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.