2017-05-24 110 views
0

我正在測試Ajax與jQuery,但我卡住了。 下面的ajax腳本顯示一條提示消息"Not connect. Verify network" (jqXHR.status === 0)我的Ajax腳本是否正確調用了php?

事實是,指定的PHP文件路徑絕對正確,並且Wamp服務器已啓動並正常工作。 看起來像它找到的PHP文件,但它不會執行它(我必須在PHP中設置參數header()?)。

這裏是我的js文件:

$(document).ready(function() {  
    $("#connectionButton").click(function() {  
     var formLogin = $('#login').val(); 
     var formPass = $('#pass').val();    
     $.ajax({ 
      url:  "http://localhost/cordova_test/check_login.php", 
      type:  "POST", 
      data:  {login: formLogin, pass: formPass}, 
      dataType: "html", 

      succes: function (data) {  
       alert("Success: " + data); 
      },  
      error: function (jqXHR, exception) {  
       var msg = ''; 
       if (jqXHR.status === 0) { 
        msg = 'Not connect.\n Verify Network.'; 
       } else if (jqXHR.status == 404) { 
        msg = 'Requested page not found. [404]'; 
       } else if (jqXHR.status == 500) { 
        msg = 'Internal Server Error [500].'; 
       } else if (exception === 'parsererror') { 
        msg = 'Requested JSON parse failed.'; 
       } else if (exception === 'timeout') { 
        msg = 'Time out error.'; 
       } else if (exception === 'abort') { 
        msg = 'Ajax request aborted.'; 
       } else { 
        msg = 'Uncaught Error.\n' + jqXHR.responseText; 
       }  
       alert(msg); 
      } 
     }); 
    }); 
}); 

我使用的回聲在我的PHP腳本發回的數據(註釋是法語,但代碼仍是英文;)):

<?php 
    $formLogin = $_POST['login']; 
    $formPass = $_POST['pass']; 

    /* Connexion */ 
    require_once('./connexion.php'); 

    /* Etablissement de la requête */ 
    $sql = $conn->prepare("SELECT * FROM membre WHERE login = :formLogin AND pass = :formPass;"); 
    $sql->execute(array(
     'formLogin' => $formLogin, 
     'formPass' => $formPass 
    )); 

    /* Récupération des données */ 
    $donnees = $sql->fetchAll(PDO::FETCH_ASSOC); 

    /* Fermeture de la connexion */ 
    $sql->closeCursor(); 

    /* Vérification et renvoi des données */ 
    if(empty($donnees)) {   
     echo "INCORRECT_LOGIN"; 
    } 
    else {   
     echo $donnees; 
    } 
?> 

我一直在尋找3天的解決方案,但我真的不明白。

+0

使用'dataType:text,' – guradio

+0

在哪裏觸發這個頁面被訪問?它也在本地主機上嗎? – Tom

+0

我認識的人會稱之爲「僞裝的祝福」^^如果您在本地主機上存儲純文本密碼,請不要在線執行此操作...您應該查看PHP內置函數,例如'password_hash' [這裏](http://php.net/manual/en/function.password-hash.php)和'password_verify' [HERE](http://php.net/manual/en/function.password-verify.php) ,然後從現在開始改變這一點,不要浪費時間:安全第一!... – OldPadawan

回答

0

我發佈了這個答案,因爲我認爲echo $sql->fetchAll(PDO::FETCH_ASSOC);不起作用,並且是這個錯誤的主要原因。

您可能需要考慮修改您的PHP腳本以使用JSON而不是普通數據。由於JavaScript本地支持JSON,因此在JavaScript中處理會更加實用。

此外,我不完全確定echo $sql->fetchAll(PDO::FETCH_ASSOC);會如何表現,因爲通常不應該有echo陣列。

的JavaScript:

這一切都可以用這個來實現

$(document).ready(function() {  
    $("#connectionButton").click(function() {  
     var formLogin = $('#login').val(); 
     var formPass = $('#pass').val();    
     $.ajax({ 
      url:  "http://localhost/cordova_test/check_login.php", 
      type:  "POST", 
      data:  {login: formLogin, pass: formPass}, 
      dataType: "json", 

      succes: function (data) {  
       alert("Success: " + data); 
      },  
      error: function (jqXHR, exception) {  
       var msg = ''; 
       if (jqXHR.status === 0) { 
        msg = 'Not connect.\n Verify Network.'; 
       } else if (jqXHR.status == 404) { 
        msg = 'Requested page not found. [404]'; 
       } else if (jqXHR.status == 500) { 
        msg = 'Internal Server Error [500].'; 
       } else if (exception === 'parsererror') { 
        msg = 'Requested JSON parse failed.'; 
       } else if (exception === 'timeout') { 
        msg = 'Time out error.'; 
       } else if (exception === 'abort') { 
        msg = 'Ajax request aborted.'; 
       } else { 
        msg = 'Uncaught Error.\n' + jqXHR.responseText; 
       }  
       alert(msg); 
      } 
     }); 
    }); 
}); 

我回音使用我的PHP腳本發回的數據(註釋是法語,但代碼仍然是在英語;)):

