• 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

Object Storage Arubacloud
0 głosów
155 wizyt
pytanie zadane 7 października 2023 w PHP przez Piotrek2713 Mądrala (5,380 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 (344,860 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 (270,190 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,380 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,380 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,380 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 (253,420 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 (344,860 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 (253,420 p.)
Też bym tak zrobił, ale OP z jakiegoś powodu chce trzymać to w sesji.
komentarz 8 października 2023 przez adrian17 Ekspert (344,860 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,380 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 (344,860 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,380 p.)
Ok, też myślę, że to będzie najlepsze rozwiązanie

Podobne pytania

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

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...