Jak wyświetlić posty i jego komentarze ?

0

Chcę wyświetlić wszystkie posty, oraz wszystkie komentarze do tych postów. Nie mam problemów z wyświetleniem postów, ale z ich komentarzami już tak. Post może mieć wiele komentarzy więc nie mam pomysłu jakie zaptanie stworzyć. Próbowałem użyć left join ale nie pomogło. Czy w ogóle da się wyświetlić posty i komentarze jednym zapytaniem ? Do wyświetlania tych danych używam pętli foreach w html. Przykład podam poniżej. Ale używając petli foreach chyba nie da się sworzyć drgugiego zaptania ?

 public function display_2()
    {
$id = $_GET['id'];
$session = $_SESSION['id'];
$sql = $this->database->connect()->prepare("SELECT post.id, CONCAT(first_name,' ', last_name) AS author, post.comment, post.date_to_add, post_comment.comment, post_comment.date_to_add FROM user JOIN post ON user.id = post.user_id  LEFT JOIN post_comment ON post.user_id=post_comment.post_id where post.user_id = :user_id order by post.id DESC");
$sql->bindParam(':user_id',$id, PDO::PARAM_INT);
$sql->bindParam(':id',$session, PDO::PARAM_INT);
$sql->execute();

    if($sql->rowCount())
    {
        $this->userData = [];

        while ($row = $sql->fetch())
        {
            $this->userData[] = $row;
        }
    }
}
div class='col-xl-8' id='posty'>
                <div class='row' id='time'>
                    <div class='btn-block d-flex justify-content-between'>
                        <div class='imie'>
                           <?php  echo $user['autor']    ?>
                            </div>
                        <div class='czas'>
                           <?php echo $user['date_to_add'] ?>
                            </div>
                        </div>
                    </div>
                <?php echo $user['comment'] ?>
                <form action='' method='post' id="myForm">
                    <div class='row'>
                       
                            <button class='button2' name='dodaj_comment' id="com" ><i class='far fa-comment-dots'></i><input type='hidden' name='comment' value="<?php echo $user['id']?>"/><span id="font">Comment</span></button>
                        </div>
                        </div>
                    </form>
                    <div class="row d-flex">
                        <div class="col-xl-12 bg-success ">
                            <form method="post">
                                <textarea id="form103" class="md-textarea form-control" rows="5" placeholder="Co słychać?" name="komentarz"></textarea>
                                <div>
                                    <?php echo $aabbcc ?? '' ?>
                                </div>
                                <div class="button">
                                    <button class="btn btn-danger mt-2" name='dodaj_comment'><input type='hidden' name='com'  value="<?php echo $user['id']?>"/>Publikuj</button>
                                </div>
                            </form>

                            <div>
                                <?php
                                <?php echo $user['post_comment.comment']?>"/>
                                ?>
                            </div>


                        </div>
                    </div>
                </div>
1

ON post.user_id=post_comment.post_id

Złączenia raczej powinno być post.id=post_comment.post_id

0
SELECT p.post_id, p.title, GROUP_CONCAT(pc.comment)
FROM post
LEFT JOIN post_comment pc ON pc.post_id = p.id
GROUP BY p.post_id

tam sobie dodaj swoje co masz a tabeli post i w post_comment i zoabcz co ci wyjdzie z tego zapytania a potem rozbudowywuj o kolejne.

0

a dlaczego nie zrobisz tego dwoma zapytaniami??

0

