PDO: isset и сеанс не работают

У меня есть защищенная паролем страница, доступ к которой возможен только с помощью имени пользователя и пароля. Все должно быть правильно, но это не так!

это моя форма (index.php) и pdo:

<?php
if (isset($_POST['name'], $_POST['password'])) {

    $dns = "mysql:host=localhost;dbname=department_c";
    $option = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8');
    try{
        $pdo = new PDO($dns, "root", "", $option);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e){
        die("Erreur de connection.");
    }

    $sql="SELECT * FROM admin WHERE name = :name AND password = MD5(:password)";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue('name', $_POST['name']);
    $stmt->bindValue('password', $_POST['password']);
    $stmt->execute();

    $nbMembre = $stmt->rowCount();

    if($nbMembre == 1){
        $membre = $stmt->fetch(PDO::FETCH_ASSOC);
        header("location:test.php");
    } else {
        $msg="<font color='orange'>Enter username and  password.</font>";
    }
} else {
    $msg ="<font color='red'>Lgon!</font>";
}

?>
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<meta charset="UTF-8" />
</head>
<body>
<form action="" method="post">
<label for="name">Username: </label>
<input type="text" name="name" /><br/>
<label for="password">Passwprd: </label>
<input type="password" name="password" /><br/>
<input type="submit" value="login" />
</form>
<p><?php echo $msg; ?></p>
</body>
</html>

и это моя тестовая страница. он должен быть защищен и доступен с помощью имени пользователя и пароля. без if(!isset($_SESSION['name'])) или если поставить как if(isset($_SESSION['name'])) я захожу на страницу, а с !isset не могу!

Вот код (test.php):

<?php
session_start();
require 'connect.php';
if(!isset($_SESSION['name'])){
header("location:index.php");
exit();
    }
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
</head>
<body>
<header>
</div>
wellcome
Hellos-.....
<br>
<a href="logout.php"><h2>Logout</h2></a>
</div>
</body>
</html>

и вот мой код выхода (logout.php):

<?php
session_start();
$_SESSION = array();
session_destroy();
if(!isset($_SESSION['name'])){
 header("location:index.php");
}else{
 echo"<h2> There was a problem with logging out!</h2>";
 exit();
}

?>

person KimF    schedule 26.03.2014    source источник
comment
вы забыли символ : при привязке значения   -  person Olvathar    schedule 27.03.2014
comment
к странице все равно обращаются, но проблема связана с (!isset($_SESSION['name'])) на странице test.php.   -  person KimF    schedule 27.03.2014
comment
Вы не устанавливаете имя сеанса в примере. Кроме того, это ** неправильный** способ обработки паролей. Вы не должны передавать пароли в запросы, даже с привязкой параметров и хешированием.   -  person Anthony    schedule 27.03.2014
comment
где вы сохраняете информацию $_SESSION? Возможно, вам следует назначить, когда пользователь успешно войдет в систему   -  person Olvathar    schedule 27.03.2014
comment
$_POST['name'] = $_SESSION['name']; затем сделайте if(isset($_SESSION['name']) && !empty($_SESSION['name'])){ // do something } else { // do something else }   -  person Funk Forty Niner    schedule 27.03.2014
comment
Я перехожу на страницу, но она возвращает эту ошибку. Примечание: Неопределенный индекс: имя в C:\xampp\htdocs\test\test.php в строке 4. а также выход из системы не уничтожает сеанс!   -  person KimF    schedule 27.03.2014
comment
@ Энтони: я новичок, поэтому я не знаю, как мне установить пароль. так что посоветуете?   -  person KimF    schedule 27.03.2014
comment
Проконсультируйтесь с моим ответом ниже. @KimF Опирайтесь на это. Кроме того, добавлена ​​дополнительная информация о выбранном вами методе хранения паролей.   -  person Funk Forty Niner    schedule 27.03.2014


Ответы (1)


Редактировать

В вашем файле index.php:

Попробуйте поставить session_start(); $_SESSION['name'] = $_POST['name']; между $membre = $stmt->fetch(PDO::FETCH_ASSOC); и header("location:test.php");, а затем следуйте условным операторам, которые я поставил в своем первоначальном ответе.

Это я тестировал и работал у меня:

...

    if($nbMembre == 1){
        $membre = $stmt->fetch(PDO::FETCH_ASSOC);
        
// my addition

session_start();
$_SESSION['name'] = $_POST['name'];

        header("location:test.php");
    } else {
        $msg="<font color='orange'>Enter username and password.</font>";
    }
} else {
    $msg ="<font color='red'>Lgon!</font>";
}

...
// rest of code

Оригинальный ответ

Основывайтесь на следующем: (тестовый код работает как один файл)

