2015-03-25 6 views
0

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

Вот моя попытка:

* Edit: Добавлен полный класс, login.tpl.php и myProfile.php. Приносим извинения за все фрагменты кода!

класс Логин:

<?php 
class login 
{ 
    protected $_email; 
    protected $_password; 
    protected $hash; 

    protected $_db; 
    protected $_user; 

    public function __construct(PDO $db) 
    { 
     $this->_db = $db; 
    } 

    public function validate() 
    { 
     $query = $this->_db->prepare('SELECT * FROM users WHERE email=?'); 
     $query->execute(array($this->_email)); 

     if ($query->rowcount() > 0) 
     { 
       $user = $query->fetch(PDO::FETCH_ASSOC); 

       if (password_verify ($this->_password , $user['password'])) 
       { 
        return $user; 
       } 
     } 

     return false; 
    } 

    public function login($email, $password) 
    { 
     $this->_email = $email; 
     $this-> _password = $password; 

     $user = $this->validate(); 
     if ($user) 
     { 
      $_SESSION['user_id'] = $user['id']; 
      return $user['id']; 
     } 
     return false; 
    } 

    public function createUser($first_name, $last_name, $email, $password) 
    { 
     $this->hash = password_hash($password, PASSWORD_BCRYPT); 

     $query = $this->_db->prepare("INSERT INTO users (email, password, first_name, last_name) VALUES (:email, :password, :first_name, :last_name)"); 
     $query->execute(array(
     ":email"=> $email, 
     ":password"=> $password, 
     ":first_name"=> $first_name, 
     ":last_name"=> $last_name)); 
    } 

    public function logout() 
    { 
     session_destroy(); 
    } 

    public function getUserData() 
    { 
     $this->_user = $_SESSION['user_id'] ; 

     $query = $this->_db->prepare('SELECT * FROM users WHERE id=?'); 
     $query->execute(array($this->_user)); 
     return $query->fetch(PDO::FETCH_ASSOC); 
    } 

    public function uploadPicture($uploaded) 
    { 
     $targetPath = $_SERVER['DOCUMENT_ROOT']; $targetPath .= "/wdv441/userLogin/app/views/img/"; 
     $pathinfo = pathinfo($uploaded['name']); 
     $filesize = $uploaded['size']; 
     $fileName = "profilePic". $this->_user . ".png"; 
     $ok = 1; 
     $KB = 1024; 
     $MB = 1048576; 

     if ($filesize > 400*$KB) 
     { 
      echo "File too big."; 
      $ok = 0; 
     } 
     else 
     { 
      if (move_uploaded_file($uploaded['tmp_name'], $targetPath . $fileName)) 
      { 
       echo "File " . $fileName . " has been uploaded."; 
      } 
      else 
      { 
       echo "File not uploaded"; 
      } 
     }  
    } 

    public function getPicture() 
    { 
     $targetPath = $_SERVER['DOCUMENT_ROOT']; $targetPath .= "/wdv441/userLogin/app/views/img/"; 
     $fileName = "profilePic". $this->_user . ".png"; 
     $image = null; 

     if (file_exists($targetPath . $fileName)) 
     { 
      $image = $fileName; 
     } 
     else 
     { 
      $image = "default.png"; 
     } 
     return $image; 
    } 

} 

?> 

register.php:

<?php 
require_once($loginClassPath); 
session_start(); 