Ponieważ do wyświetlania używam pętli <?php foreach ($tweet->userData as $user) { ?>. Sory ale w kodzie na górze uciekło tę pętle, dlatego jej tam nie ma. I jeśli użyję drugiego zapytania,(muszę sworzyć drugą funkcję) to jak mam ją potem wyświetlić ?

1

użyć drugiej pętli w tej pierwszej pętli? Przecież top jest klasyczny przykład nagłówek - pozycje i tego się nie wyciąga jednym zapytaniem.

0

@abrakadaber: Czy taki kod nie będzie powodował że słowo drugi nie będzie się wyświetłało zbyt wiele razy ?

 <?php foreach ($tweet->userData as $user)
    { ?>
<div>Pierwszy</div>
 <?php foreach ($objekt->com as $komentarz)
    { ?>
<div>Drugi </div>
<?php  } ?>
 <?php } ?>


0

co to znaczy zbyt wiele razy? Wyświetli się tyle raz ile będzie komentarzy.

0

Najpierw zrób zapytania i stwórz dwie tablice lub obiekty z danymi. Potem wyświetl sobie te tablice to będziesz wiedział jak zrobić pętle w widoku.

0

@jurek1980: Stworzyłem coś takiego, ale wyświetla błąd** Warning: Undefined array key "comment" in** Widocznie coś źle tutaj robię, tylko nie mogę tego błędu znaleŹć.

public function display_comment()
    {
            $id = $_SESSION['id'];
            $comment = $this->data['comment'];
            $sql = $this->database->connect()->prepare("SELECT CONCAT(first_name,' ', last_name) as authors, comment, date_to_add from user join post_comment on user.id=post_comment.user_id where post_id = :comment");
            $sql->bindParam(':comment',$comment, PDO::PARAM_INT);
            $sql->execute();
            
        if($sql->rowCount())
        {
            $this->userData = [];

            while ($row = $sql->fetch())
            {
                $this->userData[] = $row;
            }
        }
    }
<?php foreach ($tweet->userData as $user)
    { ?>

            <div class='col-xl-8' id='posty'>
                <div class='row' id='time'>
                    <div class='btn-block d-flex justify-content-between'>
                        <div class='imie'>
                           <?php  echo $user['autor']    ?>
                            </div>
                        <div class='czas'>
                           <?php echo $user['date_to_add'] ?>
                            </div>
                        </div>
                    </div>
                <?php echo $user['comment'] ?>
                <form action='' method='post' id="myForm">
                    <div class='row'>
                        <div class='col-12 col-xl-12 d-flex justify-content-between' id='icon'>
                            <button class='button2' name='dodaj_like' style="background-color: <?php if($user['like_color']==1){echo '#00FA9A';}else{echo 'black';} ?>" ><i class='fas fa-heart' ></i><input type='hidden' name='like' value="<?php echo $user['id']?>" /><span id="font"><?php echo $user['likes']?></span></button>
                            <button class='button2' name='dodaj_dislike' style="background-color: <?php if($user['dislike_color']==1){echo '#00FA9A';}else{echo 'black';} ?>"><i class='fas fa-heart-broken'></i><input type='hidden' name='dislike' value="<?php echo $user['id']?>"/><span id="font"><?php echo $user['dislikes']?></span></button>
                            <button class='button2' name='dodaj_comment' id="com" ><i class='far fa-comment-dots'></i><input type='hidden' name='comment' value="<?php echo $user['id']?>"/><span id="font">Comment</span></button>
                            <button class='button2' name='dodaj_share' style="background-color: <?php if($user['share_color']==1){echo '#00FA9A';}else{echo 'black';} ?>" ><i class='far fa-share-square' ></i><input type='hidden' name='share' value="<?php echo $user['id']?>"/><span id="font"><?php echo $user['shares'] ?></span></button>
                        </div>
                        </div>
                    </form>
                    <div class="row d-flex">
                        <div class="col-xl-12 bg-success ">
                            <form method="post">
                                <textarea id="form103" class="md-textarea form-control" rows="5" placeholder="Co słychać?" name="komentarz"></textarea>
                                <div>
                                    <?php echo $aabbcc ?? '' ?>
                                </div>
                                <div class="button">
                                    <button class="btn btn-danger mt-2" name='dodaj_comment'><input type='hidden' name='com'  value="<?php echo $user['id']?>"/>Publikuj</button>
                                </div>

                            <div>
                                <?php $bot = $wyswietl->display_comment();?>
                                <?php foreach ($wyswietl->userData as $users)
                                { ?>
                                    <div>
                                        <?php echo $users['comment'] ?>
                                    </div>
                                <?php } ?>
                            </div>
                            </form>


                        </div>
                    </div>
                </div>

 <?php } ?>
0

No bo skąd te komentarze mogą się brać?
Zobacz coś takiego, pisane z palca, ale powinno Ci pokazać co i jak.

<?php
public function display_2()// nazwa funkcji nic nie mówi
{
    $id = $_GET['id'];
    $session = $_SESSION['id'];
    $this->userPosts = $this->getUsersPost($id,$session);
    $this->postComments = $this->getPostCommentsByUser($id,$session);
}

public function getUsersPost($id,$session)
{
    $sql = $this->database->connect()->prepare("SELECT post.id, CONCAT(first_name,' ', last_name) AS author FROM user JOIN post ON user.id = post.user_id  where post.user_id = :user_id order by post.id DESC");
    $sql->bindParam(':user_id',$id, PDO::PARAM_INT);
    $sql->bindParam(':id',$session, PDO::PARAM_INT);
    $sql->execute();
    $userData = [];
    if($sql->rowCount()) {
        while ($row = $sql->fetch()) {
            $userData[] = $row;
        }
    }

    return $userData;
}

public function getPostCommentsByUser($id,$session)
{
    // do poprawy kolumny potrzebne itd. na razie zostawiam gwiazdkę.
    // Jak masz inne kolumny to musisz tu poprawić
    // post.id as postID - żebyś widział, że grupujemy potem tablicę po ID postu
   // może nawet Joina nie będziesz musiał używać tylko pobrać same komentarze, Id postu przecież masz:) Grupujesz po coment.post_id
    $sql = $this->database->connect()->prepare("SELECT post.id as postId, * FROM post JOIN post_comment ON comment_post.id = post.id  where post.user_id = :user_id order by post.id DESC");
    $sql->bindParam(':user_id',$id, PDO::PARAM_INT);
    $sql->bindParam(':id',$session, PDO::PARAM_INT);
    $sql->execute();
    $postComments = [];
    if($sql->rowCount()) {
        while ($row = $sql->fetch()) {
            // tworzymy sobie tablice gdzie do id postu będą przypisane komentarze
            // Zwróć uwagę na tablicę, gdzie kluczem jest postID
            $postComments[$row['postId']][] = $row; 
        }
    }

    return $postComments;
}

// Widok
// opakuj to sobie w HTMLa. Ma Ci to pokazać zamysł.
foreach ($this->userPosts as $post){
    // Wyświeltalmy dane o poście np.
    echo $post['id'];
    // W drugiej pętli musi wyświetlić komentarze dla danego postu, ale mamy pogrupowane przez post_id
    foreach ($postComments[$post['id']] as $comment){
        // Wyświetlalmy komentarze
        echo $comment['id']; 
    }
}
0

Masz odpowiedz jak zrobic to w jednym zapytania po co drążysz i utrudniasz sobie ?

0

Kopiowałem to co miałeś wcześniej.
Bindujesz oba parametry to myślałem, że są do czegoś tam potrzebne. To tylko przykład nie pełny gotowiec.
Parametr przekazujesz przy jej wywołaniu.

$this->postComments = $this->getPostCommentsByUser($id,$session);// tu przekazujesz parametr przy wywołaniu metody
}
0

