Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP/SQL] Powiadomienia jak na facebooku, (w stronę PHP)
MTF
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

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


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 (IMG:style_emoticons/default/wink.gif) bo w tamtym dziale nie uzyskam raczej pomocy (IMG:style_emoticons/default/smile.gif)
P.s. chciałbym ograniczyć ilość połączeń a powyższy pomysł z COUNT do takich raczej nie należy ;x
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
aachi
post
Post #2





Grupa: Zarejestrowani
Postów: 54
Pomógł: 12
Dołączył: 4.08.2007

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


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... (IMG:style_emoticons/default/smile.gif) Mam nadzieję, że nic nie pokręciłem i jakoś to ogarniesz.

Ten post edytował aachi 30.08.2012, 10:25:27
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 03:57