好的,我有一个如下所示的登录表单:
<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> </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");
}
?>
答案 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>
标记。如果您关闭该标签,或将登录表单移出其他表单,您应该没问题。第一个表单标记未指定action
或method
,因此只是对同一页面执行GET请求,将您的数据放入URL中。
答案 5 :(得分:0)
您正在使用相对网址在login-exec.php中使用标头重定向,您应该使用绝对路径。
答案 6 :(得分:0)
如果以上都不起作用,我能想到的另一件事就是它可能是你“行动”中的道路。您是否尝试过 ./ members / login-exec.php (而不是 members / login-exec.php )?