Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Jak zbudować bazę na mini-forum
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Część, poproszę o radę. Mam stronkę z postami, takie jednowątkowe mini-forum. Postów jest kilka tysięcy w tabeli messages oraz kilkunastu uzytkowników w tabeli users. Chcę dodać możliwość ozsnaczania postów jako ulubione. Jak to najlepiej, najwydajniej rozwiązać? Zamierzam zrobić tak...

Utworzę dodatkową tabelę favorites. Do niej będę zapisywał ID_MESSAGE oraz ID_USER w przypadku kiedy użytkownik oznaczy posta jakko ulubiony, oraz będę usuwać dany rekord kiedy uer posta odznaczy, wyrzuci z ulubionych. Przy wczytywaniu forum w pętli while wczytującej rekordy z messages będzie dodatkowe sprawdzenie typu jeżeli w favorites istnieje rekord zawierający ID zalogowanego usera oraz id danego posta (przy każdej iteracji while) to oznacz jako ulubiony.
Czy tak będzie dobrze? Czy jakoś inaczej, lepiej można to rozwiązać?


Dodatkowo dwa kolejne pytania niekoniecznie związane z tym tematem:
1) Uzywam sobie od czasu do czasu ChatGPT do generowania kodu. Co o tym sądzicie? Czy on tworzy poprawny kod po bożemu, czy jednak robi złą robotę?
2) O co chodzi z tą kradzieżą danych na forum? Od pewnego czasu Chrome wali mi komunikatami, że moje dane zostały wykradzione z forum i zaleca zmianę hasła. Był jakiś atak hakerski na forum.php.pl ?

Dzięki.
nospor
tabela co podales jest ok.
nie jestem pewien czy dobrze zrozumialem jak chcesz sprawdzac czy jest ULUBIONY czy nie. jesli miales na mysli dodatkowe zapytanie to zle. Jesli miales na mysli LEFT JOIN w glownym zapytaniu to dobrze.

ChatGPT nalezy uzywac z wiedza i swiadomie. ok, on wygeneruje kod, ale nie zawsze pierwszych lotow
Forum jest dziurawe jak ser szwajcarski wiec pozostaje miec nadzieje ze ni uzywasz hasla forum w banku
sadistic_son
Miałem na mysli osobne zapytanie. Ok, poczytam więc o LEFT JOIN. Na szybko ChatGPT wypluł mi coś w tym stylu:
  1. // Zapytanie SQL z wykorzystaniem LEFT JOIN
  2. $sql = "SELECT messages.ID, messages.MESSAGE,
  3. CASE WHEN favorites.ID_USER IS NULL THEN 0 ELSE 1 END AS is_favorite
  4. FROM messages
  5. LEFT JOIN favorites ON messages.ID = favorites.ID_MESSAGE AND favorites.ID_USER = $logged_in_user_id";
  6.  
  7. $result = $conn->query($sql);
  8.  
  9. if ($result->num_rows > 0) {
  10. // Wyświetlenie danych
  11. while($row = $result->fetch_assoc()) {
  12. echo "ID: " . $row["ID"]. " - MESSAGE: " . $row["MESSAGE"]. " - Is Favorite: " . $row["is_favorite"]. "<br>";
  13. }
  14. } else {
  15. echo "0 results";
  16. }


Dobry kiedunek czy błądzę?



Co do forum, to widzę, że chyba już się nie rozwija. Nie ma https, kradzież danych, admini i zarząd nielogujący się od lat... Czyżby położono już
krzyżyk na tym portalu?
nospor
Tak, to jest dobre zapytanie. Przydaloby sie jednak bindowanie zamiast wkladac id usera bezposrednio do zapytania

co do forum to ja juz sie nie bede wypowiadal... ale jak jest kazdy widzi
sadistic_son
1) tak tak, to kod na szybko tylko żeby pokazać kierunek. Będzie bindowanie itd.



2) czyli nie zaprzeczasz... Szkoda sad.gif


Dzięki.
trueblue
A posty nie mają przypisanych autorów?
nospor
trueblue a co ma autor do ulubionych postow? Uzytkownik przeciez moze polubic nie swoj post
sadistic_son
Cytat(trueblue @ 18.03.2024, 11:36:11 ) *
A posty nie mają przypisanych autorów?

Oczywiście, że mają. Ale tak jak pisze nospor - można polubić różne posty, nie tylko swoje smile.gif
trueblue
Cytat(nospor @ 18.03.2024, 11:45:39 ) *
trueblue a co ma autor do ulubionych postow? Uzytkownik przeciez moze polubic nie swoj post

Czy gdzieś to zanegowałem?

Jeśli wykonamy zapytanie wybierające posty wraz z autorami tychże, i połączymy to poprzez LEFT JOIN z ulubionymi, to uzyskamy iloczyn kartezjański. Nie można więc tego łączyć w jednym zapytaniu.
Oczywiście uprzedzę Cię nospor i doprecyzuję, że nie wiemy czy autor postu będzie wraz z postami wybierał ich autorów, bo póki co nic na to nie wskazuje, ale jeśli tak, to problem się pojawi.
nospor
Dzis poniedzialek wiec moge nie kleic wiec spytam, gdzie w tym zapytaniu jest iloczyn kartezjanski?

