• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dodawanie postów z bazy danych + kilka zdjęć.

VPS Starter Arubacloud
0 głosów
523 wizyt
pytanie zadane 21 marca 2022 w PHP przez pazo1313 Nowicjusz (140 p.)

Próbuje napisać na stronie internetowej skrypt w PHP. 

Ma on polegać na tym żeby wyświetlał na stronie wszystkie posty z bazy danych od najnowszego. 

Potrafię wyświetlić wszystkie posty, a w nich tytuł i tekst.

Nie potrafię wyświetlić zdjęć należące do danego postu.

Sytuacja jest łatwa jeżeli post ma jedno zdjęcie, ale nie umiem poradzić sobie w sytuacji gdy post ma kilka zdjęć i chcę je wyświetlić w jednym div'ie pod tekstem. 

Stworzyłem bazę 'news', a w niej dwie tabele: 'posts' i 'img'

Poniższy kod wyświetla wszystkie posty, ale tylko z tytułem i tekstem!

$conn = mysqli_connect('localhost', 'root', '', 'news');
$zap = mysqli_query($conn, "SELECT title, text FROM posts;");

while($row = mysqli_fetch_array($zap)){
       $title = $row[0];
       $text = $row[1];

       echo 
            "
            <section class='post-box'>
                <h1>$title</h1>
                <p>$text</p>
            </section>
            ";
}
mysqli_close($conn);

Nie wiem jak napisać ten kod, ma ktoś jakiś pomysł? 

 

 

2 odpowiedzi

0 głosów
odpowiedź 21 marca 2022 przez radek024 Szeryf (77,160 p.)
W tym momencie nie znamy struktury tabel, więc nie ma pewności, czy w ogóle jest możliwe wyświetlenie galerii. Jeżeli ta identyfikuje grafikę z tytułem wpisu - to trochę słabo, wówczas może nastąpić sytuacja, gdy rekord nie jest unikalny i przypisanych ma więcej jak jedną galerię.

Jeżeli posiadasz tabelę img zdefiniowaną tak, żeby ta posiadała ścieżki do grafik na podstawie identyfikatora wpisu, to zapytanie dot. galerii możesz wykonać wyłącznie na potrzeby uzyskania tej galerii.

Ponadto, w kodzie jest trochę błędów. Co jezeli połączenia z bazą będziesz potrzebował w innym pliku php? Co jeżeli zapytanie które napisałeś się nie wykona, albo będzie zawsze prawdziwe? Dlaczego cały kod HTML wykonywany jest za pomocą echo - przecież można by było zamknąć tagi php i napisać ten kod zwyczajnie w htmlu.
komentarz 21 marca 2022 przez pazo1313 Nowicjusz (140 p.)

Tak to wygląda w bazie danych. 

Tagi <?php i ?>  są w kodzie.

komentarz 21 marca 2022 przez radek024 Szeryf (77,160 p.)

Teraz przedstawiłeś rekordy, a nie strukturę. Tą możesz uzyskać stosując polecenie describe nazwa_tabeli. Teraz może Ci się to wydawać zbędne, ale kiedyś z pewnością Ci się ona przyda. Ze screenów widzę, że masz nazwę pliku oraz id wpisu, do którego zdjęcia się odwołują. W tym momencie możesz w takim razie napisać zapytanie z WHERE, które na podstawie id_posta pobiera i wyświetla galerie. Pamiętaj: weryfikuj czy poprawnie pobrałeś dane. W bazie może być literówka w nazwie pliku i ten może sie nie wyświetlić, ba - jeżeli baza jest źle zdefiniowana nazwy nie musi być.

To, że tagi <?php są, nie oznacza, że są stosowane słusznie - czy kodu html nie można wykonać bezpośrednio w samym html? Nie potrzebujesz echo do jego wywołania.

komentarz 22 marca 2022 przez pazo1313 Nowicjusz (140 p.)

Tutaj pokazana jest struktura dwóch tabel (dziękuję za info odnośnie tego).

Czy moje zapytanie powinno wyglądać coś na wzór tego? Ten kod aktualnie nie działa, ale chcę wiedzieć czy idę w dobrym kierunku.

    $zap = mysqli_query($conn, "SELECT posts.title, posts.text, img.src FROM posts INNER JOIN post.ID = img.post_ID WHERE img.post_ID = post.ID;");

Czyli powinienem napisać warunek sprawdzający pobierane dane?

Nie bardzo rozumiem o co chodzi w ostatnim akapicie komentarza; czyli powinienem zrobić osobny plik z polaczeniem .php, kolejny z zapytaniem . php i główny .html, tak?

komentarz 22 marca 2022 przez radek024 Szeryf (77,160 p.)

