2013-04-24 80 views
0

通過ajax提交我的表單後,即使使用正確的登錄信息,郵件也會始終以失敗告終!我已經編寫了非OOP風格的代碼,它完美的工作,但是當我使用這種風格的代碼時,它會掛起。活動網站是http://andyholmes.me/demo/summersproperty/OOP/login.php和用戶名是[email protected]和密碼是adminOOP和AJAX表單提交問題

的login.php -

<?PHP 
session_start(); 

include('includes/class.login.php'); 

$login = new Login(); 


$token = $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 

if ($_POST['ajax']) { 
    exit($login->getStatus()); 
} 

?> 
<style> 
    #message { display: none; cursor: pointer; } 
    .loader { display: none; } 
</style> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
<script> 
$(document).ready(function(){ 
    $("#loginForm").submit(function(e) { 
     $(this).fadeOut(300); 
     $('.loader').delay(300).fadeIn(100); 
     $.post("<?=$_SERVER['PHP_SELF'];?>", { username: $('#username').val(), password: $('#password').val(), ajax: true }).done(function(data) { 
      if (data.logged_in == true) { 
       // Redirect with javascript 
       $('.loader').delay(2000).fadeOut(100); 
       $('#message').html('<p>Success! We\'ll redirect you in a minute...</p>').delay(2200).fadeIn(200); 
      } else { 
       $('.loader').delay(2000).fadeOut(100); 
       $('#message').html('<p>Failed... Click to try again!').delay(2200).fadeIn(200); 
       $('#message').on('click', function(){ 
        $(this).fadeOut(200); 
        $('#loginForm').delay(350).fadeIn(200); 
       }); 
      } 
     }); 
     return false; 
    }); 
}); 
</script> 
<form id="loginForm" method="POST" action=""> 
    <table> 
     <tr><td>Username:</td><td><input type="text" name="username" id="username"/></td></tr> 
     <tr><td>Password:</td><td><input type="password" name="password" id="password"/></td></tr> 
    </table> 
    <input type="hidden" name="token" value="<?=$token;?>"/> 
    <input type="submit" name="login" value="Log In"/> 
</form> 
<div class="loader"> 
    <img src="loader.gif"/> 
</div> 
<div id="message"></div> 

,登錄類 -

<?PHP 

class Login 
{ 
    private $_id; 
    private $_username; 
    private $_password; 
    private $_passmd5; 

    private $_errors; 
    private $_access; 
    private $_login; 
    private $_token; 

    public function __construct() 
    { 
     $this->_errors = array(); 
     $this->_login = isset($_POST['login']) ? 1 : 0; 
     $this->_access = 0; 
     $this->_token = $_POST['token']; 

     $this->_id  = 0; 
     $this->_username = ($this->_login) ? $this->filter($_POST['username']) : $_SESSION['username']; 
     $this->_password = ($this->_login) ? $this->filter($_POST['password']) : ''; 
     $this->_passmd5 = ($this->_login) ? md5($this->_password) : $_SESSION['password']; 

    } 

    public function isLoggedIn() 
    { 
     ($this->_login) ? $this->verifyPost() : $this->verifySession(); 

     return $this->_access; 
    } 

    public function filter($var) 
    { 
     return preg_replace('/[^a-zA-Z0-9]/','',$var); 
    } 

    public function verifyPost() 
    { 
     try 
     { 
      if(!$this->isTokenValid()) 
       throw new Exception('Invalid form submission'); 

      if(!$this->isDataValid()) 
       throw new Exception('Invalid form data entered'); 

      if(!$this->verifyDatabase()) 
       throw new Exception('Invalid username/password combination'); 

     $this->_access = 1; 
     $this->registerSession(); 
     } 
     catch(Exception $e) 
     { 
      $this->_errors[] = $e->getMessage(); 
     } 
    } 

    public function verifySession() 
    { 
     if($this->sessionExist() && $this->verifyDatabase()) 
      $this->_access = 1; 
    } 

