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

Menadżer ciasteczek w PHP

Object Storage Arubacloud
0 głosów
486 wizyt
pytanie zadane 2 maja 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)

Witam, mam do napisania skrypt, który będzie czymś na wzór menadżera ciasteczek w php. Użytkownik ma mieć możliwość:

- Dodania nowego ciasteczka (z podaną nazwą, wartością i opcjonalnie datą),

- Wyświetlenie wszystkich ciasteczek,

- Edytowanie ciasteczka (w osobnym oknie),

- Usunięcie ciasteczka,

- Wyszukanie ciasteczka po nazwie lub wartości.

Nie ukrywam, że jest to dla mnie dosyć trudne zadanie. Mam już formularz, dzięki któremu można dodać nowe ciasteczko, lecz nie jestem pewien, czy podawanie daty i czasu przez pole "datatime local" to dobry sposób, ponieważ po przesłaniu wyświetla mi błąd dotyczący header'a. Do tego nie za bardzo wiem jak się zabrać za wyświetlanie i wyszukiwanie ciasteczek. Chciałem po prostu użyć pętli foreach, która wyświetlała by zawartość tablicy $_COOKIE, lecz nie mam pojęcia jak "wyjąć" z takiego ciastka nazwę oraz wartość. Byłbym bardzo wdzięczny, gdyby ktoś choć trochę mógłby pomóc mi w tym zadaniu. Z góry dziękuję. Mój dotychczasowy kod:

<!DOCTYPE html>
<html lang="pl-PL">
<head>
    <meta charset="UTF-8">
    <title>Ankieta</title>
</head>
<body>
    <form action="Zad5.7.2.php" method="post">
        <h3>Dodaj nowe ciasteczko:</h3>
        Nazwa: <input type="text" name="new_cookie_name"> <br> <br>
        Wartość: <input type="text" name="new_cookie_value"> <br> <br>
        Data wygaśnięcia (opcjonalnie): <input type="datetime-local" name="new_cookie_expired"> <br> <br>
        <input type="submit" name="add_new_cookie" value="Dodaj ciasteczko">
        <br> <br>
        <input type="submit" name="display_all_cookies" value="Wyświetl wszystkie ciasteczka">
    </form>

    <?php
        if(isset($_POST['add_new_cookie'])){
            if (isset($_POST['new_cookie_name']) && isset($_POST['new_cookie_value'])) {
               setcookie($_POST['new_cookie_name'], $_POST['new_cookie_value']);
            } elseif (isset($_POST['new_cookie_name']) && isset($_POST['new_cookie_value']) && isset($_POST['new_cookie_expired'])) {
                $data = strtotime($_POST['new_cookie_expired']);
                setcookie($_POST['new_cookie_name'], $_POST['new_cookie_value'], $data);
            } else {
                echo "<p style='color: red'>Brak danych dla nowego ciasteczka</p>";
            }
        }

        if(isset($_POST['display_all_cookies'])){
            foreach ($_COOKIE as $i) {
                echo $i . "\n";
            }
        }
    ?>
</body>
</html>

 

1 odpowiedź

+1 głos
odpowiedź 2 maja 2022 przez Comandeer Guru (603,480 p.)
wybrane 4 maja 2022 przez MKolaj15
 
Najlepsza

ponieważ po przesłaniu wyświetla mi błąd dotyczący header'a.

Jaki błąd?

Chciałem po prostu użyć pętli foreach, która wyświetlała by zawartość tablicy $_COOKIE, lecz nie mam pojęcia jak "wyjąć" z takiego ciastka nazwę oraz wartość

Zastosuj drugą odmianę składni foreach:

<?php
	$array = [
		'klucz' => 'wartość',
		'inny klucz' => 'inna wartość'
	];

	foreach ( $array as $key => $value ) {
		var_dump( 'nazwa', $key );
		var_dump( 'wartość', $value );
	}

 

komentarz 2 maja 2022 przez MKolaj15 Bywalec (2,270 p.)

Błąd to:

Warning: Cannot modify header information - headers already sent by (output started at C:\Users\kawcz\PhpstormProjects\Zadania\Zad5.7.2.php:1) in C:\Users\kawcz\PhpstormProjects\Zadania\Zad5.7.2.php on line 21

i skutecznie blokuje dodanie ciasteczek.

1
komentarz 2 maja 2022 przez Comandeer Guru (603,480 p.)

To akurat nie jest związane z tym, że masz tam pole do wyboru daty, a z tym, że wyświetlasz kod HTML przed wykonaniem kodu PHP. Bo wysłanie do przeglądarki choćby znaku z kodu HTML powoduje, że zostają wysłane nagłówki HTTP.

Ja bym to zrobił tak:

  1. Na samej górze pliku wrzucił kod odpowiedzialny za wykrycie przesłanego formularza i dodania ciasteczka.
  2. Gdyby tam wystąpił błąd, ustawiłbym zmienną $error na true, zamiast wyświetlać akapit z błędem.
  3. W miejscu, w którym masz obecnie ten kod, dałbym za to sprawdzenie, czy $error jest prawdą i jeśli tak, wyświetlił tam ten akapit.