Dane w tabeli img możesz identyfikować z postem na podstawie id posta. Zapytanie, które musisz wykonać faktycznie musi się opierać na identyfikatorach - ale nie pobierzesz zdjęć z galerii oraz treści za jednym razem w taki sposób, aby otrzymać całość za jednym razem. Musisz to podzielić na dwa zapytania:

  • zapytanie dot. posta (i tutaj również pobierasz idenyfikator),
  • zapytanie dot. galerii (na podstawie wcześniej pobranego id).

czyli powinienem zrobić osobny plik z polaczeniem .php, kolejny z zapytaniem . php i główny .html, tak?

Połączenie z php powinno być osobne, ponieważ tak jak wcześniej wspomniałem - może być przydatne w kilku miejscach. Wówczas zaciągasz sobie treść pliku i połączenie z bazą masz za sobą. Rzecz jasna w pracy stosuje się inne praktyki (ale do tego jeszcze długa droga :D). Plik, w którym wyświetlasz dane mógłby wyglądać tak:

 

while($row = mysqli_fetch_array($zap)){
$title = $row[0];
       $text = $row[1];
 
       ?>
            <section class='post-box'>
                <h1><?php echo $title; ?></h1>
                <p><? echo $text; ?></p>
            </section>
<?php
}

Zauważ, że kod HTML może być zwyczajnie HTML - PHP nie musi go generować, jeżeli warunek nie będzie prawdziwy, to i tak się nie pokaże. 

komentarz 23 marca 2022 przez pazo1313 Nowicjusz (140 p.)

Zrobilem plik connect.php i jest w nim polączenie. 

Includuje je do pliku index.php i działą połączenie. 

Następnie spróbowałem napisać zapytania.

zapytanie dot. posta (i tutaj również pobierasz idenyfikator):

 $showPosts = mysqli_query($conn, "SELECT title, text FROM posts;");

zapytanie dot. galerii (na podstawie wcześniej pobranego id):

$showImg = mysqli_query($conn, "SELECT img.source FROM img INNER JOIN posts ON posts.ID = img.posts_ID WHERE img.posts_ID = posts.ID");

W tej sytuacji pokazuje mi się jeden post z jednym zdjęciem. Czy powinienem zastosować jakąś pętle, żeby wyświetlić wszystkie posty i ich zdjęcia?

Pomyślałem tez i zrobiłem repozytorium na GITHUB z plikami, tak tylko do podglądu.

 

komentarz 24 marca 2022 przez radek024 Szeryf (77,160 p.)
Jesteś dość blisko rozwiązania - rodzaj łączenia jest nieprawidłowy. Pocztaj tutaj: https://towardsdatascience.com/what-is-the-difference-between-an-inner-and-an-outer-join-in-sql-5b5ec8277377
komentarz 27 marca 2022 przez pazo1313 Nowicjusz (140 p.)
Podejrzewam, że powinienem skorzystać z LEFT OUTER JOIN, zgadza się?
0 głosów
odpowiedź 21 marca 2022 przez Wiciorny Ekspert (277,600 p.)

Nie potrafię wyświetlić zdjęć należące do danego postu.

no bo nie pobierasz tych zdjęć? Nie wiem być może trzeba dodać albo kolumne do zapytania, jeśli znajduje się w tej samej tabeli posts, jeśli nie to użyć złączenia i relacji JOIN table  z wykorzystaniem kolumny i tabeli do twojego zapytania 

"SELECT title, text FROM posts;"

 

komentarz 21 marca 2022 przez pazo1313 Nowicjusz (140 p.)
próbowałem w ten sposób i robiło się tak, że dodawał się kilka razy ten sam post, ale z innym zdjęciem
1
komentarz 21 marca 2022 przez Wiciorny Ekspert (277,600 p.)

nie wiem co próbowałes, ale najwidoczniej złe zapytanie lub źle pobierasz dane z bazy, jak wspomniał @ radek024 nie znamy ani struktury bazy ani tego w jakim formacie, gdzie pod jakim kluczem/ nazwą trzymasz to co chcesz uzyskać

komentarz 22 marca 2022 przez pazo1313 Nowicjusz (140 p.)
wyżej wysłałem strukturę danych

Podobne pytania

+1 głos
1 odpowiedź 261 wizyt
pytanie zadane 31 stycznia 2022 w PHP przez trixter310 Obywatel (1,440 p.)
0 głosów
1 odpowiedź 236 wizyt
pytanie zadane 30 stycznia 2022 w PHP przez trixter310 Obywatel (1,440 p.)
+1 głos
3 odpowiedzi 3,273 wizyt
pytanie zadane 2 kwietnia 2021 w PHP przez maciek3621 Nowicjusz (180 p.)

93,025 zapytań

141,990 odpowiedzi

321,293 komentarzy

62,374 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...