繁体   English   中英

php使用pdo简单登录系统的问题

[英]php using pdo simple login system issues

 <?php
if(isset($_POST["submit"])){
require 'Config.php';

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    try {
      $Name = $_POST['Name'];
      $Password = $_POST['Password'];
      $message ="";

      $stmt = $conn->prepare("SELECT COUNT(*) FROM user WHERE Name='$Name' and Password='$Password'");
      $stmt->execute();
      $result = $stmt->fetchcolumn();

         if($result > 0)
         {
           $_SESSION['Logged In'] = $Name;
           $_SESSION['Logged In'] = $Password;
           if(isset($_SESSION['Logged In']))
             {
                 echo $result;
                 session_start();
                 header('Location: Main.php');
                 exit();
             }
         }
         elseif($result == 0)
         {
             echo $result;
             echo "Invalid Username or Password";
         }
    }
   catch(PDOException $e)
   {
    echo $e->getMessage();
   }
   $conn = null;
  }
?>

我需要这个简单的登录系统的帮助,如果我注释掉标题重定向后,回显结果显示当我将重定向放入页面中时,我只会得到1个结果,只是刷新而不是转到下一页。

此代码中有一些简单的问题

首先,您必须先开始会话,然后再进行任何操作。 实际上,最好先在每个脚本的顶部启动它,然后再执行其他操作。

另外,由于在运行标头之前已向浏览器回显了某些内容,因此这将是一个探究。 必须在任何页面数据之前发送标题。

另外,您的代码也容易受到SQL注入的影响,因此请使用准备好的和参数化的查询来避免这种情况。

您似乎也在数据库中存储了纯文本密码。 另一个大无

PHP提供password_hash()password_verify()请使用它们。 这是关于密码的一些好主意。如果您使用的是5.5之前的PHP版本, 那么这里提供了一个兼容包

<?php
session_start();
if(isset($_POST["submit"])){

    require 'Config.php';

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    try {

        $stmt = $conn->prepare("SELECT Password 
                                FROM user 
                                WHERE Name=:name");

        $params = array(':name'=>$_POST['Name'])
        $stmt->execute($params);
        $hashedPassword = $stmt->fetchcolumn();

        if(password_verify($_POST['Password'], $hashedPassword) ) {
            $_SESSION['Logged In'] = $_POST['Name'];

            // bad idea putting password in a session
            //$_SESSION['Logged In'] = $Password;

            // you just set this data so the if is unnecessary
            //if(isset($_SESSION['Logged In'])) {

            // cannot echo anything before doing a header()
            // any way if the header works you wont see this data 
            // anyway as a new page will be being loaded
            //echo $result;
            header('Location: Main.php');
            exit;
         } else {
            echo $result;
            echo "Invalid Username or Password";
     }
    catch(PDOException $e) {
        echo $e->getMessage();
    }
    $conn = null;
}
?>

由于此操作现在使用哈希密码,因此您将必须重新创建用户,并且在使用时必须使用

$passwordToPutOnDatabase = password_hash($thepassword);

您的代码可能存在问题,您以纯文本格式存储密码,这是完全错误的,您应该使用password_hash()password_verify()

我为您制作了一个简单的登录/注册脚本,该脚本将向您展示如何使用password_hash和password_verify()

simple_register.php

<?php

    require 'db_config.php';
    if(isset($_POST['register'])){

        //validate email and password I'm not gonna do that for you



        $password = $_POST['upass']; // when u done with validation
        $email = $_POST['username'];



        $hash = password_hash($password,PASSWORD_DEFAULT); //hash password

        try {

                $stmt = $conn->prepare("INSERT INTO users (username,password) VALUES ( ?,?)");
                if($stmt->execute(array($email,$hash))){

                    echo "user registered";
                }else{

                    echo "could not register"; // something wrong with your query check error log
                }

        } catch (Exception $e) {

            error_log($e->getMessage());

        }

    }

?>


<!DOCTYPE html>
<html>
<head>
    <title>Simple PDO Registration</title>
</head>
<body>


<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">


    <p><input type="email" name="username" placeholder="Enter your email"></p>
    <p><input type="password" name="upass" placeholder="Enter password"></p>

    <button type="submit" name="register">Register</button>



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

login.php

<?php
    ob_start();
    session_start();
    require 'db_config.php';

if (isset($_SESSION['loggedin'])) {

    header("location:users/dashboard.php");
} else {


    $loginMessage = "";
    $msg_class    = "";

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


        if (empty($_POST['email']) || empty($_POST['upass'])) {

            $loginMessage = "Enter username and password";
            $msg_class    = "error";
        } else {

            $username = $_POST['email'];
            $password = $_POST['upass'];

            try {

                $stmt = $conn->prepare("SELECT userID,username,password FROM users where username = ? ");
                $stmt->execute([$username]);

                $results = $stmt->fetchall(PDO::FETCH_ASSOC);

                if (count($results) > 0) {


                    foreach ($results as $row):
                        if (password_verify($password, $row['UserPassword'])) {

                            $_SESSION['loggedin'] = $row['userID'];
                            $loginMessage             = "Login Successfully! Redirecting...";
                            $msg_class                = "success";
                            header("refresh:5; url=dashboard");


                        } else {

                            $loginMessage = "Password and username does not match";
                            $msg_class    = "error";
                        }
                    endforeach;


                } else {


                    $loginMessage = "Invalid username";

                }

            }
            catch (PDOException $e) {

                error_log($e);
            }
        }
    }
}


    ?>
</head>
<body>
    <div id="main">
        <h1>User Login</h1>
        <div class="row">
            <div class="large-6 columns large-centered" id="box">
                <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
                    <label>Email</label>
                    <input type="text" name="email" class="input" >
                    <label>Password </label>
                    <input type="password" name="upass" class="input"  id="password"/><br/>
                    <div class="large-6 columns pull-2"><a href="#">Forgot Password</a></div>
                    <button type="submit" class="button" name="login" disabled="true" id="long">Login</button>
                    <div class="<?php echo $msg_class;?>">
                        <?php
                            echo $loginMessage;
                            ?>
                    </div>
                </form>
            </div>
        </div>
        <script type="text/javascript">
            $(document).ready(function(){
                $('#password').keyup(function(e){

                   $('#long').prop('disabled', false);

                });
            });
        </script>
    </div>

db_config.php

<?php


    $servername  = "localhost";
    $username    = "root";
    $password    = "";
    $dbname      = "samedicalspecialists";


    try {

        $conn= new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);
        $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);


    } catch (PDOException $e) {


        error_log($e);

    }

?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM