Скрипт PHP — выхода из системы не работает. Зарегистрирован, даже если переменная должна быть false

#php #session #login #session-variables #session-state

#php #сеанс #аутентификация #сеанс-переменные #состояние сеанса

Вопрос:

Мой php-код всегда входит в систему. Выход из системы также не работает. Должна быть какая-то ошибка lidde, которую я не могу обнаружить.

Я повторил $_SESSION[‘logged], и это всегда 1. Но $_POST[‘nam’] действительно пуст. Таким образом, он не сохраняет данные при открытии сайта. Функция if для истинного входа в систему также не разрешает true .

Извините, что публикую так много кода, но, может быть, это часть MySQL?

 if(isset($_POST['send'])) {

mysqli_connect($servername,$dbuser,$dbpw,$db,$port); //DB-Conn succesfull

      $query  =   "SELECT * FROM `users` WHERE `name` LIKE '$user' AND `pw` LIKE '$pw'";
      $result =   mysqli_query($con,$query) or die(mysqli_error($connection));
      $rows   =   mysqli_fetch_assoc($result);
      if($_POST['name']==$rows['name']) {
          $_SESSION['logged']    =   true;
          echo "Not triggering, still logged in";
      }
      else { $_SESSION['logged']    =   false;}

      if(isset($_POST['logout'])) {
          $_SESSION = array();
          session_destroy();
          $_SESSION['logged'] = false;}

     echo $_SESSION['logged']; //This is always 1
  }
  

Форма

           <?php     if($_SESSION['logged'] == false) {?>

                            <form method="post">
                                <input type="text" class="form-control" id="name" name="name" placeholder="abc">
                                <input type="password" class="form-control" id="pw" name="pw" placeholder="xyz">
                              <button type="submit" name="send">Login</button>
                            </form>        
            <?php ;}
            else {?>
                    <form method="post">
                      <button type="submit" id="logout" name="logout">Logout</button>
                    </form>

            <?php }
            ?>

  

Комментарии:

1. Нет причины?

2. Это не так много кода, скорее, его слишком мало. Я не могу найти реальную ошибку в этом коде. Вы знаете о SQL-инъекции ?

3. Покажите нам свою форму, чтобы мы могли видеть, что send и logout там на самом деле есть. Если это обе кнопки отправки, то, конечно, ваша логика не работает, потому что ни одна форма не отправляется при одновременном нажатии двух кнопок отправки, что даже технически невозможно.

4. Отсутствие причины означает, что $_SESSION[‘logged’] имеет значение true, даже если нет кода, который устанавливает его в true . Я имею в виду, я не могу найти эту часть :/

5. Это для школьного проекта, защита от SQL-инъекций появится позже 🙂

Ответ №1:

Как вы можете видеть, вы оборачиваете весь скрипт в if ($_POST["send"]) инструкции

Но в вашей форме $_POST["send"] он будет существовать только в форме входа, а не в форме выхода.

Ответ №2:

Это возможно только потому if(isset($_POST['logout'])) { , что не вычисляется как true .

Часть не выполняется. Я думаю, у вас нет $_POST['logout'] , но $_GET['logout'] или внутри вашего <form> the <input name='logout'> не имеет значения.

Невозможно, чтобы переменная, установленная true в, была false правой в следующей строке.

Существует очень, очень небольшая вероятность состояния гонки, если вы используете сеансы, которые не заблокированы во время запроса, что по умолчанию, когда вы используете HHVM вместо PHP, например, — но я сомневаюсь, что в вашем случае.

Комментарии:

1. добавил форму, надеюсь, это поможет. И спасибо за быстрый ответ

2.Послушайте, я дал вам правильный ответ за пять минут до того, как вы покажете фактическую форму 😉 $_POST['logout'] не задан — он не имеет значения.

3. И это $_Post

4. Также из-за того, что говорит Гровер. У вас нет $_POST['send'] выхода <form> из системы.

5. Это было еще проще. У меня было условие выхода из системы, если оно было заключено в условие входа в систему. Я имею в виду, технически вы были правы, конечно, и спасибо вам за это 🙂

Ответ №3:

В этом случае вы пропустили какую-то команду.Я исправил, как показано ниже.Сеанс ничего не сохранит после выполнения session_destroy .

 <?php
if(!isset($_SESSION))
    session_start();
if (isset($_POST['send']))
{
    $rows['name']="Done";
    if ($_POST['name'] == $rows['name']) {
        $_SESSION['logged']    =   true;
        echo "Not triggering, still logged in <br/>";
    } else {
        $_SESSION['logged']    =   false;
    }
}

if (isset($_POST['logout'])) 
{
    $_SESSION = array();
    $_SESSION['logged'] = false;
    unset($_SESSION['logged']);
    session_destroy();
}
echo(isset($_SESSION['logged']) amp;amp; ($_SESSION['logged']))? 'true' : 'false';
?>
<?php if(!isset($_SESSION['logged']) || !($_SESSION['logged'])) { ?>

    <form method="post" action="">
        <input type="text" class="form-control" id="name" name="name" placeholder="abc">
        <input type="password" class="form-control" id="pw" name="pw" placeholder="xyz">
        <button type="submit" name="send">Login</button>
    </form>
<?php
} else { ?>
    <form method="post" action="">
        <button type="submit" id="logout" name="logout">Logout</button>
    </form>
<?php }
?>