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

Blokowanie możliwości udzielenia odpowiedzi po raz kolejny używając cookies

Object Storage Arubacloud
+1 głos
232 wizyt
pytanie zadane 25 kwietnia 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)

Witam, ma do napisania skrypt, który wyświetli ankietę i sprawi, że po raz udzielonej odpowiedzi, nie będziemy mieli możliwości odpowiedzieć po raz kolejny (domyślnie ma zniknąć przycisk "Prześlij" oraz pojawić się odpowiedni komunikat. Ma to być wykonane za pomocą $_COOKIE, które ma wygasać po godzinie. Oto mój kod:

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Ankieta</title>
</head>
<body>
    <?php
        if(!isset($_COOKIE['odpowiedz'])){
            echo "<form method='post' action='Zad2.7.2.php'>";
            echo "Kto stworzył Linuxa? <br>";
            echo "<select name='ankieta'>";
            echo "<option value='Elon'>Elon Musk</option>";
            echo "<option value='Mareczek'>Mark Zuckerberg</option>";
            echo "<option value='Linus'>Linus Torvalds</option>";
            echo "<option value='Bill'>Bill Gates</option>";
            echo "</select>";
            echo "<br><br>";
            echo "<input type='submit' name='przeslij'>";
            echo "<br>";
            echo "</form>";
            setcookie('odpowiedz', true, time() + 60 * 60);
        } else {
            echo "<form method='post' action='Zad2.7.2.php'>";
            echo "Kto stworzył Linuxa? <br>";
            echo "<select name='ankieta'>";
            echo "<option value='Elon'>Elon Musk</option>";
            echo "<option value='Mareczek'>Mark Zuckerberg</option>";
            echo "<option value='Linus'>Linus Torvalds</option>";
            echo "<option value='Bill'>Bill Gates</option>";
            echo "</select>";
            echo "</form>";
            echo "Odpowiedziałeś już na tą ankietę.";
        }
    ?>
</body>
</html>

Czy ktoś byłby w stanie pomóc mi w jego poprawieniu? Nie do końca wiem jak to poprawnie zrobić. Moim pomysłem, była instrukcja warunkowa, która najpierw sprawdza czy nasze ciasteczko jest już ustawione, jeśli nie mamy możliwość udzielenia odpowiedzi i wywołujemy setcookie, jeśli tak, przycisk Prześlij znika i mamy komunikat. Niestety to nie działa. Z góry dziękuję za pomoc.

1 odpowiedź

+2 głosów
odpowiedź 25 kwietnia 2022 przez VBService Ekspert (252,740 p.)
wybrane 25 kwietnia 2022 przez MKolaj15
 
Najlepsza

Twój sposób działa, tylko to powtórzenie kodu formularza 2 razy i użycie tyle razy echo dobrze by było coś z tym zrobić.

 

propozycja zmian (dodałem podziękowanie za wypełnienie ankiety smiley )

<!DOCTYPE html>
<html lang="pl-PL">
<head>
    <meta charset="UTF-8">
    <title>Ankieta</title>
</head>
<body>
    <form method="post" action="Zad2.7.2.php">
        <label for="ankieta">Kto stworzył Linuxa?</label>
        <select id="ankieta" name="ankieta">
            <option value="Elon">Elon Musk</option>
            <option value="Mareczek">Mark Zuckerberg</option>
            <option value="Linus">Linus Torvalds</option>
            <option value="Bill">Bill Gates</option>
        </select>
<?php if(!isset($_COOKIE['odpowiedz'])): ?>
        <?php setcookie('odpowiedz', 1, time() + 3600); ?> 
        <input type="submit" name="submit" value="Prześlij">
<?php elseif ($_COOKIE['odpowiedz'] == 1): ?>
        <?php setcookie('odpowiedz', 2, time() + 3600); ?> 
        <p>Dziękujemy za udzielenie odpowiedzi.</p>
<?php else: ?>
        <p>Odpowiedziałeś już na tę ankietę.</p>
<?php endif; ?>
    </form>
</body>
</html>

 

lub

<?php
  $code = [
    '<input type="submit" name="submit" value="Prześlij">',
    '<p>Dziękujemy za udzielenie odpowiedzi.</p>',
    '<p>Odpowiedziałeś już na tę ankietę.</p>'
  ];

  if (!isset($_COOKIE['odpowiedz'])) {
    setcookie('odpowiedz', 1, time() + 3600);
    $index = 0;
  } elseif ($_COOKIE['odpowiedz'] == 1) {
    setcookie('odpowiedz', 2, time() + 3600);
    $index = 1;
  } else {
    $index = 2;
  }
?>
<!DOCTYPE html>
<html lang="pl-PL">
<head>
    <meta charset="UTF-8">
    <title>Ankieta</title>

    <style>
      label, select, input {
        display: block;
        margin-bottom: 0.5em;
      }
    </style>
</head>
<body>
    <form method="post" action="Zad2.7.2.php">
        <label for="ankieta">Kto stworzył Linuxa?</label>
        <select id="ankieta" name="ankieta">
            <option value="Elon">Elon Musk</option>
            <option value="Mareczek">Mark Zuckerberg</option>
            <option value="Linus">Linus Torvalds</option>
            <option value="Bill">Bill Gates</option>
        </select>
        <?php echo $code[$index ?? 0]; ?>
    </form>
</body>
</html>

 

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

Hej, wielkie dzięki za odpowiedź, ale pojawia mi się taki error i nie za bardzo wiem co oznacza:

1
komentarz 25 kwietnia 2022 przez VBService Ekspert (252,740 p.)

Dodałem drugi przykład powinien być bardziej "czytelny".

A pierwszy można "ulepszyć/naprawić" np. tak

<?php ob_start(); ?>
<!DOCTYPE html>
<html lang="pl-PL">
<head>
    <meta charset="UTF-8">
    <title>Ankieta</title>
</head>
<body>
    <form method="post" action="Zad2.7.2.php">
        <label for="ankieta">Kto stworzył Linuxa?</label>
        <select id="ankieta" name="ankieta">
            <option value="Elon">Elon Musk</option>
            <option value="Mareczek">Mark Zuckerberg</option>
            <option value="Linus">Linus Torvalds</option>
            <option value="Bill">Bill Gates</option>
        </select>
<?php if(!isset($_COOKIE['odpowiedz'])): ?>
        <?php setcookie('odpowiedz', 1, time() + 3600); ?> 
        <input type="submit" name="submit" value="Prześlij">
<?php elseif ($_COOKIE['odpowiedz'] == 1): ?>
        <?php setcookie('odpowiedz', 2, time() + 3600); ?> 
        <p>Dziękujemy za udzielenie odpowiedzi.</p>
<?php else: ?>
        <p>Odpowiedziałeś już na tę ankietę.</p>
<?php endif; ?>
    </form>
</body>
</html>
<?php ob_end_flush(); ?>

 

P.S. Output Control Functionsob_start()ob_end_flush()

1
komentarz 25 kwietnia 2022 przez MKolaj15 Bywalec (2,270 p.)

Wielkie dzięki za pomoc, wszystko działa i chyba wszystko rozumiem laugh

Podobne pytania

0 głosów
2 odpowiedzi 211 wizyt
0 głosów
0 odpowiedzi 105 wizyt
pytanie zadane 8 września 2020 w Android, Swift, Symbian przez PawełK Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 282 wizyt
pytanie zadane 22 lutego 2017 w SPOJ przez maria_d Nowicjusz (170 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...