@jurek1980:
Przy pętli której zadaniem jest wyświetlenie komentarzy, wyświetla sporo błędów typu Warning: Undefined variable $post

Warning: Trying to access array offset on value of type null in

Warning: Undefined variable $postComments in

Warning: Trying to access array offset on value of type null in

Warning: foreach() argument must be of type array|object, null given in
Prawdopodobnie jest gdzieś błąd z nazwami, tylko pierwszy raz widzę taką pętlę foreach i ciężko mi się połapać w tym.

0

Wrzuć jak to teraz napisałeś. Masz jakieś dane jednak wyświetlane, czy tylko błędy?
Wrzuć też var_dump otrzymanych zapytań.

0

@jurek1980: To jest mój kod. Posty są wyświetlane prawidłowo, zmieniłem tylko w tej pętli $this-> na $obiekt. Problem pojawia się z komentarzami, które nie są wyświetlane tylko te błędy które napisałem we wcześniejszym poście.


$obiekt= new post($object, $_POST);
$wyswietl = $obiekt->display_2();



 <?php foreach ($obiekt->userPosts as $user)
    { ?>

            <div class='col-xl-8' >
                <div class='row' id='time'>
                    <div class='btn-block d-flex justify-content-between'>
                        <div>
                           <?php  echo $user['author']    ?>
                            </div>
                        <div>
                           <?php echo $user['date_to_add'] ?>
                            </div>
                        </div>
                    </div>
                <?php echo $user['comment'] ?>
                <form action='' method='post' id="myForm">
                    <div class='row'>
                        <div class='col-12 col-xl-12 d-flex justify-content-between'>
                            <button class='button2' name='dodaj_like' style="background-color: <?php if($user['like_color']==1){echo '#00FA9A';}else{echo 'black';} ?>" ><i class='fas fa-heart' ></i><input type='hidden' name='like' value="<?php echo $user['id']?>" /><span id="font"><?php echo $user['likes']?></span></button>
                            <button class='button2' name='dodaj_dislike' style="background-color: <?php if($user['dislike_color']==1){echo '#00FA9A';}else{echo 'black';} ?>"><i class='fas fa-heart-broken'></i><input type='hidden' name='dislike' value="<?php echo $user['id']?>"/><span id="font"><?php echo $user['dislikes']?></span></button>
                            <button class='button2' name='dodaj_comment' id="com" ><i class='far fa-comment-dots'></i><input type='hidden' name='comment' value="<?php echo $user['id']?>"/><span id="font">Comment</span></button>
                            <button class='button2' name='dodaj_share' style="background-color: <?php if($user['share_color']==1){echo '#00FA9A';}else{echo 'black';} ?>" ><i class='far fa-share-square' ></i><input type='hidden' name='share' value="<?php echo $user['id']?>"/><span id="font"><?php echo $user['shares'] ?></span></button>
                        </div>
                        </div>
                    </form>
                    <div class="row d-flex">
                        <div class="col-xl-12 bg-success ">
                            <form method="post">
                                <textarea id="form103" class="md-textarea form-control" rows="5" placeholder="Co słychać?" name="komentarz"></textarea>
                                <div>
                                    <?php echo $aabbcc ?? '' ?>
                                </div>
                                <div class="button">
                                    <button class="btn btn-danger mt-2" name='dodaj_comment'><input type='hidden' name='com'  value="<?php echo $user['id']?>"/>Publikuj</button>
                                </div>
                            </form>

                            <div>
                                <?php

                                foreach ($postComments[$post['id']] as $comment){
                                echo $comment['com'];
                                ?>
                            </div>
                            <?php } ?>

                        </div>
                    </div>
                </div>

 <?php } ?>
