![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 7.02.2013 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
próbuję stworzyć zapytanie, które pobierze wiadomości obecnie zalogowanego użytkownika. Struktura tabel:
I przyznam, że się pogubiłem. Czy ktoś może mi pomóc/nakierować? funkcja nad którą pracuję:
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 18 Dołączył: 5.02.2016 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
Dlaczego w pytaniu do bazy dajesz $_SESSION zamiast użyć argumentu z funkcji czyli $uzytkownik_id? Poza tym daj sobie:
i zobacz co Ci w ogóle wyskoczy, czy zapytanie jest prawidłowe. Przy $wynik = mysqli_query($connect, $sql); daj |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 7.02.2013 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Dlaczego w pytaniu do bazy dajesz $_SESSION zamiast użyć argumentu z funkcji czyli $uzytkownik_id? Na chwilę obecną to moja robocza wersja, ale to nic nie zmienia - zapytanie wykonuje się bez błędów... Ale jest nieprawidłowe, właśnie przy nim potrzebuję pomocy. By podejrzeć prawidłowe zapytanie wstawiam w funkcji następnie sprawdzam w MySQL i błędów nie ma. PS. Cytat mam użyte w funkcji - pierwszy post linia 17. Problemem jest z ułożenie właściwego zapytania - nie potrafię tego ogarnąć. Ten post edytował gogomania 5.05.2017, 08:28:01 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Nieprzeczytane wiadomości dla danego użytkownika tak?
Mógłbyś wyjaśnić strukturę tabeli "konwersacje_wiadomosci"? Nie jestem pewien, czy dobrze ją rozumiem. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 7.02.2013 Ostrzeżenie: (0%) ![]() ![]() |
Nieprzeczytane wiadomości dla danego użytkownika tak? Mógłbyś wyjaśnić strukturę tabeli "konwersacje_wiadomosci"? Nie jestem pewien, czy dobrze ją rozumiem. Dokładnie - nieprzeczytane wiadomości ze wszystkich konwersacji dla zalogowanego użytkownika. np. Ja jestem zalogowany jako 'admin' i mam trzy rozpoczęte konwersacje i w pierwszej mam 2 nowe wiadomości w drugiej mam 3 a w trzeciej bez zmian, co w sumie daje 5 nowych wiadomości. `konwersacje_wiadomosci` wiadomosc_id (int 10 oraz AI) konwersacja_id (int 8) - id konwersacji, który jest też użyty w pozostałych tabelach uzytkownik_id (int 11) - rejestrowany nadawca wiadomości (jego np. $_SESSION['uzytkownik_id']) data_wyslania (int 10) - data wysłanej wiadomości wiadomosc_oglada (int 1) - tą kolumnę dodałem by rejestrować 0 / 1 dla nieodczytana/odczytana ale nie wiem czy jest sens (może jest możliwe wyciągnięcie tego samego z dat?) wiadomosc_tresc (text) - wiadomo Głównym zadaniem tabeli jest rejestrowanie pojedynczej wysłanej wiadomości użytkownika. Np. 'admin' wysyła wiadomość do 'test_1' i 'test_2' wówczas w tabeli konwersacje_wiadomosci zostanie zarejestrowana wiadomość tylko raz, a w tabeli konwersacje_czlonkowie dodane zostaną 3 nowe wiersze z użytkownikami tej konwersacji oraz id konwersacji. Mam nadzieję, że w pełni odpowiedziałem na pytanie i szybko uzyskam pomoc. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Hmm w takiej postaci nie ma możliwości ustalenia, kto jaką wiadomość przeczytał. Brakuje jednoznacznej informacji wskazującej, że dany użytkownik przeczytał daną wiadomość.
Masz "konwersacja_ostatnio_ogladana" w tabeli "konwersacje_czlonkowie", ale to tylko wskazuje kiedy dana konwersacja została otwarta w widoku do odczytu. Masz "wiadomosc_ogladana" w "konwersacje_wiadomosci", ale to też nie wskazuje KTO oglądał daną wiadomość. Tylko tyle, że ktoś oglądał i już nie jest globalnie nieprzeczytana. Jedyne co można z takimi danymi zrobić, to pokazać pierwszemu zalogowanemu uczestnikowi danej konwersacji, że ma N nieprzeczytanych wiadomości. W momencie jak ten użytkownik otworzy konwersację, to znaczniki się ustawią na 1 i kolejny użytkownik już będzie miał status "wszystko przeczytane". Musiałbyś dodać jakąś tabelę, która powiąże id_wiadomosci, id_uzytkownika polem "przeczytana" (np.: "wiadomosci_przeczytane_przez"), i dopisywać tam rekordy w momencie otwarcia wiadomości do odczytu. Dodatkowo, autor wiadomości też tam powinien być dopisany w momencie wysyłania wiadomości. Wtedy określenie ilości nieprzeczytanych wiadomości sprowadzałoby się do obliczenia różnicy a - b, gdzie: a: ilość wszystkich wiadomości we wszystkich konwersacjach dla danego użytkownika b: ilość wszystkich rekordów w tabeli "wiadomosci_przeczytane_przez" policzona dla id_wiadomosci z puli liczonej w "a" To zadziała pod warunkiem, że rozumiesz że: Np. 'admin' wysyła wiadomość do 'test_1' i 'test_2' [...] a w tabeli konwersacje_czlonkowie dodane zostaną 3 nowe wiersze z użytkownikami tej konwersacji oraz id konwersacji. ta logika MOŻE spowodować pojawienie się duplikatów, i że programistycznie nie dopuszczasz do pojawienia się takich duplikatów. Tak mi się wydaje. Ale ogólnie na twoim miejscu mocno przemyślałbym ten model danych. Nie jestem pewien czy "konwersacja" jest tu w ogóle potrzebna, bo konwersację można ustalić dynamicznie na podstawie analizy łańcucha wiadomości: 1. Jedna wiadomość to logicznie już konwersacja. Bez odpowiedzi, ale konwersacja. 2. Dwie i więcej wiadomości to już porządna konwersacja, której początek, ciąg i koniec można ustalić dodając pole "w_odpowiedzi_na" przechowujące id_wiadomosci poprzedniej, ale jakiejkolwiek innej.... |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 7.02.2013 Ostrzeżenie: (0%) ![]() ![]() |
W pierwszej kolejności dziękuję za poświęcony czas na rozwiązanie problemu.
Wrócę do początku tego wątku bo wydaje mi się, że nie wyraziłem się jasno stąd powstałe nieścisłości. Działanie przepływu wiadomości dla konwersacji od użytkownika do użytkownika/ów mam już opracowane w pełni, w zasadzie wszystko mam już zrobione. Pozostał tylko problem a w zasadzie szczegół ze zliczeniem wiadomości nieprzeczytanych. Nie chodzi mi tutaj o odczytanie pojedynczej wiadomości bo to by kłóciło się z tym co już mam. Wywnioskowałem, że piszesz o stworzeniu mechanizmu gdyż jak się domyślam, założyłeś, że takiego nie mam. Otóż jest wszystko i ładnie działa. Jedynie pozostaje ta nieszczęsna kwestia zapytania SQL by pobrać wiadomości nieprzeczytane dla zalogowanego obecnie użytkownika ze wszystkich konwersacji w funkcji którą podałem w pierwszym poście. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
W takim razie zacytuję sedno tego, co napisałem w poprzednim poście:
Hmm w takiej postaci nie ma możliwości ustalenia, kto jaką wiadomość przeczytał. Brakuje jednoznacznej informacji wskazującej, że dany użytkownik przeczytał daną wiadomość. Miałem tu na myśli, że w bazie danych nie masz w tej chwili informacji o tym kto jaką wiadomość przeczytał lub nie. Czyli nie skonstruujesz zapytania SQL które odpowie na Twoje pytanie. Reszta tamtego posta to szybka analiza tego co masz dostępne i propozycja (jedna z kilku opcji) w jaki sposób taką funkcjonalność wdrożyć. Liczba nieprzeczytanych to przykład; taką samą techniką można te wiadomości pobrać. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 7.02.2013 Ostrzeżenie: (0%) ![]() ![]() |
W takim razie zacytuję sedno tego, co napisałem w poprzednim poście: Miałem tu na myśli, że w bazie danych nie masz w tej chwili informacji o tym kto jaką wiadomość przeczytał lub nie. Czyli nie skonstruujesz zapytania SQL które odpowie na Twoje pytanie. Reszta tamtego posta to szybka analiza tego co masz dostępne i propozycja (jedna z kilku opcji) w jaki sposób taką funkcjonalność wdrożyć. Liczba nieprzeczytanych to przykład; taką samą techniką można te wiadomości pobrać. Przepraszam, może to nie niemożliwe, ale mam tą funkcjonalność tj. mam tą informację która wiadomość została przeczytana:
W tej funkcji pobieram 'konwersacja_nieprzeczytana' i wyświetlam na liście konwersacji informację np. "Nowe" co jest jednoznaczne z tym, że są nowe wiadomości w konwersacji.
Tutaj między innymi pobieram ile jest wiadomosci nieprzeczytanych dla danej konwersacji... Ale brakuje mi jak wspomniałem funckji która wyświetli mi wszystkie nieprzeczytane wiadomości we wszystkich konwersacjach użytkownika. Tzn. zapytania SQL. Jakieś pomysły jak powinno składać wyglądać te zapytanie? |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Zakładając że wiadomość nieprzeczytana to taka, która ma datę dodania większą (późniejszą) niż ostatnia data oglądania konwersacji przez danego użytkownika i znajduje się w tej konwersacji to można:
Pole wiadomosc_ogladana w tabeli konwersacje_wiadomosci jest do usunięcia, nie ma tam sensu. Nie sprawdzasz też nigdzie czy konwersacja została usunięta, ale to już musisz sam przemyśleć jak to zrobić, bo być może to pole powinno być w tabeli konwersacje albo też użytkownik może chcieć się wypisać z danej konwersacji i tylko dla niego jest ona niewidoczna (usunięta) podczas gdy inni mogą dalej w niej pisać i wtedy to pole jest w dobrym miejscu, choć dziwnie nazwane. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 1 Dołączył: 7.02.2013 Ostrzeżenie: (0%) ![]() ![]() |
Zakładając że wiadomość nieprzeczytana to taka, która ma datę dodania większą (późniejszą) niż ostatnia data oglądania konwersacji przez danego użytkownika i znajduje się w tej konwersacji to można:
Pole wiadomosc_ogladana w tabeli konwersacje_wiadomosci jest do usunięcia, nie ma tam sensu. Nie sprawdzasz też nigdzie czy konwersacja została usunięta, ale to już musisz sam przemyśleć jak to zrobić, bo być może to pole powinno być w tabeli konwersacje albo też użytkownik może chcieć się wypisać z danej konwersacji i tylko dla niego jest ona niewidoczna (usunięta) podczas gdy inni mogą dalej w niej pisać i wtedy to pole jest w dobrym miejscu, choć dziwnie nazwane. Jesteś mega! O to mi właśnie chodziło. Niby takie proste zapytanie a ja kombinowałem zupełnie w innym kierunku... Dziękuję Ci bardzo. Btw. Sprawdzam czy konwersacja została usunięta w innej funcji, tutaj (cała funkcja we wcześniejszym poście):
Jeżeli jest `konwersacja_usunieta` = 1 wówczas nie pokazuję jej na liście konwersacji zalogowanego użytkownika. Ogólnie mam już wszystko - dzięki temu zapytaniu, które napisałeś! Dziękuję wszystkim za udzielone wsparcie. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 09:11 |