2015-05-13 2 views
0

Я создаю систему входа в систему OOP/PDO для своего сайта, но я не знаю, как я могу корректно отображать сообщения об ошибках в моем классе входа, когда попытка входа в систему не выполняется. Кроме того, я хотел бы знать, подходит ли мой подход к ООП. Это мой первый проект, работающий с OOP и PDO. Если у вас есть предложения по моему коду, я бы хотел их услышать.Отображение ошибок PHP OOP PDO

login.class.php

<?php 
    class Login { 
     private $dbConnection; 
     private $studentNumber; 
     private $studentClass; 
     private $errorMessage = false; 

     public function __construct($dbConnection) { 
      $this->dbConnection = $dbConnection->dbConnection; 
     } 

     public function showErrorMessage() { 
      return $this->errorMessage; 
     } 

     public function studentLogin($studentNumber, $studentClass) { 
      $this->studentNumber = $studentNumber; 
      $this->studentClass = $studentClass; 

      $selectStudent = $this->dbConnection->prepare("SELECT * FROM tbl_students WHERE studentNumber = :studentNumber AND studentClass = :studentClass LIMIT 1"); 
      $selectStudent->bindParam(':studentNumber', $this->studentNumber); 
      $selectStudent->bindParam(':studentClass', $this->studentClass); 
      $selectStudent->execute(); 

      $selectStudentCheck = $selectStudent->fetch(PDO::FETCH_ASSOC); 
      if(!empty($selectStudentCheck)) { 
       return true; 
      } 
      else { 
       $this->errorMessage = "Studentnumber or class is not correct"; 
      } 
     } 
    } 
?> 

dbconnection.class.php

<?php 
    class DatabaseConnection { 
     private $DatabaseHost = "localhost"; 
     private $DatabaseName = "plansysteem_keuzetrainingen"; 
     private $userName = "root"; 
     private $passWord = "root"; 
     public $dbConnection; 

     public function __construct() { 
      $this->databaseConnect(); 
     } 

     public function databaseConnect() { 
      try{ 
       $this->dbConnection = new PDO("mysql:host=$this->DatabaseHost;dbname=$this->DatabaseName", $this->userName, $this->passWord); 
       $this->dbConnection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
      } 
      catch(PDOException $e){ 
       print("Sorry er kan geen verbinding worden gemaakt met de database"); 
       file_put_contents("../errors/database.connection.errors.txt", $e->getMessage().PHP_EOL,FILE_APPEND); 
       die(); 
      } 
     } 
    } 
?> 

форма Войти

<?php 
    session_start(); 

    include ("../classes/dbconnection.class.php"); 
    include ("../classes/login.class.php"); 

    if(isset($_POST["submitLogin"])) { 
     $studentNumber = $_POST["studentNumber"]; 
     $studentClass = $_POST["studentClass"]; 

     $dbConnection = new DatabaseConnection(); 
     $login = new Login($dbConnection); 
     if($login->studentLogin($studentNumber, $studentClass)) { 
      echo "Succes"; 
     } 
     else { 
      echo "Student not found!"; 
     } 
    } 