0

Jeśli nie zmieniłeś przypisania wartości to komentarze są w

$this->postComments

W takim razie powinieneś zmienić w pętli z
$postComments[$post['id]] na $obiekt->postComments[$post['id]]
Zobacz po tych zmianach.

0

Wszystkie błędy wskazują na pierwszą linijkę tego kodu.

   <?php

                                foreach ($obiekt->$postComments[$post['id']] as $comment){
                                echo $comment['id'];
                                ?>
                            </div>
                            <?php } ?>
0
$postComments[$row['postId']][] = $row; 

a nie powinno byc

$postComments[$row['postId']] = $row; 
0
$obiekt->$postComments[$post['id']]

Nie usunałeś znaku dolara. Za strzałka odwołujesz się do pola klasy. ->postComments

0

Dalej to samo, dodatkowo pojawił się nowy błąd o treści Warning: Undefined array key "" in

<?php
                                foreach ($obiekt->postComments[$post['id']] as $comment){
                                echo $comment['id'];
                                ?>
0

Ok. To lecimy dalej. Zamiast tego

$post['id']
//W 
$obiekt->postComments[$post['id']]

Musisz podać id potrzebnego postu.
Spróbuj sam odwołać się do odpowiedniego pola klasy. Musimy odwołać się do klucza tablicy podajc jego wartość.

0

Coś takiego, zniknekło kilka błędów, ale teraz pokazuje undefined array key i tutaj id postu

 <?php
                                foreach ($obiekt->postComments[$user['id']] as $comment){
                                echo $comment['id'];
                                ?>
                            </div>
                            <?php } ?>
0

Zrób var_dump i będziesz wiedział dokładnie jakie wartości masz w zmiennej.

//...
 <?php foreach ($obiekt->userPosts as $user)
    var_dump ($user);
//..
}

Jak wyświetlacz sobie pobrane dane to robisz to w ten sposób

php echo $user['date_to_add'] 

Czyli analogicznie powinieneś mieć możliwość wyświetlenie pobranego id postu

echo $user['id'] 

Var_dump powie Ci pod jakim kluczem to się znajduje.
Żeby się nie mieszało co gdzie jest możesz w select zrobić alias np.

SELECT post.id.as post_id --...

Wtedy masz czytelniej

$user['post_id']

Spróbuj, debuguj poprzez var_dump, po kolei się nauczysz i wszystko stanie się prostsze :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1