2014-01-16 80 views
0

我有一個非常簡單的登錄腳本,此網站的需求工程。問題是這些頁面中的某些頁面是通過外部鏈接訪問的,幷包含一個查詢字符串。問題是,如何最好地生成登錄頁面並保留查詢字符串。我測試了下面的方法,但是登錄後,我最終得到一個空白頁面。jQuery的,PHP,MySQL的登錄頁面保留查詢

該文件背後的想法是將其列入受保護的頁面的最頂端。 $ Page變量在包含之前設置。

登錄進入頁面,檢查授權的頂部,如果有效,加載基礎頁面。否則,顯示登錄屏幕並返回到提交頁面的頂部。

添加查詢字符串以這種方式形式可能不是標準,但它的工作,從我的經驗,在正常的HTML。更合理的方式可能是解析PHP的SERVER [QUERY_STRING],並將其循環到隱藏的輸入中。我還沒有嘗試過,但我想我會把它放在一起,因爲有人可能完全有一個更好的主意。

<? session_start(); 
include('funclogin.inc'); 
if($_SESSION['LoggedIn']){ LogOut(); } 
else 
{ 
    if($_POST[Submit]) 
    { 
     if(empty($_POST[User]) || empty($_POST[Pass])) 
     { 
      $LoginResult = 5; 
     } 
     else 
     { 
      // Checks that Username is in database and password is correct 
      $LoginResult = ConfirmUser($_POST['User'], $_POST['Pass']); 
      if($LoginResult == 1) 
      { 
       $_SESSION['LoggedIn'] = true; 
      } 
     } 
    } 
    if(!$_SESSION['LoggedIn']) 
    { 
    ?> 
     <!DOCTYPE html> 
     <html> 
      <head> 
       <title> 
       My Title 
       </title> 
       <? include('include/MobileHead.inc'); ?> 
      </head> 
      <body> 
       <div data-role="page" id="LoginPage"> 
        <? include('include/MobileHeader.inc'); ?> 
        <div data-role="content"> 
         <form id="LoginForm" name="LoginForm" method="post" action="<?PHP echo($Page.'?'.$_SERVER['QUERY_STRING']); ?>" data-ajax="false"> 
          <div data-role="fieldcontain"><label for="User">Username:</label> 
           <input type="text" id="User" name="User" maxlength="12" autofocus required /> 
          </div> 
          <div data-role="fieldcontain"><label for="Pass">Password:</label><input type="password" id="Pass" name="Pass" maxlength="15" required /></div> 
          <input type="hidden" name="K" value="<?PHP echo($_REQUEST['K']); ?>" /> 
          <input type="hidden" name="M" value="<?PHP echo($_REQUEST['M']); ?>" /> 
          <div data-role="fieldcontain"><input data-theme="b" type="Submit" name="Submit" value="Enter" /></div> 
         </form> 
        </div><!-- /content --> 
        <? include('include/MobileFoot.inc'); ?> 
       </div><!-- page --> 
      </body> 
     </html> 
    <?PHP 
    } 
} 
?> 

編輯: 我想出瞭解決辦法如下: 在中,我想要求一個登錄頁面,

if(!$LoggedIn) 
{ 
    $Page = "http://www.mydomain.com/mypage.php"; 
    header('Location: login.php?Page='.$Page.'&'.$_SERVER['QUERY_STRING']); 
} 

在login.php中 設置查詢字符串,它現在包括頁面,在形式的行動:

<form id="LoginForm" name="LoginForm" method="post" action="<?PHP echo($_SERVER[PHP_SELF].'?'.$_SERVER['QUERY_STRING']); ?>" data-ajax="false"> 

因此,在成功登錄,我這樣做

$LoginResult = ConfirmUser($_POST['User'], $_POST['Pass']); 
if($LoginResult == 1) 
{ 
    $_SESSION['LoggedIn'] = true; 
    $QueryString = ""; 
    if(!empty($_SERVER['QUERY_STRING'])) 
    { 
     $Str = explode('&',$_SERVER['QUERY_STRING']); 
     $Count = count($Str); 
     for($i=0;$i<$Count;$i++) 
     { 
      $Var = explode('=',$Str[$i]); 
      if($Var[0] == "Page") 
       { 
       $Page = $Var[1]; 
       } 
       else 
       { 
       $kv[] = $Str[$i]; 
       } 
      } 
      $QueryString = join("&", $kv); 
     } 
     Redirect($Page.'?'.$QueryString); 
    } 

重定向只是一些JavaScript我放進一個PHP函數,爲了方便:

function Redirect($n) 
{ 
    die("<script type=\"text/javascript\">window.location='$n';</script>"); 
} 
+0

爲什麼當某人登錄並進入某個頁面時,您要做的第一件事就是將其註銷? – towr

+0

僅當用戶未登錄時纔會將用戶發送至腳本(因此「LogOut」將被忽略),或者他們按下「註銷」按鈕,當然,這些按鈕僅在登錄時纔可見。 – RationalRabbit

回答

1

這是在以下幾個步驟:

  • 有人訪問你的登錄頁面只:/member?mydata=x

  • 您檢查會話,如果他們沒有登錄,您重定向他們到登錄頁面,保持查詢字符串:/login?mydata=x

  • 在登錄頁面上,你要麼修改表單操作,包括查詢字符串或者你設置的查詢字符串在會話

  • 如果登錄成功,你要麼閱讀確認頁的查詢字符串,或從會話閱讀並相應地重定向用戶。

如果要保留完整的原始路徑(/member?mydata=x)和重定向,而不是標準登錄後頁面出現可以修改這個工作。但這個想法是一樣的:看看他們要求什麼,通過登錄過程保留並相應地重定向。

+0

是的 - 似乎主要的問題是試圖在一頁上完成這一切,jQuery似乎並不喜歡這麼多。我嘗試解析查詢字符串並將其放入隱藏變量,但它仍然無處可去。我會嘗試你的建議。 – RationalRabbit

+0

不知道你想要在一個頁面上。在這種情況下,您應該在需要時使用登錄彈出窗口,並使其執行AJAX調用以檢查憑據並更新會話。如果AJAX返回成功,只需刷新頁面,然後它應該選擇AJAX調用中設置的會話登錄參數,並正常加載頁面,而無需登錄彈出窗口。 – Shomz

+0

雖然我不得不做一些操縱,但這樣做的伎倆。我將查詢字符串放在登錄表單Action中,將「Page」作爲字符串中的第一個var,然後將其解析爲2個變量 - Page和QueryString。我在編輯中添加了這個。 – RationalRabbit

0

代碼農產品PHP警告/注意事項的一些作品,例如:$_POST[Submit]應該$_POST['Submit']

如果是固定(不改變)的幾個參數,這的確是一個不錯的選擇,把它們放在你的形式(如隱藏字段),並將它們發送到您的登錄過程頁面。查詢參數是否發送到下一頁,因爲它們處於表單操作中?