<?php 
    $formLogin = $_POST['login']; 
    $formPass = $_POST['pass']; 

    /* Connexion */ 
    require_once('./connexion.php'); 

    /* Etablissement de la requête */ 
    $sql = $conn->prepare("SELECT * FROM membre WHERE login = :formLogin AND pass = :formPass;"); 
    $sql->execute(array(
     'formLogin' => $formLogin, 
     'formPass' => $formPass 
    )); 

    /* Récupération des données */ 
    $donnees = $sql->fetchAll(PDO::FETCH_ASSOC); 

    /* Fermeture de la connexion */ 
    $sql->closeCursor(); 

    /* Vérification et renvoi des données */ 
    if(empty($donnees)) {   
     echo json_encode(["status" => "error"]); 
    } 
    else {   
     echo json_encode(["status" => "ok", "data" => $donnees]); 
    } 
?> 
+0

這裏的答案是什麼? – Edwin

+0

一些很好的建議,但用戶實際問題沒有答案。 – Tom

+0

@Edwin我假設回聲陣列不起作用,並導致它失敗。 – thepieterdc

0

這是你想將得到錯誤:

注意:數組字符串轉換在...

造成的:echo $donnees;

這就是爲什麼你沒有得到你想要的結果。

這是你可以做什麼:

<script type="text/javascript"> 
    $(document).ready(function() {  
    $("#connectionButton").click(function() {  
     var formLogin = $('#login').val(); 
     var formPass = $('#pass').val();    
     $.ajax({ 
      url:  "http://localhost/cordova_test/check_login.php", 
      type:  "POST", 
      data:  {login: formLogin, pass: formPass}, 
      dataType: "json", 
      encode : true, 

      succes: function (data) { 

       if(data == "ok"){ 

        alert('login succes'); 
        setTimeout(' window.location.href = "SecurePage.php"; ', 6000); 
       }else{ 

        alert("login failed: " + data);      
       } 

      },  
      error: function (jqXHR, exception) {  
       var msg = ''; 
       if (jqXHR.status === 0) { 
        msg = 'Not connect.\n Verify Network.'; 
       } else if (jqXHR.status == 404) { 
        msg = 'Requested page not found. [404]'; 
       } else if (jqXHR.status == 500) { 
        msg = 'Internal Server Error [500].'; 
       } else if (exception === 'parsererror') { 
        msg = 'Requested JSON parse failed.'; 
       } else if (exception === 'timeout') { 
        msg = 'Time out error.'; 
       } else if (exception === 'abort') { 
        msg = 'Ajax request aborted.'; 
       } else { 
        msg = 'Uncaught Error.\n' + jqXHR.responseText; 
       }  
       alert(msg); 
      } 
     }); 
    }); 
}); 
</script> 

那麼PHP

<?php 
    session_start(); 
    $message =""; 
    $formLogin = $_POST['login']; 
    $formPass = $_POST['pass']; 

    /* Connexion */ 
    require_once('./connexion.php'); 

    /* Etablissement de la requête */ 
    $sql = $conn->prepare("SELECT * FROM membre WHERE login = :formLogin AND pass = :formPass;"); 
    $sql->execute(array(':formLogin' => $formLogin,':formPass' => $formPass)); 

    /* Récupération des données */ 
    $donnees = $sql->fetchAll(PDO::FETCH_ASSOC); 

    if(count($donnees) > 0){ 

     foreach($donnees as $key=>$row){ 

      $message = "ok"; 
      $_SESSION['member'] = $row['memberID']; 

      //everything is ok no need to display the result to the user just start the session and redirect the user to the next page in the ajax success 
//set all the things you need here that u gonna need on other pages 
     } 

    }else{ 

     $message = "Unknow account"; 
    } 

    echo json_encode($message); 
?> 

PS:你不應該採用明文存儲密碼,請使用從手動 password_hash()password_verify()

+0

我不能這樣做(使用會話),因爲我正在製作科爾多瓦(PhoneGap)應用程序。所以一旦部署,ajax就不會再在服務器上了,它會連接到遠端的服務器來調用php。這就是爲什麼我需要將數據返回給Ajax。 – Mickrosoft

+0

但你只是提醒你沒有做任何關於它的數據@MickaëlDebalme –

+0

@MickaëlDebalme如果你不想使用會話如何識別登錄用戶? –