?> 
<!DOCTYPE html> 
<html class="no-js" lang="nl"> 
    <head> 
     <meta charset="UTF-8" /> 
     <meta name="description" content="" /> 
     <meta name="keywords" content="" /> 
     <meta name="author" content="Communication Centre" /> 
     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
     <title>Login Plansysteem Keuzetrainingen</title> 
     <link rel="icon" type="image/png" href="../img/favicon.png" sizes="16x16 32x32" /> 
     <link rel="stylesheet" type="text/css" href="../css/foundation.css" /> 
     <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Advent+Pro" /> 
     <link rel="stylesheet" type="text/css" href="../css/main.css" /> 
     <script type="text/javascript" src="../js/vendor/modernizr.js"></script> 
    </head> 
    <body> 

     <div class="row"> 
      <div class="small-12 medium-8 medium-offset-2 large-6 large-offset-3 columns"> 
       <h1 class="mainTitle">inloggen</h1> 
      </div> 
     </div> 
     <form method="post"> 
      <div class="row"> 
       <div class="small-12 medium-8 medium-offset-2 large-6 large-offset-3 columns"> 
        <small class="error"></small> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="small-12 medium-8 medium-offset-2 large-6 large-offset-3 columns"> 
        <div class="row collapse"> 
         <div class="small-2 medium-1 large-1 columns"> 
          <span class="prefix"> 
           <img src="../img/cursor_icon.png" alt="Cursor Icon" /> 
          </span> 
         </div> 
         <div class="small-10 medium-11 large-11 columns"> 
          <input type="text" name="studentNumber" placeholder="Studentnummer" class="placeholderBlack" /> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="small-12 medium-8 medium-offset-2 large-6 large-offset-3 columns"> 
        <div class="row collapse"> 
         <div class="small-2 medium-1 large-1 columns"> 
          <span class="prefix"> 
           <img src="../img/person_icon.png" alt="Person Icon" /> 
          </span> 
         </div> 
         <div class="small-10 medium-11 large-11 columns"> 
          <select name="studentClass"> 
           <option value="">Selecteer Klas</option> 
           <option value="1DVTM-REG-01.P1">1DVTM-REG-01.P1</option> 
           <option value="1DVTM-REG-02.P1">1DVTM-REG-02.P1</option> 
           <option value="1DVTM-REG-03.P1">1DVTM-REG-03.P1</option> 
          </select> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="small-12 medium-8 medium-offset-2 large-6 large-offset-3 columns"> 
        <input type="submit" name="submitLogin" value="Login" class="button expand buttonBlack" /> 
       </div> 
      </div> 
     </form> 

     <script type="text/javascript" src="../js/vendor/jquery.js"></script> 
     <script type="text/javascript" src="../js/foundation.min.js"></script> 
     <script type="text/javascript"> 
      $(document).foundation(); 
     </script> 
    </body> 
</html> 

ответ

0

Это выглядит немного как система входа, который я построил для моих проектов, в случае возврата сообщений об ошибках, вы можете назначить ошибку переменной и использовать ее с возвратом в pas это так. Еще одна вещь, которая может быть проще сделать, - это использовать вызов ajax для входа вместо того, чтобы иметь php непосредственно на странице. Это также позволит вам динамически назначать сообщения об ошибках/успехах.

Но насколько возвращения сообщения об ошибках, которые могли бы изменить поймать что-то вроде этого

 $status = []; 
     if(!empty($selectStudentCheck)) { 
      status['status'] = true; 
      return status; 
     } 
     else { 
      $status['status'] = false; 
      $status['msg'] = "Studentnumber or class is not correct"; 
      return $status; 
     } 

это также устранит необходимость в функции showErrorMessage(). Затем вам нужно будет просто проверить ['status'], а затем отобразить ['msg'], если вы хотите отобразить эту ошибку. Вышеупомянутое также будет хорошо работать с вызовом ajax.

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

db_info.inc

<?php 
# Defining Database Values to avoid hardcoding in each file. 
define ('DB_USER', 'user'); 
define ('DB_PASS', 'supersecret password'); 
define ('DB_HOST_WRITE', 'host1'); # Master DB 
define ('DB_HOST_READ', 'host2'); # Slave DB 
define ('DB_ONE', 'database1'); 
define ('DB_TWO', 'database2'); 

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

