Jak zmienić kolor przycisku w php ?

0

Mam wyświetlone posty i chcę aby przycisk , dzięki któremu można polubić posta był czerwony jeżeli użytownik nie polubił jeszcze posta, oraz kolor żółty jeśli już polubił. Teraz wzystkie przyciski są czerwone mimo że niektóre posty polubiłem. Mozecie zerknąć na kod i zobaczyć gdzie jest błąd.

   public function colors()
    {
        $id = $_SESSION['id'];
        $like = $this->data['like'];
        $sql = $this->database->connect()->prepare("SELECT * FROM user JOIN post ON user.id = post.user_id JOIN post_like ON post.id = post_like.post_id where post.user_id = :user_id and post_id = :post_id group by post.id DESC");
        $sql->bindParam(':user_id', $id, PDO::PARAM_INT);
        $sql->bindParam(':post_id', $like, PDO::PARAM_INT);
        $sql->execute();

        if ($sql->rowCount()) {
            return "yellow";
        } else
            return "red";
    }
 <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 echo $color ?>"><i class='fas fa-heart'></i><input type='hidden' name='like' value="" onclick="myFunction()"/><span id="laiki"><?php echo $user['likes']?></span></button>
                            </div>
                            </div>
                            </form>
1

Prawdopodobnie:

 if ($sql->rowCount() > 0) {

albo:

if ($sql -> num_rows > 0) {
3

Jak wywołujesz tą funkcję i przekazujesz pod zmienną $color?
Lepiej ostylować to CSSem i np. zmieniać klasy dla przycisków niż na sztywno wstawiać kolor poprzez jego nazwę.

0

@jurek1980: $object= new color_post($object, $_POST);
$color = $object->colors();

3

Chodzi mi o to czy nie masz przypadkiem czegoś takiego, że wywołujesz to dla każdego rekordu, ale na końcu i tak masz ostatnią wartość.
Nie masz tam jakiejś pętli? Ten kod który wkleiłeś jest kompletny?

0

@jurek1980: Czy pętla foreach może być tego powodem, za jej pomocą wyświetlam posty.

  
    <?php foreach ($tweet->userData as $user)
    { ?>
<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 echo $color ?>"><i class='fas fa-heart'></i><input type='hidden' name='like' value="" onclick="myFunction()"/><span id="laiki"><?php echo $user['likes']?></span></button>
                            </div>
                            </div>
                            </form>
<?PHP } ?>
0

@veks21: Teraz wszystkie przyciski wyświetla na żółto nawet jak nie polubiłem posta, ale kiedy nacisnę przycisk posta którego nie polubiłem to wyświetla wtedy wszystkie przyciski na czerwono.

3

Bo zmienna $color przybiera gdzieś na koniec jedną wartość.
Popatrz tak:

$color  = 'blue';
foreach ($posts as $post)
{
    echo $color; // i zawsze będzie wynik blue, pętla tylko determinuje ile razy wyświetlisz wartość
}
0

@jurek1980: Na to wychodzi, ale pętla foreach musi tam być, pytanie czy jest jakiś sposób aby pomimo tej pętli wyświetlało odpowiednie kolory ?

3

Przypisuj kolor do postu.

// W logice
foreach ($posts as $post)
{
    $post['color'] => getColor($post);
}
// W prezentacji-HTMLU
foreach ($posts as $post)
{
   echo $post['color']; // i masz kolor zależny od wcześniejszego przypisania
}

Tylko pamiętaj, że jak w pętli będziesz wykonywał 100 zapytań select sprawdzających kolor do każdego postu to odbije się na wydajności.
Lepiej od razu spróbować to np. wpakować w SQL w którym pobierasz posty. Jednoznacznie nie poradzę bo nie wiem jak masz to wszystko teraz zrobione.

0

@jurek1980: Nie rozumiem twoiego kodu, napisałem dwie takie same pętle,

0

@jurek1980: To jest zapytanie gdzie wyświewtlam posty, oraz liczbę polubień, niepolubień i udostępnień. Rozumiem ze mam tamto zapytanie wrzucić w te pmiędzy SELECT I FROM jako podzapytanie, tylko jak wtedy mam zwrócić odpowiednie kolory ?

  $field5 = $_GET['id'];
        $sql = $this->database->connect()->prepare("SELECT post.id, CONCAT(first_name,' ', last_name) AS autor, comment, date_to_add, (select count(*)  from post_like WHERE post_like.post_id=post.id) as likes, (select count(*) from post_dislike WHERE post_dislike.post_id=post.id) as dislikes, (select count(*) from post_share WHERE post_share.post_id=post.id) as shares 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',$field5, PDO::PARAM_INT);
        $sql->execute();

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

                while ($row = $sql->fetch())
                {
                    $this->userData[] = $row;
                }
            }
        }
0

Powiem tak, ciężko wywnioskować jak masz zrobioną bazę. Jak możesz wrzuć jakieś schemat tabel, to może się coś wyklaruje.

0

eer6.PNG

0

Zamiast post like , dislike powinna byc tabela POST_ACTION i tam user_id, post_id i type gdzie typ pokazuje czy to like, dislike ,serce, czy smutek itd, no bo co do kazdej akcji bedziesz robil noewgo pivota ? po drugie tabela post powinna miec pola ile ma lajkow i jakiego typu czyli like_counter, dislike_counetr, heart_counter i powinno być to aktualizowane za kazdym razem gdy na poscie wykonywana jest akcja. Dzieki temu masz tanszy koszt pokazania z tabeli pola, niz za kazdym razem zliczanie lajkow z pivota.

Krok 1. Wybierasz wszystkie posty jakie chcesz pokazać. Zrob proste zapytanie sql
Krok 2. Dołącz do powyższego zapytania LEFT JOIN tabele post_like gdzie masz juz post_id z kroku 1 i ID_USERA z Session. tak ? wybeirasz post_like.id
Krok 3. Całe to gotowe zapytanie wyrzucasz do HTML np twoj wynik jest w zmiennej $posts.
Krok 4. Robisz petle po stronie HTML gdzie wysweitlasz wszystkie posty w prostej pętli

<?php foreach($posts as $post) ?>

Krok 5. Sprawdzasz czy post_like.id == null jesli null zostawiasz kolor czerwony jesli nie jest null zmieniasz na zolty czyli
robisz w CSS styl .yelow {color: yellow;} drugi .red {color: red;}
Krok 6. w html dajesz

<button class='button2' name='dodaj_like'  class="background-color: <?php echo ($post['post_like.id']) ? yellow : red ?>">....

Proste jest ?

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