Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] mysqli_fetch_assoc w mysqli_fetch_assoc
Forum PHP.pl > Forum > Przedszkole
phpuser88
Posiadam dwie tabele, które są ze sobą powiązane za pomocą kolumny rodzaj:
1. powiadomienia
- id (id zalogowanego usera)
- rodzaj (to id-powiadomienia z tabeli nr2)
2. powiadomienia-tresc
- idpow (to id-rodzaj z tabeli nr1)
- tresc (tresc powiadomienia)

Napisałem też skrypt PHP, który w dwóch zagnieżdżeniach poprawnie wyświetla wszystkie dane dla usera z danym ID.
  1. if ($result = mysqli_query($con, $sql)) {
  2.  
  3. while($row = mysqli_fetch_assoc($result)) {
  4. $sql2="SELECT * FROM `powiadomienia-tresc` WHERE `idpow`='".$row['rodzaj']."'";
  5.  
  6. if ($result2 = mysqli_query($con, $sql2)) {
  7. while($row2 = mysqli_fetch_assoc($result2)) {
  8. echo $row2['tresc']."<br/>";
  9. }
  10. }
  11. }
  12. }


Wszystko działa jak należy, ale czy to jest prawidłowa logika wyświetlania danych w taki sposób? Czy jest lepsza metoda? Moja wiedza z zakresu PHP zatrzymała się kilkanaście lat temu na wersji 5.6.28, a teraz hobbystycznie działam na PHP 5.6.40
Za komentarze wielkie dzięki!
nospor
Problem nie ma zwiazku z php. Zapytanie ma byc jedno z uzyciem LEFT JOIN. Teraz zas w petli generujesz mase zapytan zamiast jednego i koniec.
No i naprawde moglbys ponazywac jakos logicznie te pola w tabelach bo teraz to nie ma zadnego sensu wink.gif
phpuser88
Staram się ogarnąć LEFT JOIN w PhpMyAdmin i korzystałem ze wzoru, który powinien funkcjonować, a jednak nie działał... dry.gif
  1. SELECT rodzaj
  2. FROM powiadomienia
  3. LEFT JOIN powiadomienia-tresc
  4. ON powiadomienia.rodzaj = powiadomienia-tresc.idpow;
Problemem była nazwa tabeli, która po 40min. została zmieniona na powiadomienia_tresc...sciana.gif

Ostatecznie doszedłem do czegoś takiego:
  1. SELECT id, rodzaj,tresc
  2. FROM powiadomienia_tresc
  3. LEFT JOIN powiadomienia
  4. ON powiadomienia.rodzaj = powiadomienia_tresc.idpow AND powiadomienia.id = 123456 AND powiadomienia.rodzaj > 0
Teraz problemem jest wyświetlanie wartości "NULL", gdy tabela `powiadomienia` posiada więcej wyników niż `powiadomienia_tresc`.
Jak to rozwiązać?

Tak to wygląda:
trueblue
  1. SELECT id, rodzaj, tresc
  2. FROM powiadomienia
  3. INNER JOIN powiadomienia_tresc ON powiadomienia_tresc.idpow=powiadomienia.rodzaj
  4. WHERE powiadomienia.id = 123456


Nie lepiej nazwać obydwie kolumny "rodzaj" albo "idpow"?

Czy wziąłeś pod uwagę, że zmiana treści powiadomienia spowoduje zmianę tych treści dla każdego użytkownika nawet jeśli powiadomienie zostało wysłane wcześniej niż zmiana treści?
phpuser88
omg... totalnie zapomniałem o prostym warunku WHERE.

@trueblue, w założeniu miały to być powiadomienia ogólne, jednakowe dla wszystkich. Myślę jak rozwiązać powiadomienia indywidualne gdzie będzie np. indywidualny link i dochodzę do wniosku, że obecna struktura jest strzałem w kolano... sciana.gif

Myślę, aby wywalić tabele `powiadomienia_tresc`, a tabele `powiadomienia` zmodyfikować, aby PHP wrzucało indywidualny komunikat dla określonego ID, a później odczytywać jednym, prostym zapytaniem. To będzie chyba najrozsądniejsze rozwiązanie.

Co do nazwy kolumn, to wcześniej nazwa była jednakowa i miałem problem z jakimś zapytaniem, dlatego zmieniłem na różniące się od siebie zamiast tracić czas na dochodzenie, którego mi niestety nie brak.

Dziękuję za naprowadzenie.
nospor
Cytat
Co do nazwy kolumn, to wcześniej nazwa była jednakowa i miałem problem z jakimś zapytaniem, dlatego zmieniłem na różniące się od siebie zamiast tracić czas na dochodzenie, którego mi niestety nie brak.

Jak masz takie same kolumny w kilku tabelach to dobierajac sie do kolumny masz poprzedzic ja nazwa tabeli, np:
tabela1.kolumna
tabela2.kolumna
tabela3.kolumna

wowczas mysql nie bedzie ci plul bledem

Jesli chcesz miec i powiadomienia ogolne, i powiadomienia do konkretnego uzytkownika to jedna tabela ale:

POWIADOMIENIA:
id_uzytkownik
tresc

I juz smile.gif
Jesli powiadomienie jest do konkretnego uzytkownika to w id_uzytkownik wstawiasz ID uzytkownika.
Jesli powiadomienie jest ogolne do wszystkich, to w id_uzytkownik wstawiasz NULL i po sprawie.

Oczywiscie mozesz to rozbudowac i dodac czas waznosci, priorytet, typ itp.
phpuser88
Taaak, już doczytałem że lepiej poprzedzać kolumny nazwą tabeli, dzięki.
Powiadomienia rozbudowałem o typ, widocznosc i date, ale nie wpadł mi do głowy elegancki pomysł z NULL. rolleyes.gif

Teraz zastanawiam się jak ograniczyć ilość zapytań do bazy i pierwszą myślą było rozwiązanie typu:
1. ciastko=0 > zapytaj SQL > pokaż wyniki + daj ciastko=1
i podoba mi się to rozwiązanie, bo mógłbym ciastko resetować co 5min. i mieć aktualne dane ograniczając kilka-kilkanaście zapytań co każde odświeżenie strony, ALE niestety wyniki SQL nie zostaną samodzielnie zapisane po jednokrotnym wyświetleniu... sciana.gif
Myślę by stworzyć tablice sesyjną i tam wpakować wyniki - to dobry pomysł? (sorry za oftop)
nospor
Mozna miec cache i z tego korzystac. Sam kiedys nagminnie stosowalem cache. Teraz juz nie widze takiego sensu by stosowac cache do takich pierdulek jak twoje powiadomienia. Toz to pare milisekund odczytu. Zakldam ze baza ma indeksy itp.
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.