• 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
247 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 (254,880 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 (254,880 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 217 wizyt
0 głosów
0 odpowiedzi 113 wizyt
pytanie zadane 8 września 2020 w Android, Swift, Symbian przez PawełK Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 315 wizyt
pytanie zadane 22 lutego 2017 w SPOJ przez maria_d Nowicjusz (170 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!

...