2013-04-24 4 views
0

После отправки моей формы ниже через ajax сообщение всегда возвращается как сбой, даже с правильной регистрационной информацией! Я кодировал это и в стиле non oop, и он отлично работает, но когда я использую этот стиль кода, он зависает. Живой сайт http://andyholmes.me/demo/summersproperty/OOP/login.php и имя пользователя является [email protected] и пароль администратораПроблемы с отправкой формы OOP и 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 и т. д., но я просто хочу, чтобы сценарий был до такой степени, что он хорошо работает, прежде чем я изменил данные подключения к базе данных. Я знаю, что я близко, но это действительно расстраивает!

Если вы можете мне помочь, я буду очень благодарен!

EDIT ПРИМЕЧАНИЕ: Этот код был обновлен для вопроса, который пришел после использования предложения от user1781670

+0

Не все, что использует класс, это oop :-) – PeeHaa

+0

Но это ООП: S –

+0

Извините, но нет :-) – PeeHaa

ответ

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 коду, потому что это не место где он идет, также я немного изменил синтаксис, чтобы понять, по крайней мере, для меня. Также обратите внимание, что «данные» - это json, возвращаемый вашей функцией PHP getStatus, который возвращает статус входа в систему как json.

Теперь вам просто нужно создать функцию PHP, которая возвращает json. Может быть, вы можете помочь в оформлении заказа json_encode. Если вы застряли, сообщите нам.

Пример функции GetStatus:

объекты JavaScript, как ассоциированные массивы в PHP, за исключением объектов JavaScript может иметь функции. Итак, не удивительно, что вам нужно передать ассоциативный массив json_encode.

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

$ .post автоматически знает, что получил JSON (это по умолчанию), так что вы можете получить доступ к его свойства с data.logged_in и data.errors.

В этом проблема: вы показываете свою регистрационную форму и когда пользователь отправляет форму, через ajax вы открываете соединение и отправляете данные, введенные пользователем, и вы ожидаете, что сервер вернет информацию. Но как эти данные будут возвращены? как ты справишься с этим? ну, это JSON для. Это синтаксис для написания объектов JavaScript, поэтому с json_encode вы возвращаете JSON, и когда ваш JavaScript получает этот JSON, вы можете получить доступ к его данным и проверить, был ли он успешным логином.

+0

, так что getStatus - это функция, которую мне нужно создать для ошибок и т. Д.? Я предполагаю, что не могу использовать всю обработку ошибок/данных, ранее созданную в моем файле класса? –

+0

Да, вы можете, это идея. JSON - это способ записи объектов javascript, следуя этой идее, вы можете передать весь свой статус объекта PHP в ваш код javascript. Один из примеров: {logged_in: false, errors: ['username can' t be blank ',' password can 't be blank']}. С вашего javascript вы можете получить доступ к таким атрибутам, как data.logged_in & data.errors. –

+0

Как вы можете сказать им довольно свежий! Определенно нужна помощь haha ​​ –

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