2017-01-26 4 views
0
<?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 результат, как и ожидалось, когда я поставил редирект на странице только освежают вместо перехода на следующую страницу.PHP используя PDO простую систему входа выдает

+0

Это так просто, что это unsave – SuperDJ

+0

жаль я совсем новичок в этом не понимаю, что вы имеете в виду – Tom632

+0

Пожалуйста, не пишите ключа сеанса с пробелами, как '$ _SESSION [«Записан В»] 'и убедитесь в том, путь, который вы даете заголовку, является абсолютным, а не относительным .. – samayo

ответ

1

Есть несколько простых вопросов, в этом коде

Сначала вы должны начать сеанс, прежде чем сделать что-нибудь с ним. На самом деле лучше всего начать его в начале каждого скрипта, прежде чем делать что-либо еще.

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

Также ваш код подлежит применению SQL Injection, поэтому используйте подготовленные и параметризованные запросы, чтобы этого избежать.

В базе данных также хранится текстовый пароль. не другой большой Нет Нет

PHP не предоставляет password_hash() и password_verify(), пожалуйста, используйте их. А вот некоторые good ideas about passwords Если вы используете PHP версии до 5,5 there is a compatibility pack available here

<?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); 
+1

@ Tom632. Спасибо, как правило, приходит в виде upvote, если вы считаете, что любой вопрос вам поможет. Новички ничего не стоят – RiggsFolly

0

есть проблемы с мая кода, вы храните пароли в виде обычного текста, который совершенно неправильно, вы должны использовать 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); 

    } 

?>