у меня проблема с добавлением простой функции запомнить меня в журнале php на моей странице? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь добавить простую функцию запомнить меня в мой код login.php:

    <?php
    session_start();

    if(isset($_SESSION["comp"])){
        header("location view.php");//to redirect to the view page if already logged
        return;
        }

    if (isset($_POST['cancel'])) {
        // Redirect the browser to index.php
        header("Location: index.php");
        return;}


    /*
    if(isset($_POST['name'])){
    // to save the name for the next page
    }
    */

    $_SESSION['comp']=false;
    $salt = 'XyZzy12*_';
    $stored_hash = hash('md5', 'XyZzy12*_php123'); //the hash of the password php123 with some salt on it 


    if(isset($_POST['login'])){  //when login is pressed

        $check = hash('md5', $salt . $_POST['pwd']); // to store the inserted password and compare it with the one that already stored\

        if(strlen($_POST['name']) < 1 ||strlen($_POST['email']) < 1 ||strlen($_POST['name']) < 1 ){
            // if the inputs are empty redirect to login.php
            $_SESSION['error'] = "PLEASE don't leave any blank fields";
            }

        elseif($check != $stored_hash){
            $_SESSION['error'] = "incorrect password";
            error_log("Login failed with ".$_POST['email']." using the password ".$_POST['pwd']);
            //header("Location: login.php");
        }   
        else{
            $_SESSION['success'] = "you are logged in ";
            $_SESSION['comp']=true;
            $_SESSION['prs']  =  $_POST['name']; 

            error_log("Login success ".$_POST['email']);
            header("Location: view.php");
            //return;
        }
        if(isset($_POST["stay"])){$_SEESION['loged']=true;}
        }
    ?>


    <!--the view code-->
    <!DOCTYPE html>
    <html>
    <head>
    <style>
    body {
        height: 1000px;
        background: linear-gradient(to top, #ff0000 0%, #ffcc00 100%);

        margin: 0;
        padding: 0;
    }
    h1{
        color : #000000;
        text-align : center;
        font-family: "SIMPSON";
    }

    form {
        width: 300px;
        margin: 0 auto;

    }

    </style>
    <title>logging in ....</title>
    </head>

    <body>

    <div class="container">
    <h1> Log in please :</h1>
    <?php
        if ( isset($_SESSION['error']) ) {
            echo('<p align= "center" style="color: red;">'.htmlentities($_SESSION['error'])."</p>\n");
            unset($_SESSION['error']);
        }
        ?>

          <form method="POST" action="login.php" >
           <table>
           <tr>
             <td>Name :</td> <td><input type="text" maxlength="40" name="name"></td><br>
            </tr>
            <tr>
             <td>Email :</td> <td><input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" ></td><br>
            </tr>
            <tr>
             <td>Password :</td> <td><input type="password" name="pwd"></td><br>
            </tr>
            <tr>
            <td></td><td><input type="radio" name="stay" value="1"> remember me<br>
            </tr>
            <tr>
             <td></td> <td><input align ="center"  type="submit"  name="login" value="login"> <input align ="center" type="submit" name="cancel" value="Cancel"></td><br>
            </tr>

           </table>
          </form>

    </body>

</html>

поэтому после ввода значений и установки флажка и отправки в систему, и он должен хранить некоторые данные в $ _SESSION тогда будет показана страница просмотра, но когда я вернусь на страницу login.php, ничего не происходит, и

header("location:view.php");

не работает. кто-нибудь, помогите мне и скажите мне, где я могу сделать изменения, чтобы заставить его работать. Я новичок в php, и это простой обучающий проект

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

должно быть header("location:view.php");

В вашем коде есть опечатка header("location view.php");

и isset($_SESSION["comp"]) будут справедливы и для $_SESSION["comp"]=false

Проверьте это http://php.net/manual/en/types.comparisons.php

Do: if(isset($_SESSION["comp"]) && $_SESSION["comp"]==true)

0 голосов
/ 02 ноября 2018

Хорошо, ваш тег местоположения заголовка неверен с одной стороны

header("location view.php");

Должно быть

header("location: view.php");

Тогда это return за пределами области действия действительно беспокоит меня, смеется. Это выглядит семантически неправильно. Я бы использовал exit как обычно.

Конечно, это может быть просто опечатка в вопросе, проверяя, что локально я получаю это

Внутренняя ошибка сервера

Сервер обнаружил внутреннюю ошибку или неверную конфигурацию и не смог выполнить ваш запрос.

Обратитесь к администратору сервера по адресу admin @ localhost , чтобы сообщить им о времени возникновения этой ошибки и действиях, которые вы выполнили непосредственно перед этой ошибкой.

Дополнительная информация об этой ошибке может быть доступна на сервере. Журнал ошибок .

Должен ли я связаться с ними и сообщить им об этом J / P

Используйте empty вместо isset для проверки логических значений.

 $foo = false;
 var_dump(isset($foo));  //true - it is set
 var_dump(empty($foo));  //true - it is empty 

Логически пустым является противоположность isset. Где вы проверяете isset вы проверяете не пустой. Я просто не хотел двойного негатива.

Тогда, если он не определен (либо один не выдаст ошибку)

 var_dump(isset($foo));  //false- it is not set
 var_dump(empty($foo));  //true - it is still empty 

Другими словами, если (эти два условия логически эквивалентны):

  $foo = false;
  if(isset($foo)) //passes
  if(!empty($foo)) //fails


  //$foo = false;  <-- when its not set
  if(isset($foo)) //fails
  if(!empty($foo)) //fails  (fails if its false and if its not set)

Таким образом, применяя это к вашему коду:

  if(isset($_SESSION["comp"])){
       header("location view.php");//to redirect to the view page if already logged
       return;
  }
  ...
  $_SESSION['comp']=false;

Когда вы загружаете страницу в следующий раз, $_SESSION['comp'] имеет значение false, но оно также установлено, поэтому условие if будет выполнено. Однако, если вы используете пустой, он будет вести себя так, как вы ожидаете. Надеюсь, мое объяснение имеет смысл выше, как только вы поймете, как это работает, оно станет очевидным.

Проблема с empty возникает, когда он используется для проверки таких вещей, как '', [] или 0, так как PHP свободно набирается и будет видеть все это как false и emtpy. Это имеет смысл, если вы действительно думаете об этом. [] - пустой массив, '' - пустая строка и 0 - пустое число. Но это может сбить вас с толку, если вы думаете empty = isset, поскольку они делают совершенно разные вещи. Даже если они несколько взаимозаменяемы.

ДРУГИЕ МАТЕРИАЛЫ

Параметр запомнить меня работает только в одном направлении, а именно, для сохранения файла cookie в браузере клиента. Сеанс использует свой собственный файл cookie, по умолчанию используется что-то вроде PHPSESSID (за это мы должны поблагодарить netscape). Чтобы понять, зачем вам нужен файл cookie, вы должны понимать, что каждый запрос к серверу не имеет состояния и является анонимным.

Поскольку нет ни состояния, ни способа (надежно) идентифицировать одного клиента от другого, мы используем cookie. Это просто часть данных, которые говорят, что я - это я, что сервер дает клиенту. Даже если вы никогда ничего не можете доверять клиенту, это дает нам возможность иметь постоянное хранилище на клиенте для клиента, чтобы идентифицировать их.

Вы не можете использовать сессию для запоминания, потому что время жизни сессии короткое, обычно около 30 минут. Кроме того, какой бы смысл, если бы их сессия никогда не заканчивалась, вам никогда не понадобился бы вариант запомнить меня, и мы бы не говорили об этом (текстовые сообщения).

При создании «простой» кнопки «помни меня» нужно учитывать целый ряд проблем безопасности. Многим для меня, чтобы покрыть в посте здесь. Тем не менее, сделать это правильно, на самом деле не намного сложнее, чем сделать это любым другим способом.

Когда-нибудь, когда я соберу свой сайт, я планирую опубликовать полнофункциональную систему пользователя в качестве учебного пособия по ней. Но поскольку PHP5 близится к исчезновению, я был занят, чтобы сделать что-нибудь (кроме исправления старых сайтов).

Приветствие.

0 голосов
/ 02 ноября 2018

Вы должны начать свою страницу view.php с session_start() в качестве первого шага. Везде, где вы хотите использовать сеансы, вы должны объявить это.

    <?php
session_start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...