    public function verifyDatabase() 
    { 
     include('dbConfig.php'); 

     $data = mysql_query("SELECT user_id FROM users WHERE user_username = '{$this->_username}' AND user_password = '{$this->_passmd5}'"); 

     if(mysql_num_rows($data)) 
     { 
      list($this->_id) = @array_values(mysql_fetch_assoc($data)); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public function isDataValid() 
    { 
     return (preg_match('/^[a-zA-Z0-9]/', $this->_username) && preg_match('/^[a-zA-Z0-9]/', $this->_password)) ? 1 : 0; 
    } 

    public function isTokenValid() 
    { 
     return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token']) ? 0 : 1; 
    } 

    public function registerSession() 
    { 
     $_SESSION['id'] = $this->_id; 
     $_SESSION['username'] = $this->_username; 
     $_SESSION['password'] = $this->_passmd5; 
    } 

    public function sessionExist() 
    { 
     return (isset($_SESSION['username']) && isset($_SESSION['password'])) ? 1 : 0; 
    } 

    public function showErrors() 
    { 
     echo "<h3>Errors</h3>"; 
     foreach($this->_errors as $key=>$value) 
      echo $value."<br>"; 
    } 

    public function getStatus() 
    { 
    return json_encode(array('logged_in' => $this->isLoggedIn(), 'errors' => $this->showErrors())); 
    } 
} 

?> 

順便說一句,我知道我需要使用PDO等,但我只想讓腳本達到一個點,它在我更改數據庫連接數據之前很好地工作。我知道我很接近,但它非常令人沮喪!

如果你能幫助我,我將不勝感激!

編輯備註:此代碼已更新爲想出了使用建議之後,從user1781670

+0

不是所有使用類的東西都是oop :-) – PeeHaa 2013-04-24 20:18:34

+0

但是這是OOP:S – 2013-04-24 20:21:48

+0

對不起,但是:-) – PeeHaa 2013-04-24 20:24:22

回答

1
<?PHP 
session_start(); 


include('includes/class.login.php'); 

$login = new Login(); 


$token = $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 

if ($_POST['ajax']) { 
    exit($login->getStatus()); 
} 

?> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
<script> 
$(document).ready(function(){ 
    $("#loginForm").submit(function(e) { 
     $.post("<?=$_SERVER['PHP_SELF'];?>", { username: $('#username').val(), password: $('#password').val(), ajax: true }).done(function(data) { 
      if (data.logged_in == true) { 
       // Redirect with javascript 
      } else { 
       // Inject errors to html 
       // data.errors 
      } 
     }); 
     return false; 
    }); 
}); 
</script> 
<form id="loginForm" method="POST" action=""> 
    <table> 
     <tr><td>Username:</td><td><input type="text" name="username" id="username"/></td></tr> 
     <tr><td>Password:</td><td><input type="password" name="password" id="password"/></td></tr> 
    </table> 
    <input type="hidden" name="token" value="<?=$token;?>"/> 
    <input type="submit" name="login" value="Log In"/> 
</form> 

一個問題,因爲你可以看到我修改你的jQuery中移除你的PHP代碼,因爲這不是地方在那裏,我也改變了語法,至少對我來說更清楚一點。另請注意,「data」是PHP函數getStatus返回的json,它返回登錄狀態爲json。

現在你只需要創建返回json的PHP函數。也許可以幫助您結帳json_encode。如果您遇到困難,請告訴我們。功能的getStatus的

實施例:

JavaScript對象一樣,不過JavaScript對象在PHP準陣列可以具有的功能。所以,你不需要將關聯數組傳遞給json_encode。

public function getStatus() 
{ 
    return json_encode(array('logged_in' => $this->isLoggedIn(), 'errors' => $this->showErrors())); 
} 

$。員額自動知道它收到一個JSON(這是默認選項),這樣你就可以訪問它與data.logged_in和data.errors性能。

這就是問題所在:你顯示你的登錄表單,當用戶提交表單時,通過ajax你打開一個連接併發送用戶輸入的數據,你希望服務器返回信息。但這些數據將如何返回?你將如何處理?那麼,這是JSON的。這是編寫JavaScript對象的語法,所以使用json_encode返回一個JSON,當JavaScript接收到該JSON時,您可以訪問它的數據並檢查它是否成功登錄。

+0

所以getStatus是我需要創建的錯誤等功能?我假設我不能使用以前在我的類文件中創建的所有錯誤/數據處理? – 2013-04-24 20:50:06

+0

是的,你可以,這就是主意。 JSON是一種編寫JavaScript對象的方式,遵循這個想法,您可以將您的所有PHP對象狀態傳遞給您的JavaScript代碼。一個例子是:{logged_in:false,錯誤:['用戶名不能爲空','密碼不能爲空']}。從你的JavaScript你可以訪問像data.logged_in&data.errors這些屬性。 – 2013-04-24 20:52:42

+0

正如你可以告訴我很新鮮!絕對需要幫助哈哈 – 2013-04-24 20:55:04