2009-07-28 41 views
1

好吧,我有一個登錄表單,看起來像這樣:HTML登錄表單無法正常工作

<form id="loginForm" name="loginForm" method="post" action="login-exec.php"> 
<table width="300" border="0" align="center" cellpadding="2" cellspacing="0"> 
<tr> 
    <td width="112"><b>Login</b></td> 
    <td width="188"><input name="login" type="text" class="textfield" id="login" /></td> 
</tr> 
<tr> 
    <td><b>Password</b></td> 
    <td><input name="password" type="password" class="textfield" id="password" /></td> 
</tr> 
<tr> 
    <td>&nbsp;</td> 
    <td><input type="submit" name="Submit" value="Login" /></td> 
</tr> 
</table> 
</form> 

現在,這種形式是在一個目錄中稱爲成員頁面上。當我把它放在主目錄中的一個頁面上,並將操作改爲「members/login-exec.php」當我嘗試登錄時,它只刷新頁面,但瀏覽器中的頁面名稱更改爲採取的操作放置在表單中。

關於使這個工作傢伙的任何想法?

編輯,繼承人按登錄exec.php代碼:

<?php 
//Start session 
session_start(); 

//Include database connection details 
require_once('config.php'); 

//Array to store validation errors 
$errmsg_arr = array(); 

//Validation error flag 
$errflag = false; 

//Connect to mysql server 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); 
if(!$link) { 
    die('Failed to connect to server: ' . mysql_error()); 
} 

//Select database 
$db = mysql_select_db(DB_DATABASE); 
if(!$db) { 
    die("Unable to select database"); 
} 

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

//Sanitize the POST values 
$login = clean($_POST['login']); 
$password = clean($_POST['password']); 

//Input Validations 
if($login == '') { 
    $errmsg_arr[] = 'Login ID missing'; 
    $errflag = true; 
} 
if($password == '') { 
    $errmsg_arr[] = 'Password missing'; 
    $errflag = true; 
} 

//If there are input validations, redirect back to the login form 
if($errflag) { 
    $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
    session_write_close(); 
    header("location: login-form.php"); 
    exit(); 
} 

//Create query 
$qry="SELECT * FROM members WHERE login='$login' AND passwd='".md5($_POST['password'])."'"; 
$result=mysql_query($qry); 

//Check whether the query was successful or not 
if($result) { 
    if(mysql_num_rows($result) == 1) { 
     //Login Successful 
     session_regenerate_id(); 
     $member = mysql_fetch_assoc($result); 
     $_SESSION['SESS_MEMBER_ID'] = $member['member_id']; 
     $_SESSION['SESS_FIRST_NAME'] = $member['firstname']; 
     $_SESSION['SESS_LAST_NAME'] = $member['lastname']; 
     session_write_close(); 
     header("location: members.php"); 
     exit(); 
      }else { 
     //Login failed 
     header("location: login-failed.php"); 
     exit(); 
      } 
       }else { 
      die("Query failed"); 
       } 
        ?> 
+0

需要查看PHP代碼,以查看是否沒有設置。 – Petrogad 2009-07-28 14:55:55

+0

你能告訴我們什麼是登錄exec.php文件內? – 2009-07-28 15:07:34

+0

@Christian Toma,我只是提出了我的問題。 – 2009-07-28 15:09:51

回答

2

首先,這是您的表格,但沒有表格。這應該是一個有點容易調試,這是更多的語義:

<form id="loginForm" name="loginForm" method="post" action="members/login-exec.php"> 
    <fieldset id="login_fields"> 
    <label for="login">Login</label> 
      <input name="login" type="text" class="textfield" id="login" /> 
    <label for="password">Password</label> 
      <input name="password" type="password" class="textfield" id="password" /> 
    <input type="submit" name="Submit" value="Login" /> 
    </fieldset> 
</form> 

所以棘手的部分是找出錯誤是否與窗體或腳本發生。我會一直假設劇本,但它很令人耳目一新,這很奇怪。

讓腳本做一些愚蠢的事情而不是檢查後期變量。就像腳本輸出輸入的用戶名一樣,或者只是「我是你的腳本。點擊提交就把你帶到了這裏。」

如果腳本輸出你使用的任何東西,那意味着表單很好(我認爲)。

您是否更新了標頭(「Location:members.php」)部分的腳本以重定向到members.php腳本的相對位置?

爲了避免相對位置的問題,你總是可以使用完整路徑,所以使動作:

action="/members/login-exec.php" 

,這將工作無論你在哪裏把它。

做同樣的登錄驗證腳本:

header("Location: /members/members.php") 

或者,如果你是舒服,你甚至可以使用完整路徑。


其他幾件事:

一:您還可以使用完整的URL的動作/位置。我會考慮至少在位置標題中這樣做。由於表單似乎到了某個地方並且做了些什麼,動作部分可能沒有問題。但是位置標題可能會更加棘手。

第二:我想知道腳本是否奇怪的原因是因爲PHP試圖猜測文件的位置。 PHP默認情況下會找出一個包含的文件,如果它不是它應該存在的地方的話(不幸的是,這會使PHP非常容易被利用)。也許它對位置標題做同樣的事情?我真的懷疑它,但它可能在另一個點我沒有注意到。

1

就像你在登錄-exec.php一些代碼,不工作的權利這聽起來我。看看你是否可以通過該頁面來查看1.是否被調用; 2.在什麼時候開始救助。

我的猜測是login-exec.php中的重定向認爲它運行在錯誤的目錄中。

1

您是否試圖在login-exec.php文件中執行標頭重定向?如果是這樣,你使用的是相對路徑還是絕對路徑?問題可能在那裏,因爲它應該是一個絕對路徑。

0

聽起來像是你正在打第一個重定向。爲了調試,您可以嘗試在header("location: login-form.php");之前放置die()聲明嗎?

例子:

die('Found error. Session: ' . var_export($_SESSION, true)); 
header("location: login-form.php"); 

關於絕對路徑的響應是在正確的軌道上 - 但只要你提供一個有效的登錄,你應該罰款。我假設members.php存儲在members目錄下?

不管是否需要,總是在重定向中使用絕對路徑是一種很好的做法。

更新:檢查您的網站後,看起來問題是登錄表單之前未封閉的<form>標記。如果您關閉該標籤,或將登錄表單移出其他表單,則應該沒問題。第一個表單標籤沒有指定actionmethod,所以只是對同一頁面進行GET請求,將數據放入URL中。

0

您正在使用相對URL在login-exec.php中使用標頭重定向,您應該使用絕對路徑。

0

如果以上都沒有奏效,我唯一能想到的其他事情就是它可能是您「行動」中的路徑。您是否試過./members/login-exec.php(而不是members/login-exec.php)?