if (empty($_SESSION['user_id'])) 
{ 
    try { 
     $pdo = new PDO($dsn, $db_username, $db_password); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    catch (PDOException $e){ 
     echo "Error connecting to database. Error" . $e->getmessage; 
    } 

    if ($pdo) 
    { 
      $loginClass = new login($pdo); 

      if (isset($_POST['submit'])) 
      { 
       $allFields = $_POST['first_name'] . $_POST['last_name'] . $_POST['email'] . $_POST['password']; 

       if(!empty($allFields)) 
       { 
        if($loginClass->createUser($_POST['first_name'] , $_POST['last_name'] , $_POST['email'] , $_POST['password'])) 
        { 
         if ($user_id = $loginClass->login($_POST['email'], $_POST['password'])) 
         { 
          header('Location: myProfile.tpl.php'); 
          die(); 
         } 
        } 
       }  
       else 
       { 
        $errMsg = "red"; 
       } 
      } 

    } 
} 
else 
{ 
    header('Location: myProfile.tpl.php'); 
    die(); 
} 

?> 

register.tpl.php:

<?php 
$errMsg=""; 

require_once($registerPath); 
?> 

<html> 
<head> 

<title>User login</title> 
</head> 
<body> 

    <div style="text-align:center; margin-left:auto; margin-right:auto;"> 
     <h3>Please Fill out all fields below: </h3> 
     <form method="post" action="<?php echo htmlspecialchars($_SERVER['SCRIPT_NAME']); ?>"> 

     <span style="color:<?php echo $errMsg; ?>;">All fields are required</span> 
     <p>First Name: </p> 
     <input type ="text" name="first_name" /> 
     <p>Last Name: </p> 
     <input type ="text" name="last_name" /> 
     <p>Email: </p> 
     <input type ="text" name="email" /> 
     <p>Password: </p> 
     <input type="password" name ="password"/> 
     <p><input type="submit" name ="submit" value="Register"/></p> 
     </form> 
    </div> 

</body> 
</html> 

login.tpl.php

<?php 
$errMsg=" "; 

require($loginPath); 

?> 

<html> 
<head> 

<title>User login</title> 
</head> 
<body> 
    <div style="text-align:center; margin-left:auto; margin-right:auto;"> 
     <h3>Please login below: </h3> 
     <form method="post" action=<?php echo htmlspecialchars($_SERVER['SCRIPT_NAME']); ?>> 
      <span style="color:red;"><?php echo $errMsg ?></span> 
      <p>Username: </p> 
      <input type ="text" name="email" /> 
      <p>Password: </p> 
      <input type="password" name ="password"/> 
      <p><input type="submit" name ="login" value="Login"/></p> 
      <p>Don't have an account? <a href="register.tpl.php">Register here</a>!</p> 
     <form> 
    </div> 

</body> 
</html> 

В настоящее время, когда регистрируется новый пользователь, он выталкивает пользователя на экран входа в систему. Это происходит потому, что, когда он перенаправляет на «myProfile.php» Я следующий код в «myProfile.php» для того, чтобы заставить людей подписать в:

myProfile.php:

<?php   
require_once($loginClassPath); 
session_start(); 

if (!empty($_SESSION['user_id'])) 
{ 
    try 
    { 
     $pdo = new PDO($dsn, $db_username, $db_password); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    catch (PDOException $e) 
    { 
     echo "Error connecting to database. Error" . $e->getmessage; 
    } 
     if ($pdo) 
     { 
      $loginClass = new login($pdo); 
      $userData = $loginClass->getUserData(); 

      if (isset($_GET['logout'])) 
      { 
       if ($_GET['logout'] == 'yes') 
       { 
        $loginClass->logout(); 
        header('Location: login.tpl.php'); 
        die(); 
       } 
      } 

     } 
} 
else 
{ 
    header('Location: login.tpl.php'); 
    die(); 
} 

?> 

Мой вопрос в основном, где я иду не так? Я здесь закрываюсь или ухожу?

Я заранее извиняюсь, если у вас уже возник вопрос, похожий на это, я некоторое время оглядывался, но не мог найти ничего, что помогло мне. Если я не предоставил достаточную информацию, пожалуйста, дайте мне знать!

Спасибо заранее, ребята!

+0

Какое содержимое файла login.tpl.php? –

+0

Из того, что я вижу, это не похоже на то, что вы конкретно определили фактический класс в коде, поэтому 'new login()' будет вызывать ошибку, если вы ее не покажете? –

+0

У меня есть определенный класс. Я просто абстрагировал функции, которые использовались в фрагментах кода, чтобы сделать вопрос короче. Если вы хотите, чтобы я добавил весь класс, я могу! – RoyaleWCheese1

ответ

0

Я понял! Я изменил функцию createUser класса, чтобы сделать следующее:

public function createUser($first_name, $last_name, $email, $password) 
{ 
    $this->_email = $email; 
    $this-> _password = $password; 
    $this->hash = password_hash($password, PASSWORD_BCRYPT); 

    $query = $this->_db->prepare('SELECT * FROM users WHERE email=?');; 
    $query->execute(array($this->_email)); 

    if ($query->rowcount() > 0) 
    { 
     echo "An account with that email already exists"; 
    } 
    else 
    { 
     $query = $this->_db->prepare("INSERT INTO users (email, password, first_name, last_name) VALUES (:email, :password, :first_name, :last_name)"); 
     $query->execute(array(
     ":email"=> $email, 
     ":password"=> $hash, 
     ":first_name"=> $first_name, 
     ":last_name"=> $last_name)); 
     $id = $this->_db->lastInsertId(); 

     $_SESSION['user_id'] = $id; 
    } 
} 
Смежные вопросы