Html LogIn表单无法正常运行

时间:2009-07-28 14:52:45

标签: php 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的目录中的页面上。当我把它放在主目录的页面上并将操作更改为“members / login-exec.php”当我尝试登录时只刷新页面,但浏览器中页面的名称更改为采取的操作放在表格中。

关于让这个人工作的任何想法?

编辑,继承了login-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");
                }
                    ?>

7 个答案:

答案 0 :(得分: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。我会考虑至少为Location标头做这个。由于表格似乎在某处并且做某事,因此行动部分可能很好。但是位置标题可能有点暴躁。

第二:我想知道脚本是否做了一些奇怪的事情是因为PHP试图猜测文件的位置。 PHP默认情况下将寻找一个包含的文件,如果它不是它应该的位置(这使PHP非常容易被利用)。也许它对Location头文做了同样的事情?我真的很怀疑它,但它可能与我没有注意到的另一点相关。

答案 1 :(得分:1)

听起来好像你在login-exec.php中有一些代码不正常。看看你是否可以通过该页面查看1.如果它被调用; 2.在什么时候祸了。

我的猜测是,login-exec.php中的重定向认为它在错误的目录中运行。

答案 2 :(得分:1)

您是否尝试在login-exec.php文件中执行标头重定向?如果是这样,您使用的是相对路径还是绝对路径?问题可能存在,因为它应该是一条绝对的道路。

答案 3 :(得分:1)

请参阅:http://www.webloginproject.com/login-project/php/

如果您不使用免费代码,至少可以看到如何编写健壮且安全的系统。

答案 4 :(得分:0)

听起来你正在进行第一次重定向。为了进行调试,您可以尝试在die()之前添加header("location: login-form.php");语句吗?

示例:

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

关于绝对路径的响应是正确的 - 但只要您提供有效登录,您应该没问题。我假设members.php存储在members目录下?

在重定向中始终使用绝对路径是一种好习惯,无论是否需要它们。

更新:检查您的网站后,在登录表单之前,问题似乎是未公开的<form>标记。如果您关闭该标签,或将登录表单移出其他表单,您应该没问题。第一个表单标记未指定actionmethod,因此只是对同一页面执行GET请求,将您的数据放入URL中。

答案 5 :(得分:0)

您正在使用相对网址在login-exec.php中使用标头重定向,您应该使用绝对路径。

答案 6 :(得分:0)

如果以上都不起作用,我能想到的另一件事就是它可能是你“行动”中的道路。您是否尝试过 ./ members / login-exec.php (而不是 members / login-exec.php )?