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

Petla foreach powiela kod po odświeżeniu strony

VPS Starter Arubacloud
0 głosów
190 wizyt
pytanie zadane 7 października 2023 w PHP przez Piotrek2713 Mądrala (5,500 p.)

Mam pętlę foreach

          <?php

            foreach($_SESSION['articles'] as $article)
            {
              echo '<div class="col-md-4 mb-3">';
              echo '<div class="card">';
              echo $article['article_photo'];
              echo '<div class="card-body">';
              echo '<h5 class="card-title">'.$article['Title'].'</h5>';
              echo '<a href="nauka-poprzez-sluchanie-dlaczego-jest-tak-wazna" class="btn btn-primary">Czytaj artykuł</a>';
              echo '</div> </div> </div>';

              $article->free_result;
            }

          ?>

Która wyświetla wszystkie artykuły na stronie głównej. Problem polega na tym, że po dświeżeniu strony kod html z pętli powiela się, przez co zamiast wyświetlać 2 divy o klasie col-md-4 wyświetla ich 4. Próbowałem już zmienić zmienną article ze zmiennej sesyjnej na zwykłą i nic. Funkcja free_result również zawiodła

Online

komentarz 8 października 2023 przez adrian17 Ekspert (349,240 p.)
Jednej rzeczy nie rozumiem... po co w ogóle wrzucasz te artykuły do sesji? Jeśli za każdym razem i tak o nie pytasz z bazy, to nie ma żadnego powodu by były w $_SESSION .

2 odpowiedzi

0 głosów
odpowiedź 7 października 2023 przez Wiciorny Ekspert (276,940 p.)
Generalnie , możliwe jest, że problem wynika z tego, że masz kilka sesji otwartych i każda z nich zawiera te same artykuły. Więc nie wiem jak zarządzasz sesją, ale żeby tego  uniknąć, musisz sprawdzić czy twoja kontrola nad sesją jest poprawnie zarządzana i zamykana, gdy nie jest już potrzebna np.

Zauwaz ze robisz forach i  artykuly w sesji .
komentarz 7 października 2023 przez Piotrek2713 Mądrala (5,500 p.)

Nie wiem co mam robić. Jestem początkujący w php

<?php
session_start();
require_once 'connect.php';

$connection = new mysqli($hostname, $db_user, $db_password, $db_name);

$connection->set_charset('utf8');

if ($connection->connect_errno != 0) {
    echo "Błąd Połączenia";
} else {
    $articles = array(); // Tworzymy pustą tablicę na artykuły

    $result = $connection->query("SELECT * FROM articles ORDER BY ID");

    if ($result) {
        while ($row = $result->fetch_assoc()) {
            $_SESSION['articles'][] = $row; // Dodajemy każdy artykuł do tablicy
        }
        $result->free_result();
    } else {
        echo "Błąd zapytania: " . $connection->error;
    }

    // Zamykamy połączenie z bazą danych
    $connection->close();
}
?>
<!DOCTYPE html>
<html lang="pl">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>La Palabra - Blog</title>
    <link rel="stylesheet" href="style.css">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
  </head>
  <body class="bg-secondary">
    <header class="header"></header>
    <main class="main-content">
      <div class="container-fluid">
        <div class="row">
          <?php

            foreach($_SESSION['articles'] as $article)
            {
              echo '<div class="col-md-4 mb-3">';
              echo '<div class="card">';
              echo $article['article_photo'];
              echo '<div class="card-body">';
              echo '<h5 class="card-title">'.$article['Title'].'</h5>';
              echo '<a href="nauka-poprzez-sluchanie-dlaczego-jest-tak-wazna" class="btn btn-primary">Czytaj artykuł</a>';
              echo '</div> </div> </div>';

              $_SESSION['articles']->free_result;
              $article->free_result;
            }

          ?>
        </div>
      </div>
    </main>
    <script src="main.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
  </body>
</html>

tak wygląda cały kod, nie widzę żeby problem wynikał z sesji

komentarz 7 października 2023 przez Piotrek2713 Mądrala (5,500 p.)

Mam

<?php
session_start();
require_once 'connect.php';

$connection = new mysqli($hostname, $db_user, $db_password, $db_name);

$connection->set_charset('utf8');

if ($connection->connect_errno != 0) {
    echo "Błąd Połączenia";
} else {
    $articles = array(); // Tworzymy pustą tablicę na artykuły

    $result = $connection->query("SELECT * FROM articles ORDER BY ID DESC");

    if ($result) {
        while ($row = $result->fetch_assoc()) {
            $_SESSION['articles'][] = $row; // Dodajemy każdy artykuł do tablicy
        }
        $result->free_result();
    } else {
        echo "Błąd zapytania: " . $connection->error;
    }

    // Zamykamy połączenie z bazą danych
    $connection->close();
}
?>
<!DOCTYPE html>
<html lang="pl">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>La Palabra - Blog</title>
    <link rel="stylesheet" href="style.css">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
  </head>
  <body class="bg-secondary">
    <header class="header"></header>
    <main class="main-content">
      <div class="container-fluid">
        <div class="row">
          <?php

            foreach($_SESSION['articles'] as $article)
            {
              echo '<div class="col-md-4 mb-3">';
              echo '<div class="card">';
              echo $article['article_photo'];
              echo '<div class="card-body">';
              echo '<h5 class="card-title">'.$article['Title'].'</h5>';
              echo '<a href="nauka-poprzez-sluchanie-dlaczego-jest-tak-wazna" class="btn btn-primary">Czytaj artykuł</a>';
              echo '</div> </div> </div>';

              unset($_SESSION['articles']);
              $article->free_result;
            }

          ?>
        </div>
      </div>
    </main>
    <script src="main.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
  </body>