class User { 

# Set class wide variables 
private $db; 
public $dbuser = DB_USER; 
public $dbhost = DB_HOST_WRITE; 
public $dbname = DB_ONE; 
public $dbpass = DB_PASS; 

Также вы можете построить фактическое соединение с базой данных внутри конструкции. от фактического класса входа, чтобы вам не пришлось передавать его в функции входа в систему. Это также позволяет вам более легко назначать пользователям права доступа к специальным функциям.

public function __construct() { 
    try { 
     $this->db = new PDO("mysql:host=" . $this->dbhost . ";dbname=" . $this->dbname, $this->dbuser, $this->dbpass); 
     $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (Exception $ex) { 
     file_put_contents($this->pdolog, $ex->getMessage(), FILE_APPEND); 
    } 
} 

Надеется, что это помогает

==========

Для Аякса называют удар это фрагменты из моей implementatation

формы Войти

<form id="formLogin"> 
    <input class="form-control center-block text-center" name="username" id="username" placeholder="Username" type="text" required> 
    <input class="form-control center-block text-center" name="password" id="password" placeholder="Password" type="password" required> 
    <input type="button" value="Login" id="login" class="btn btn-block btn-primary center-block" onclick="userlogin(event, '#formLogin')"> 
</form> 

onlick вариант - волшебная часть. Он вызывает следующий сценарий jquery.

function userlogin(event, loginform) { 
    event.preventDefault(); 

    $('#login').fadeOut(); 

    $.ajax({ 
     type: 'POST', 
     url: '/inc/login.php', 
     data: $(loginform).serializeArray(), 
     dataType: 'json', 
     success: function(data) { 
      if (data.status == 'error') { 
      alert(data.statusmsg); 
      $('#login').fadeIn(); 
      } 
      if (data.status == 'success') { 
      window.location = '/account/'; 
      } 
     }, 
     error: LogonError 
    }); 
} 
function LogonError() { 
    alert('Error: The system could not log you in.' + 
     '\n\nIf you believe this is an error please email the' + 
     '\nAdministrator at [email protected]'); 
} 

Это принимает значения из формы с JQuery делает все дополнительные Magix поэтому я не должен и передает его на PHP страницу login.php

login.php

$user = @$_POST['username']; 
$pass = @$_POST['password']; 

$response = array(); 

if($user == null) { 
    $errors = 1; 
    $response['statusmsg'] .= "Please enter your username.\n"; 
} 
if($pass == null) { 
    $errors = 1; 
    $response['statusmsg'] .= "Please enter your password.\n"; 
} 
if($errors === 1) { 
    $response['status'] = 'error'; 
    echo json_encode($response); 
    return; 
} else { 
    $login = new User; 
    $loginstatus = $login->login($user, $pass); 

    if($loginstatus === 0) { 
     $response['status'] = 'error'; 
     $response['statusmsg'] = "The system was unable to log you in. Please try again later.\nIf this error presists please inform the site administrator."; 
     echo json_encode($response); 
     return; 
    } 
    if($loginstatus === 2) { 
     $response['status'] = 'error'; 
     $response['statusmsg'] = "There was an error. Please try again later.\nIf this error presists please inform the site administrator."; 
     echo json_encode($response); 
     return; 
    } 
    if($loginstatus === 1) { 
     $response['status'] = 'success'; 
     echo json_encode($response); 
     return; 
    } 
} 

Это захватывает информацию, которую jquery передал нам из сообщения, а затем передает ее функции входа в систему, а затем проверяет возвращаемые значения и передает информацию, необходимую обратно в jquery, для отображения ошибок и т. Д.

функция Войти

public function login($username, $password) { 
     # Set login time 
     $logintime = date('Y-m-d H:i:s'); 
     $ip = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP); 

     # setting db connection inside try for exception handling 
     try { 
      $conn = $this->db; 

      $stmt = $conn->prepare('SELECT * FROM Members WHERE UserName = :username'); 
      $stmt->execute(array(':username' => $username)); 
      $results = $stmt->fetch(PDO::FETCH_ASSOC); 
      $stmt = NULL; 
     } catch (PDOException $ex) { 
      $conn = NULL; 
      file_put_contents($this->pdolog, $ex->getMessage(), FILE_APPEND); 
      return 2; 
     } 

     if ($results === FALSE || $results['AccountActive'] === 0) { 
      $conn = NULL; 
      return 0; 
     } else { 
      if (password_verify($password, $results['UserPass'])) { 
       try { 
        $stmt = $conn->prepare('UPDATE Members SET LastDate = :lastdate, LastIP = :lastip, FailCount = :failcount WHERE MemberID = :memberid'); 
        $stmt->execute(array(':lastdate' => $logintime, ':lastip' => $ip, ':failcount' => 0, ':memberid' => $results['MemberID'])); 
       } catch (PDOException $ex) { 
        $conn = NULL; 
        file_put_contents($this->pdolog, $ex->getMessage(), FILE_APPEND); 
        return 2; 
       } 

       $conn = NULL; 
       $_SESSION['login'] = 1; 
       $_SESSION['MemberID'] = $results['MemberID']; 
       $_SESSION['UserName'] = $results['UserName']; 
       return 1; 

      } else { 
       $conn = NULL; 
       return 0; 
      } 

     } 

    } 

после того, как функция запуска и данные были переданы обратно в вызове JQuery, JQuery затем обработать данные в success или error частей.

Надеюсь, что это поможет, также извините за длинный код для копирования/вставки. Кроме того, я сохранил большинство дополнительных фрагментов моего кода без изменений, просто хотел бы вытащить из него идеи.

+0

Спасибо Gluzzer за ваш быстрый ответ на мой вопрос! Можете ли вы рассказать мне, как я могу комбинировать вызов AJAX с классом входа в PHP? Мне это немного сложно. –

+0

конечно. Я отредактирую свой ответ выше. – Gluzzer

Смежные вопросы