2017-05-24 111 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如果你不想使用会话如何识别登录用户? –