2014-01-29 56 views
1

我正在使用jQuery UI模式對話框在我的html和PHP腳本之間進行交互的用戶登錄系統上工作。最近,我將我的所有用戶功能都移到了一個PHP文件中,從我之前在我的標題標記中找到它們的位置。來自jQuery UI對話框的AJAX調用

如果有人輸入有效的用戶名/密碼,我可以獲得登錄功能,但現在我正在考慮其他可能性,即某人輸入了有效的用戶名,但密碼不正確,或者他們輸入了不存在的用戶名。

我遇到的問題是在對話腳本上調用AJAX。我想提交登錄表單到相同的頁面user.php,並且要麼登錄一個用戶,要麼返回一個錯誤消息來填充同一個對話框上的div。

現在,我的代碼將返回一條錯誤消息,但它也會返回用戶表單的副本。不知道我在這裏做錯了什麼...
任何輸入,將不勝感激。

編輯:決定繼續併發布user.php的全部內容,因爲根據一個答案進行更改,使此文件添加的html完全消失。現在我猜,大概有幾件事我做錯了:

<html> 
    <span id="user"> 
      <ul> 
       <?php 
        //if user is logged in, show name and Log Out option, else show Log In and Sign Up options 
        if(isset($_COOKIE["user"])) { 
         setSessionUserData($_COOKIE["user"]); 
         echo "<li>Logged in as {$_SESSION["username"]}</li>"; 
         echo "<li>&nbsp;|&nbsp;</li>"; 
         echo "<li><a href='#' id='logout_link'>Log Out</a></li>"; 
        } else { 
         echo "<li><a href='#' id='login_link'>Log In</a></li>"; 
         echo "<li>&nbsp;|&nbsp;</li>"; 
         echo "<li><a href='#'>Sign up</a></li>"; 
        } 
       ?> 
      </ul> 
    </span> 

    <div id="login_dialog" title="Existing User"> 
     <form id="login_form"> 
      <fieldset> 
       <label for="userid">Username</label> 
       <input type="text" name="username" id="username" /> 
       <label for="pw">Password</label> 
       <input type="password" name="pw" id="pw" /> 
      </fieldset> 
     </form> 
     <span class = "error"></span> 
    </div> 
    <div id="logout_dialog" title="Log Out"> 
     <p><span class="ui-icon ui-icon-alert alert-icon"></span>Are you sure you want to log out?</p> 
    </div> 

    <script> 
    $(function() { 
     var username = $("#username"), 
     password = $("#pw"), 
     loginFields = $([]).add(username).add(password); 

     $("#login_link").click(function() { 
      $("#login_dialog").dialog("open"); 
     }); 

     $("#logout_link").click(function() { 
      $("#logout_dialog").dialog("open"); 
     }); 

     $("#login_dialog").dialog({ 
      autoOpen: false, 
      height: 200, 
      width: 250, 
      resizeable: false, 
      modal: true, 
      buttons: { 
       Submit: function() { 
        $.post("auth.php", 
          { 
          username: $("#username").val(), 
          password: $("#pw").val() 
          }, 
          function(result) { 
           if(result=='success'){ 
             window.location='Practice.php'; 
           } 
           else { 
            $(".error").html(result); 
           } 
          } 
         ) 
        }, 
       Cancel: function(){ 
        $(this).dialog("close"); 
       }     
      }, 
      close: function() { 
       loginFields.val(""); 
      } 
     }); 

     $("#logout_dialog").dialog({ 
      autoOpen: false, 
      modal: true, 
      height: 150, 
      resizeable: false, 
      buttons: { 
       Okay: function() { 
        window.location = "logout.php"; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 

    }); 
</script> 
</html> 

<?php 

function setSessionUserData($cookie) { 
    $con = connect(); 

    $query = "SELECT * FROM practice_user WHERE userid = '$cookie'"; 
    $result = mysqli_query($con, $query); 
    $userData = mysqli_fetch_array($result); 

    $_SESSION["username"] = $userData["username"]; 
    $_SESSION["fname"] = $userData["first_name"]; 
    $_SESSION["lname"] = $userData["last_name"]; 
} 

?> 

...和PHP:

if($_SERVER["REQUEST_METHOD"] == "POST") { 
$user = test_input($_POST["username"]); 
$pass = test_input($_POST["password"]); 

//check if correct login 
if (chkLogin($user, $pass)) { 
    $id = getUser($user, $pass); 
    setUserCookie($id); 
    header("Location: Practice.php"); 
} 
//check if username exists but incorrect password entered 
else if (chkUser($user)) { 
    echo "Username and password do not match"; 
} 
//Or else return that username doesn't exist 
else { 
    echo "Username does not exist"; 
} 

}

有在我的代碼等功能處理驗證等。
如果我需要發佈這些內容,請讓我知道。

+0

你是什麼意思「返回用戶表單的副本」?它看起來像這個PHP代碼只是發出重定向或回顯一個字符串。我沒有看到任何其他潛在產出。代碼中是否有其他輸出未顯示?我不清楚這裏發生了什麼。 – David

+1

在你的PHP你做了成功的重定向,爲什麼不只是返回成功,並在JavaScript中做重定向? – MamaWalter

+0

在這個特定的文件中有很多代碼。我在這裏發佈的內容僅涉及登錄功能。其餘的是驗證功能和其他功能的代碼(註銷,創建賬戶等)。 我認爲問題在於我如何處理PHP中的事情。我確實希望它重定向成功......我可能沒有正確地執行AJAX ...或PHP。我不太確定:/ – amthomas2112

回答

2

你可以試試這個,

你可以不能夠在頁面重定向AJAX調用PHP文件本身,所以重定向部分移入JavaScript端。

jQuery的,

$("#login_dialog").dialog({ 
      autoOpen: false, 
      height: 200, 
      width: 250, 
      resizeable: false, 
      modal: true, 
      buttons: { 
       Submit: function() { 
        $.post("auth.php", 
          { 
          username: $("#username").val(), 
          password: $("#pw").val() 
          }, 
          function(result) { 
           if(result=='success'){ 
            window.location='Practice.php'; 
           }else{ 
            $(".error").html(result); 
            } 
           } 
         ) 
        }, 
       Cancel: function(){ 
        $(this).dialog("close"); 
       }     
      }, 
      close: function() { 
       loginFields.val(""); 
      } 
     }); 

創建新頁面名爲auth.php,包括你所依賴的PHP函數。

<?php 

    if($_SERVER["REQUEST_METHOD"] == "POST") { 
    $user = test_input($_POST["username"]); 
    $pass = test_input($_POST["password"]); 

    //check if correct login 
    if (chkLogin($user, $pass)) { 
     $id = getUser($user, $pass); 
     setUserCookie($id); 
     echo "success"; 
    } 
    //check if username exists but incorrect password entered 
    else if (chkUser($user)) { 
     echo "Username and password do not match"; 
    } 
    //Or else return that username doesn't exist 
    else { 
     echo "Username does not exist"; 
    } 
} 
?> 
+0

修復了功能放置的一堆問題,現在錯誤信息正常工作,但Cookie和重定向的設置不會發生。任何想法爲什麼這可能是? – amthomas2112

+0

更正:設置cookie有效。現在一切正常,除了成功的重定向...我的頭撞到諺語的牆上,現在試圖找出爲什麼這不起作用.. – amthomas2112

+0

'function(result){console.log(result);'你能更新控制檯日誌中的結果值! –

1

如果你不想做一個重定向所有你認爲是因爲Ajax響應被附加到$('.error')容器,你得到一個錯誤。

這可能會幫助你

Submit: function() { 
       $.post("user.php", 
         { 
         username: $("#username").val(), 
         password: $("#pw").val() 
         }, 
         function(result) { 
          if(result=='success'){ 
           $("#login_dialog").append(result); 
           setTimeout(function(){ 
            $("#login_dialog").dialog("close"); 
           },800); 
          }else{ 
           $('.error').html(result); 
          } 
         } 
        ) 
       }, 

這個結果添加到對話框和後800毫秒

+0

這樣做產生了相同的結果。 – amthomas2112

0

多次嘗試後關閉它得到Krish的r法的工作,通過使一個AJAX調用一個單獨的PHP頁面的代碼,並通過window.location重定向成功,我發現window.location在AJAX調用的成功中不能自行工作。我最終發現this answer出現了一個類似的問題,它使用了window.location.assign(data)代替,而且工作完美。

雖然我不明白爲什麼這種不同的方法是必要的,但它確實可以解決重定向問題。感謝所有回覆的人。我正在接受Krish R的回答,因爲它最接近解決方案。