Назначьте переменную элементу POST формы, затем назначьте имя сеанса из файла $_POST.

Это будет считаться вашей страницей входа:

<?php
session_start();
// require 'connect.php';

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

    $name = $_POST['name'];
    $_SESSION['name'] = $_POST['name'];

if(isset($_SESSION['name']) && !empty($_SESSION['name'])){

    echo "session is set";
    echo "<br>";
    echo $name;

    } else  { 

        echo "session is NOT set";

            }

       } // brace for if(isset($_POST['submit']))
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
</head>
<body>

<form action="" method="post">
<label for="name">Username: </label>
<input type="text" name="name" /><br/>
<label for="password">Password: </label>
<input type="password" name="password" /><br/>
<input type="submit" name="submit" value="TEST" />

</form>
</body>
</html>

Тогда это ваш test.php в том виде, в котором он у вас есть сейчас.

<?php
session_start();
require 'connect.php';

    if(isset($_SESSION['name']) && !empty($_SESSION['name'])){

        echo "session is set";
        echo "<br>";
        echo $name;

        } else  { 

        //  echo "session is NOT set";
         header("location:index.php");

                }
/* old method
if(!isset($_SESSION['name'])){
header("location:index.php");
exit();
    }
*/

?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
</head>
<body>
<header>
</div>
wellcome
Hellos-.....
<br>
<a href="logout.php"><h2>Logout</h2></a>
</div>
</body>
</html>

Пароли:

Я также заметил, что вы храните пароли, используя MD5. Это больше не рекомендуется.

Вот несколько вариантов хранения паролей:

Другие ссылки:


Сеансы:

Вот интуитивно понятное руководство по сеансам:

person Funk Forty Niner    schedule 26.03.2014
comment
Я думаю, вы хотите поместить его в test.php, а не в верхнюю часть формы? Кстати, он ничего не возвращает, и сеанс все еще не уничтожается выходом из системы. - person KimF; 27.03.2014
comment
Запустите его точно так, как показано, и ничего больше, введите имя пользователя, и вы увидите, что оно появится сверху. @KimF Затем вы можете использовать условный оператор на всей своей странице. Это проверит, установлен ли сеанс и не пуст. Вы можете изменить его в соответствии с вашими потребностями. Эхо-имя будет получено не из POST, а из самого SESSION. - person Funk Forty Niner; 27.03.2014
comment
Перезагрузите мой ответ, я сделал его немного яснее и добавил то, что теперь будет вашим новым файлом test.php. @КимФ - person Funk Forty Niner; 27.03.2014
comment
ДА, в index.php я должен публиковать значения с формой, должен ли я помещать эту команду поверх кода, который отправляет значения в БД? - person KimF; 27.03.2014
comment
Только если вы будете использовать сеансы для этого, да. @КимФ - person Funk Forty Niner; 27.03.2014
comment
Итак, это решило проблему? @KimF Я склонен думать, что да. - person Funk Forty Niner; 27.03.2014
comment
Из этого долгого периода молчания я понял, что это либо работает для вас, и вы прекрасно проводите время, либо нет, и вы пытаетесь понять, как заставить это работать. Если это решило вашу проблему, отметьте мой ответ как принятый, чтобы мы могли его закрыть. @KimF В противном случае он останется в категории без ответа. - person Funk Forty Niner; 27.03.2014
comment
к сожалению пока не работает. Я поместил это в свой код несколькими способами, но ничего не изменил! - person KimF; 27.03.2014
comment
Попробуйте поставить $_SESSION['name'] = $_POST['name']; между $membre = $stmt->fetch(PDO::FETCH_ASSOC); и header("location:test.php");, затем следуйте условным операторам, которые я указал в своем ответе @KimF - person Funk Forty Niner; 27.03.2014
comment
отлично, это работает, за исключением того, что возвращает эту ошибку. Примечание: Неопределенный индекс: имя в C:\xampp\htdocs\test\test.php в строке 6.... я могу исправить это сам, спасибо за вашу помощь. и подскажите, пожалуйста, как преобразовать MD5 в crypt() для моего пароля? большое спасибо дружище :) - person KimF; 27.03.2014
comment
Пожалуйста, рад, что все получилось. Посмотрите на ссылки в разделе Пароли в моем ответе. У меня есть ответ, который я дал кому-то другому о проблеме, связанной с паролем. Как только найду, включу сюда. @КимФ - person Funk Forty Niner; 27.03.2014
comment
Пожалуйста. Взгляните на this question, где вы можете использовать функцию генерации пароля, а затем просмотрите my answer на той же странице. Там все есть. @KimF Если это работает для вас, вы можете +1 ответить, но не обязательно. - person Funk Forty Niner; 27.03.2014