Не могу разобраться с сессиями.

Serj190492

Новичок
Всем привет!
Начал разбираться с пхп,
В общем стоИт задача: вывести загадку на страницу. В случае верного ответа вывести следующую загадку. И так 4 штуки.

Вот такой код написал:

PHP:
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
if (!isset($_SESSION["otvet1"])) {
session_start();

}
?>

<h2>Во что гвоздь колотят?</h2>
<form action="/zadachi.php" method="POST">
<p>Введите ответ (одно или два слова, <b>только маленькие буквы!</b>):</p>
<p><input type= "text" name= "otvet1">
<input type= "submit" value= "Ok"></p>

<?php

$otvet1 = $_POST['otvet1'];

switch ($otvet1) {
case 'в шляпку':
echo ' Верно!!!';
$_SESSION["otvet1"] = 1;
break;
case 'шляпку':
echo ' Верно!!!';
$_SESSION["otvet1"] = 1;
break;
case 'в шляпу':
echo ' Верно!!!';
$_SESSION["otvet1"] = 1;
break;
case 'шляпу':
echo ' Верно!!!';
$_SESSION["otvet1"] = 1;
break;
case 'шляпка':
echo ' Верно!!!';
$_SESSION["otvet1"] = 1;
break;
case 'шляпа':
echo ' Верно!!!';
$_SESSION["otvet1"] = 1;
break;

default:

break;
}
echo $_SESSION['otvet1'];
if ($_SESSION['otvet1'] >= 1) {
echo '<h2>Кого бьют по голове, чтобы ровно шёл?</h2> <form action="/zadachi.php" method="POST"><p>Введите ответ (одно слово, <b>только маленькие буквы!</b>):</p><p><input type="text" name="otvet2"><input type="submit" value="Ok">';
$otvet2 = $_POST["otvet2"];
switch ($otvet2) {
case 'гвоздь':
echo ' Верно!!!';
$_SESSION["otvet2"] = 1;
$_SESSION["otvet1"] = 1;
break;
case 'гвоздик':
echo ' Верно!!!';
$_SESSION["otvet2"] = 1;
$_SESSION["otvet1"] = 1;
break;

default:

break;
}
Но после того, как во второй форме нажимаю кнопку "Ок" - пропадает вторая загадка, как будто переменная в сессии пропала...
 

daniyorik

Новичок
Если нет дефолта не обязательно писать, в сессию ты уже записал значение, значение будет храниться до тех пор пока сессия не уничтожится, 1 раз запиши и все,
для удобства просмотра используй, print_r или echo, и читай что в сессиях, я бы посоветовал на сабмит кнопку тоже name передать, затем проверять на установленность, и не надо в одном файле оба вопроса ставить, 1 вопрос 1 файл, и header'ами редиректи, там проверяй на ответы в прошлых вопросах, еще можно на ООП построить твои вопросы, тогда вообще шик будет, можно все в одном файле сделать, ну да ладно,
 

Serj190492

Новичок
Если нет дефолта...
Сделал вот так
PHP:
<?php

session_start();
if (!isset($_SESSION["c"])) {
    $_SESSION["c"] = 0;
 } 
 if ($_POST['otvet1'] == 'в шляпку' || $_POST['otvet1'] == 'шляпку' || $_POST['otvet1'] == 'в шляпу' || $_POST['otvet1'] =='шляпу' || $_POST['otvet1'] =='шляпка' || $_POST['otvet1'] =='шляпа') {
    header("location: http://php/zagadki2.php");
}

echo '<h2>Во что гвоздь колотят?</h2> 
<form action="/zagadki1.php" method="POST">
<p>Введите ответ (одно или два слова, <b>только маленькие буквы!</b>):</p>
<p><input type= "text" name= "otvet1"> 
<input type= "submit" name="ok1" value= "Ok"></p>';

$otvet1 = $_POST['otvet1'];

if (isset($_POST["ok1"])) {

    switch ($otvet1) {
        case 'в шляпку':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: http://php/zagadki2.php");
            break;
        case 'шляпку':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: /zagadki2.php");
            break;
        case 'в шляпу':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: /zagadki2.php");
            break;
        case 'шляпу':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: /zagadki2.php");
            break;
        case 'шляпка':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: /zagadki2.php");
            break;
        case 'шляпа':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: /zagadki2.php");
            break;
    }
}
теперь при правильном ответе на загадку идет перенаправление на следующую.
Можно этот редирект как-то упростить, или это нормальная конструкция?)
Пробовал вот так, тогда ругается, что не может модифицировать заголовок...
PHP:
switch ($otvet1) {
        case 'в шляпку':
            echo ' Верно!!!';
            $_SESSION["c"] = 1;
            header("location: http://php/zagadki2.php");
            break;
 

daniyorik

Новичок
Согласно правилам чистоты и красоты кода switch/case не используется в коде вообще, но эту тему можно пропустить, ты можешь написать функцию и ее вызывать, тогда у тебя из повторяющихся будет 1 строка а не 3 но в общем то пофиг же, почитай про технологию AJAX она по прикольнее для тебя будет, по крайней мере в данной задаче, с помощью нее можно все на одной странице бахнуть и добавить эффекты всякие, слайды там, ну а в общем конструкция работает и ладно)
 

Hello

Новичок
Согласно правилам чистоты и красоты кода switch/case не используется в коде вообще
Сможешь написать красивый и чистый вариант для if?
PHP:
        $a = 1;
        switch ($i) {
            default:
                return $a;
            case 4:
                $a *= 4;
                break;
            case 3:
                $a *= 3;
            case 2:
                $a *= 2;
            case 0:
                $a *= 1.1;
                break;
            case 1:
                $a *= 1.5;
        }
 

Serj190492

Новичок
почитай про технологию AJAX
В курсе, что такое есть. Но в изучение не вдавался) Пока что озадачился только изучением PHP. Можно сказать еще и не изучал совсем. Просто наткнулся на такую "задачку для программиста", правда она была для другого языка. Решил реализовать на PHP...
 

Vano

Новичок
Круто, это как баттл получается. Программинг баттл
 

daniyorik

Новичок

Serj190492

Новичок
ВСЕГДА if лучше свитча читается, и не путаешься в break))
Я изначально делал

PHP:
if ($_POST[otvet1] == "в шляпку"){
    echo "Верно!";
}

else {
    if ($_POST[otvet1] == "шляпку"){
        echo "Верно!";
    }
}

и т.д.
Но на другом форуме мне сказали, что вместо этого громадного if-а лучше свитч использовать)

Про варианты типо $multipliers = [1.1, 1.5, 2*1.1, 3*2*1.1, 4]; не думал, на такое решение опыта маловато.
 

WMix

герр M:)ller
Партнер клуба
PHP:
// это должно быть в базе данных по идеи, но можно поначалу и массивом
$quiz = [
  ['id' => 1, 'question' => 'Во что гвоздь колотят?', 'answers' => [
    ['id' => '1.1', 'answer' => 'в шляпку', 'is_right' => true],
    ...
  ],
  ...
];
 

WMix

герр M:)ller
Партнер клуба
да, но я не знаю твоей идеи (и не хочу). нужны ли аттрибуты id и is_right в ответах подумай сам.
а дальше, когда имеешь такую викторину, ее можно машинально обработать
 

Serj190492

Новичок
да, но я не знаю твоей идеи (и не хочу). нужны ли атрибуты id и is_right подумай сам.
а дальше, когда имеешь такую викторину, ее можно машинально обработать
Ок.
Получается мы создаем массивы $quiz и answers и теперь в нужном месте необходимо выводить нужные элементы?
 
Сверху