【问题标题】:PDO: isset & session not workingPDO:isset 和会话不工作
【发布时间】:2014-05-05 15:31:34
【问题描述】:

我有一个密码保护页面,只能使用用户名和密码访问。一切都必须正确,但我没有!

这是我的表单 (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();
}

?>

【问题讨论】:

  • 您在 bindValue 时忘记了 : 符号
  • 该页面仍然可以访问,但问题在于 test.php 页面中的 (!isset($_SESSION['name']))。
  • 您在示例中设置了会话名称。此外,这是处理密码的**错误**方式。即使使用参数绑定和散列,也不应将密码传递给查询。
  • 你在哪里保存 $_SESSION 信息?也许您应该在用户成功登录时分配
  • $_POST['name'] = $_SESSION['name']; 然后if(isset($_SESSION['name']) &amp;&amp; !empty($_SESSION['name'])){ // do something } else { // do something else }

标签: php mysql forms pdo isset


【解决方案1】:

编辑

在您的index.php 文件中:

尝试将session_start(); $_SESSION['name'] = $_POST['name']; 放在$membre = $stmt-&gt;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 存储密码。不再推荐。

这里有一些密码存储选项:

其他链接:


会话:

这是一个关于会话的直观教程:

【讨论】:

  • 我猜你的意思是把它放在 test.php 中,而不是放在表格的顶部?顺便说一句,它不会返回任何东西,并且会话仍然不会被注销破坏..
  • 运行它,完全如图所示,输入用户名,您将看到它出现在顶部。 @KimF 然后您可以在所有页面中使用条件语句。这将检查会话是否已设置且不为空。您可以修改它以满足您的需要。回显的名称不会来自 POST,而是来自 SESSION 本身。
  • 重新加载我的答案,我已经让它更清楚了,我添加了现在你的新 test.php 文件。 @KimF
  • 是的,在 index.php 中我应该使用表单发布值,我应该将这些命令放在将值发送到数据库的代码之上吗?
  • 只有在您使用会话的情况下,才可以。 @KimF
猜你喜欢
  • 2011-08-16
  • 2012-02-13
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多