2009-07-28 98 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)?