komentarz 3 maja 2022 przez MKolaj15 Bywalec (2,270 p.)

Dzięki wielkie za pomoc, zrobiłem tak jak napisałeś i działa bez error'u, lecz błąd pojawia się w sytuacji, kiedy nie podaję żadnych danych w formularzu. Zamiast informacji "Brak danych dla nowego ciasteczka",  wyświetla się błąd:

Fatal error: Uncaught ValueError: setcookie(): Argument #1 ($name) cannot be empty in C:\Users\kawcz\PhpstormProjects\Zadania\Zad5.7.2\Zad5.7.2.php:4 Stack trace: #0 C:\Users\kawcz\PhpstormProjects\Zadania\Zad5.7.2\Zad5.7.2.php(4): setcookie('', '') #1 {main} thrown in C:\Users\kawcz\PhpstormProjects\Zadania\Zad5.7.2\Zad5.7.2.php on line 4

tak wygląda nowy kod:

<?php
    if(isset($_POST['add_new_cookie'])){
        if (isset($_POST['new_cookie_name']) && isset($_POST['new_cookie_value'])) {
            setcookie($_POST['new_cookie_name'], $_POST['new_cookie_value']);
        } elseif (isset($_POST['new_cookie_name']) && isset($_POST['new_cookie_value']) && isset($_POST['new_cookie_expired'])) {
            $data = strtotime($_POST['new_cookie_expired']);
            setcookie($_POST['new_cookie_name'], $_POST['new_cookie_value'], $data);
        } else {
            echo "<p style='color: red'>Brak danych dla nowego ciasteczka</p>";
        }
    }
?>
<!DOCTYPE html>
<html lang="pl-PL">
<head>
    <meta charset="UTF-8">
    <title>Ciastka</title>
</head>
<body>
    <form action="Zad5.7.2.php" method="post">
        <h3>Dodaj nowe ciasteczko:</h3>
        Nazwa: <input type="text" name="new_cookie_name"> <br> <br>
        Wartość: <input type="text" name="new_cookie_value"> <br> <br>
        Data wygaśnięcia (opcjonalnie): <input type="datetime-local" name="new_cookie_expired"> <br> <br>
        <input type="submit" name="add_new_cookie" value="Dodaj ciasteczko">
    </form>
    <br>
    <br>
    <hr>
    <br>
    <form action="Zad5.7.2.php" method="post">
        <input type="submit" name="display_all_cookies" value="Wyświetl wszystkie ciasteczka"> <br>
    </form>
    <?php
    if(isset($_POST['display_all_cookies'])){
        foreach ($_COOKIE as $key => $value) {
            echo "<p>nazwa: " . $key . ", wartość: " . $value . "</p>";
        }
    }
    ?>
    <br>
    <hr>
    <br>
    <a href="EditCookie.php" target="_blank">EDYTUJ CIASTECZKO</a>
    <br> <br>
    <hr>
    <br>
    <a href="DeleteCookie.php" target="_blank">USUŃ CIASTECZKO</a>
    <br> <br>
    <hr>
    <form action="Zad5.7.2.php" method="post">
        <h3>Podaj nazwę lub wartość ciasteczka:</h3>
        <input name="search_bar" type="text" placeholder="Wyszukaj ciasteczko...">
        <input name="search" type="submit" value="Szukaj">
    </form>
    <?php
        if(isset($_POST['search'])) {
            if (isset($_POST['search_bar'])) {
                foreach ($_COOKIE as $key => $value) {
                    if ($key == $_POST['search_bar'] || $value == $_POST['search_bar']) {
                        echo "<p>nazwa: " . $key . ", wartość: " . $value . "</p>";
                        exit();
                    }
                }
                echo "<p style='color: red'>Nie istnieje ciasteczko o podanej nazwie lub wartości</p>";
            }
        }
    ?>
</body>
</html>

 

1
komentarz 3 maja 2022 przez Comandeer Guru (603,480 p.)

Hm, a jakbyś zmienił warunki z isset( $nazwaZmiennej ) na !empty( $nazwaZmiennej ) (czyli sprawdzenie, czy zmienna istnieje i czy ma wartość)?

komentarz 4 maja 2022 przez MKolaj15 Bywalec (2,270 p.)
Super, jeszcze raz dzięki za pomoc, wszystko działa tak jak chciałem :)

Podobne pytania

0 głosów
1 odpowiedź 166 wizyt
pytanie zadane 9 października 2016 w PHP przez jimi Nowicjusz (220 p.)
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 19 września 2022 w HTML i CSS przez Hardwell Dyskutant (8,980 p.)
+1 głos
1 odpowiedź 251 wizyt
pytanie zadane 9 maja 2021 w PHP przez Filipczak Gaduła (4,020 p.)

92,761 zapytań

141,685 odpowiedzi

320,482 komentarzy

62,105 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

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!

...