2017-10-18 2 views
0

Ich arbeite derzeit an einem AJAX-Login-System, aber es sendet keine Antwort zurück. Es sendet nur eine Antwort zurück, wenn ich das Skript exit("error here"), aber ich möchte eine JSON-Antwort zurückgeben.PHP - AJAX Login funktioniert nicht

Meine Form:

<div id="account" class="modal" role="dialog"> 
    <div class="modal-dialog"> 
     <form method="post" id="login-form"> 
      <div class="modal-content"> 
       <div class="modal-header"> 
        <h4 class="modal-title">Sign in</h4> 
       </div> 
       <div class="modal-body"> 
         <p> 
          Email address:<br /> 
          <input type="email" class="form-control" placeholder="Email address" name="user_email" id="user_email" /> 
         </p> 
         <p> 
          Password:<br /> 
          <input type="password" class="form-control" placeholder="Password" name="password" id="password" /> 
         </p> 
        </form> 
       </div> 
       <div class="modal-footer"> 
        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> 
        <button type="submit" class="btn btn-default" name="btn-login" id="btn-login">LOGIN</button> 
       </div> 
      </div> 
     </form> 
    </div> 
</div> 

Mein JavaScript:

$("#btn-login").click(function(e) { 
     alert('submit'); 
     var data = $("#login-form").serialize(); 
     alert(data); 
     $.ajax({ 
      url: 'ajax.php', 
      type: 'POST', 
      data: data, 
      success: function(response) { 
       var data = response.responseText; 
       var resp = $.parseJSON(data); 

       if (resp.error) { 
        alert('error: ' + response); 
       } else { 
        alert('success: ' + response); 
       } 
      } 
     }); 
     event.preventDefault(); 
    }); 

Meine PHP:

if(isset($_POST['user_email']) && is_ajax()) { 
    $engine->expireLoginAttempts(); 
    $engine->expireLoginBan(); 

    if(!$engine->isLoginBanned()) { 
     $email = strip_tags($_POST['user_email']); 
     $password = strip_tags($_POST['password']); 

     if($engine->doLogin($email,$password)) { 
      $engine->expireBan(); 

      if($maintenanc['value'] == '1' && !$engine->isStaff()) { 
       echo json_encode(array(
        'success' => '0', 
        'message' => 'You can\'t login using a regular account because the site is currently under maintenance.' 
       )); 
      } elseif($engine->isBanned() && !$engine->isOwner()) { 
       // Account banned; notify and give a timestamp + reason 
       $stmt = $engine->runQuery("SELECT timestamp, expiration, reason FROM banned WHERE user_id=:user_id"); 
       $stmt->execute(array(':user_id'=>$_SESSION['user_id'])); 
       $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 
       $blockdate1 = strtotime('+' . $userRow['expiration'], strtotime($userRow['timestamp'])); 
       $blockdate2 = date('d-m-Y H:i:s', $blockdate1); 

       echo json_encode(array(
        'success' => '0', 
        'message' => 'This account is suspended until ' . $blockdate2 . ' because of the following reason: ' . $userRow['reason'] . '.' 
       )); 
      } else { 
       echo json_encode(array(
        'success' => '1', 
        'message' => $_SESSION['user_name']; 
       )); 
      } 
     } else { 
      // Create login attempt if the account exists and the ip is different from the register ip 
      $stmt = $engine->runQuery("SELECT user_email, user_id, user_ip FROM users WHERE user_email=:email"); 
      $stmt->execute(array(':email'=>$email)); 
      $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 
      if($stmt->rowCount() == 1 && $userRow['user_ip'] !== $_SERVER["REMOTE_ADDR"]) { 
       $engine->createLoginAttempt($userRow['user_id'], $_SERVER["REMOTE_ADDR"]); 
      } 

      // Bruteforce attack suspected, bans the ip after 10 attempts from an unknown ip 
      $attemptban = $engine->runQuery("SELECT * FROM loginattempt WHERE ip=:ip"); 
      $attemptban->execute(array(':ip'=>$_SERVER["REMOTE_ADDR"])); 
      if($attemptban->rowCount() > 4) { 
       if($engine->loginban()) { 
        $engine->deleteLoginAttempts($_SERVER["REMOTE_ADDR"]); 
       } 
      } 

      echo json_encode(array(
       'success' => '0', 
       'message' => 'Emailaddress and/or password invalid.' 
      )); 
     } 
    } 
} 

Weiß jemand, was mache ich falsch? Ich habe versucht ing die json_encode, setzen exit() nach jeder json_encode aber keiner scheint zu arbeiten .. Jede Hilfe wird sehr geschätzt!

+0

Sie brauchen nicht die JSON-Antwort zu analysieren selbst; jQuery kann das für Sie tun. Setzen Sie einfach 'dataType: 'json'' – Phil

+0

1) Fügen Sie einen Fehlerhandler zu Ihrer' $ .ajax' Anfrage hinzu. Die Signatur ist 'error: function (jqXhr, textStatus, errorThrown)'. 2) Überprüfen Sie die * Network * -Konsole Ihres Browsers auf die POST-Anfrage. Wie sieht die Antwort aus? – Phil

+0

Ich würde auch '$ (" # login-form ") verwenden. Submit' anstelle von' $ ("# btn-login"). Klicken Sie auf ', um das Ereignis zu erfassen. Formulare können gesendet werden, indem Sie in einem Textfeld auf "Enter" klicken und nur auf Tastenklicks warten. – Phil

Antwort

0

Versuchen Sie, etwas zu den anderen hinzuzufügen und zu sehen, was passiert ist.

if(!$engine->isLoginBanned()){ 
 
    ... 
 
} else { 
 
    // Try add something here and see what's happen, eg. 
 
    echo json_encode(array(
 
     'success' => '0', 
 
     'message' => 'Sorry, isLoginBanned'; 
 
    )); 
 
}