$sql = "SELECT messages.ID, messages.MESSAGE, CASE WHEN favorites.ID_USER IS NULL THEN 0 ELSE 1 END AS is_favorite
FROM messages
left JOIN users on message.user_id = users.id
LEFT JOIN favorites ON messages.ID = favorites.ID_MESSAGE AND favorites.ID_USER = $logged_in_user_id";
Salvation
Cytat(trueblue @ 18.03.2024, 13:33:37 ) *
Jeśli wykonamy zapytanie wybierające posty wraz z autorami tychże, i połączymy to poprzez LEFT JOIN z ulubionymi, to uzyskamy iloczyn kartezjański. Nie można więc tego łączyć w jednym zapytaniu.

A jaki sens jest pobierać Posty, ich Autorów i jeszcze Ulubione na jeden widok? Pytam z biznesowego punktu widzenia, bo szczerze, to jeszcze nie spotkałem się z taką kombinacją nawet przy forach.

Ale zgadzam się, że to będzie zabójcze zapytanie. Co nie zmienia faktu, że zawsze można wygenerować z tego Widok w bazie, zcache'ować czy nawet spróbować jakoś inaczej dane ułożyć w późniejszej fazie.
nospor
Cytat
Ale zgadzam się, że to będzie zabójcze zapytanie.

podalem wyzej zapytanie. Co jest w nim zabojczego?
Dla jednego posta, pobeirze jedna informacje czy jest ulubiona i autora posta. ZWykly, banalny left join bez zadnego iloczynu
sadistic_son
Cytat(Salvation @ 18.03.2024, 16:57:38 ) *
A jaki sens jest pobierać Posty, ich Autorów i jeszcze Ulubione na jeden widok?
No jak? Mamy listę postów, albo newsów, jak wolisz. ładuje się 10 na stronę, jest stronnicowanie. I przy każdym masz przycisk 'dodaj do ulubionych'. Jeśli w takowy klikniesz to on zostaje oznaczony a przycisk 'dodaj do ulubionych' zmienia się w 'usuń z ulubionych'. Czy to jest jakieś niespotykane rozwiązanie?



Cytat(trueblue @ 18.03.2024, 13:33:37 ) *
(...)autor postu będzie wraz z postami wybierał ich autorów(...)

Sorry, ale nie rozumiem co tu masz na myśli.
nospor
Cytat
A jaki sens jest pobierać Posty, ich Autorów i jeszcze Ulubione na jeden widok? Pytam z biznesowego punktu widzenia, bo szczerze, to jeszcze nie spotkałem się z taką kombinacją nawet przy forach.

I znowu nie kumam. Przeciez dobrze jest widziec autora postu, oraz informacje czy jest to moj ulubiony post czy nie. standardowa funkcjonalnosc
sadistic_son
Cytat(nospor @ 18.03.2024, 17:08:36 ) *
I znowu nie kumam. Przeciez dobrze jest widziec autora postu, oraz informacje czy jest to moj ulubiony post czy nie. standardowa funkcjonalnosc

Uff, czyli nie wymyśliłem sobie śliwek na wierzbie wink.gif
nospor
Cytat
(...)autor postu będzie wraz z postami wybierał ich autorów(...)

Sorry, ale nie rozumiem co tu masz na myśli.

autor postu, czyli ty - sadistic_son, czy zamierzasz pobierac jeszcze autorow postow na swoim mini forum. To juz wiemy, ze zamierzasz i to jest jak najbardziej ok. Czego nie wiemy to to, czemu oni mysla ze to zabije baze, bo jak dla mnie jest to banalne i szybkie zapytanie. bez iloczynu kartezjanskiego jak im sie wydaje

edit: trueblue i salvation:
polubione posty beda pobierane tylko dla aktualnie przegladajacego uzytkownika a nie dla wszystkich na raz
sadistic_son
Dokładnie. Ja (zalogowany) chcę widzieć posty które sam polubiłem, nie interesuje mnie które posty polubili inni. Tzn chcę widzieć wszystkie posty z bazy, ale w żółtej ramce mają być tylko te które sam polubiłem wink.gif I podobnie będzie z postami przeczytanymi i nie przeczytanymi. Chcę mieć oznaczone te posty których sam jeszcze nie czytałem, a co mnie obchodzi, że postu nr 550 kolega Zenek69 jeszcze nie przczytał. I chcę widzieć że post nr 567 został napisany przez kolegę Zbychu999. Nic w tym wszystkim chyba nie ma zaskakującego, co? smile.gif
Salvation
Cytat(nospor @ 18.03.2024, 17:07:19 ) *
podalem wyzej zapytanie. Co jest w nim zabojczego?

W Twoim nic. Ja pytałem trueblue o to, po co na jednym widoku lista przez kogo post został polubiony. Łączna suma polubień jeszcze nie będzie wąskim gardłem.

A jeżeli faktycznie chcemy wyświetlić listę osób, które post polubiły, to lepiej do dociągnąć przez np. AJAXa.
nospor
No i tu wynika niezrozumienie
Nigdzie z pytan sadistica nie wychodzila, ze chce pobierac osoby ktore polubily post. Od samego poczaktu bylo jasne, co pokazal w zapytaniu, ze go interesuje tylko osoba, dla ktorej sie wyswietla forum, czy ona polubila post. Dlatego tez wasze stwierdzenia, ze to bedzie zabojcze, nie mialy sensu
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.