</html>

 

komentarz 7 października 2023 przez Piotrek2713 Mądrala (5,500 p.)

To jednak nie działa, ponieważ usuwa mi artykuły ze zmiennej i strony z wpisami są puste

0 głosów
odpowiedź 7 października 2023 przez VBService Ekspert (255,800 p.)
edycja 7 października 2023 przez VBService
    $articles = array(); // Tworzymy pustą tablicę na artykuły
 
    $result = $connection->query("SELECT * FROM articles ORDER BY ID DESC");
 
    if ($result) {
        while ($row = $result->fetch_assoc()) {
            $_SESSION['articles'][] = $row; // Dodajemy każdy artykuł do tablicy
        }
        $result->free_result();
    } else {
        echo "Błąd zapytania: " . $connection->error;
    }

tworzysz pustą tablice $articles, której później w kodzie nie używasz.

Ten wpis usuń

$articles = array();

wpisz tak

    $result = $connection->query("SELECT * FROM articles ORDER BY ID DESC");
 
    if ($result) {
        unset($_SESSION['articles']); 
        while ($row = $result->fetch_assoc()) {
            $_SESSION['articles'][] = $row; // Dodajemy każdy artykuł do tablicy
        }
        $result->free_result();
    } else {
        echo "Błąd zapytania: " . $connection->error;
    }

 

w tym przypadku unset($_SESSION['articles'])

            foreach($_SESSION['articles'] as $article)
            {
              echo '<div class="col-md-4 mb-3">';
              echo '<div class="card">';
              echo $article['article_photo'];
              echo '<div class="card-body">';
              echo '<h5 class="card-title">'.$article['Title'].'</h5>';
              echo '<a href="nauka-poprzez-sluchanie-dlaczego-jest-tak-wazna" class="btn btn-primary">Czytaj artykuł</a>';
              echo '</div> </div> </div>';
 
              unset($_SESSION['articles']);
              $article->free_result;
            }

powinien być poza pętlą foreach

            foreach($_SESSION['articles'] as $article)
            {
              echo '<div class="col-md-4 mb-3">';
              echo '<div class="card">';
              echo $article['article_photo'];
              echo '<div class="card-body">';
              echo '<h5 class="card-title">'.$article['Title'].'</h5>';
              echo '<a href="nauka-poprzez-sluchanie-dlaczego-jest-tak-wazna" class="btn btn-primary">Czytaj artykuł</a>';
              echo '</div> </div> </div>';
            }

            unset($_SESSION['articles']);

 

komentarz 8 października 2023 przez adrian17 Ekspert (349,240 p.)

tworzysz pustą tablice $articles, której później w kodzie nie używasz.

Ten wpis usuń

Na moje oko na odwrót, powinien ją użyć zamiast bez dobrego powodu wrzucać wyniki zapytania do sesji.

komentarz 8 października 2023 przez VBService Ekspert (255,800 p.)
Też bym tak zrobił, ale OP z jakiegoś powodu chce trzymać to w sesji.
komentarz 8 października 2023 przez adrian17 Ekspert (349,240 p.)

Gdzie napisał że "z jakiegoś powodu chce"? Równie dobrze mógł przypadkiem od tego zacząć. Zrezstą: 

Próbowałem już zmienić zmienną article ze zmiennej sesyjnej na zwykłą

komentarz 8 października 2023 przez Piotrek2713 Mądrala (5,500 p.)

Też bym tak zrobił, ale OP z jakiegoś powodu chce trzymać to w sesji.

 Gdzie napisał że "z jakiegoś powodu chce"?

Chcę, ponieważ potrzebuję wyjąć kilka wartości tablicy na innych podstronach

Są one w bazie danych 

komentarz 8 października 2023 przez adrian17 Ekspert (349,240 p.)
Uhh to brzmi trochę dziwnie... normalnie, każda podstrona też by SQLem zapytała o to czego potrzebuje. To co zaproponowałeś (jedna strona ładuje, kolejna podstrona z tego korzysta) to zły pomysł z kilku pomysłów, np:

- pomysł sypie się, gdy ktoś bezpośrednio wejdzie na podstronę (np wpisze url w przeglądarkę albo zapisze zakładkę)

- masz problem inwalidacji cache'a, to znaczy - co jeśli to co zapisałeś w sesji już nie odpowiada rzeczywistości bo zawartość bazy się w międzyczasie zmieniła.

Więc ogólnie nie polecam ;) I sugeruję to w zwykłej zmiennej trzymać na czas jednego zapytania.
komentarz 8 października 2023 przez Piotrek2713 Mądrala (5,500 p.)
Ok, też myślę, że to będzie najlepsze rozwiązanie

Podobne pytania

+1 głos
2 odpowiedzi 475 wizyt
pytanie zadane 16 lipca 2021 w PHP przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
+1 głos
1 odpowiedź 711 wizyt
pytanie zadane 1 grudnia 2021 w PHP przez BarSki13 Obywatel (1,250 p.)
0 głosów
1 odpowiedź 919 wizyt
pytanie zadane 11 maja 2020 w PHP przez Bakkit Dyskutant (7,600 p.)

92,961 zapytań

141,922 odpowiedzi

321,158 komentarzy

62,295 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!

...