-2

您好,我按照 php 教程创建了示例登录系统。但它似乎不起作用。下面的代码有什么问题。

login_success.php

<?php
session_start();
if(!$_SESSION['myusername'])
{
header("location:main_login.php");
}
?>

<html>
<body>
Login Successful
</body>
</html>

它说它“检查会话是否未注册,重定向回主页。” 但是每当我输入无效的用户名和密码时,它都不会转到 main_login.php 而是转到 check_login.php

**更新:check_login.php 上弹出无效的用户名和密码我认为它应该在 main_login.php 上。我将发布我的整个代码,以便您可以帮助我

check_login.php

    <?php

ob_start();
$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password="root"; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword"); 
header("Location:login_success.php");
}
else {
echo "Wrong Username or Password";
}
ob_end_flush();
?>

main_login.php

<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="form1" method="post" action="check_login.php">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong>Member Login </strong></td>
</tr>
<tr>
<td width="78">Username</td>
<td width="6">:</td>
<td width="294"><input name="myusername" type="text" id="myusername"></td>
</tr>
<tr>
<td>Password</td>
<td>:</td>
<td><input name="mypassword" type="text" id="mypassword"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Login"></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
4

5 回答 5

1

当您尝试使用正确的凭据登录时,可能已经设置了会话。您可能必须在注销期间取消设置会话变量。

unset($_SESSION['myusername']);
于 2013-05-01T00:55:10.643 回答
1

main_login.php // 你的页面看起来不错。表单操作将您带到 check_login。

<form name="form1" method="post" action="check_login.php">

check_login.php: // 将 session_register() 更改为:

// Register $myusername, $mypassword and redirect to file "login_success.php"

$_SESSION["myusername"] = $myusername;
$_SESSION["mypassword"] = $mypassword;

login_success: // 整个页面在 php 标签中

session_start();

$_SESSION['myusername'] = 'myname';

if (isset($_POST['myusername'])) {
    $user = $_POST['myusername'];
    if (!isset($_SESSION["myusername"]) || $user != $_SESSION['myusername']) {
        header("Location: main_login.php");
    }
}
else {
    echo "login successful";
}

我已经针对数据库对此进行了测试,并且很肯定这可以正常工作。您似乎渴望学习,但您学习的是老式 php。查看phpacademy以学习更新的东西。尤其是使用数据库,您将明智地学习 PDO。花时间在 youtube 和其他资源上。

于 2013-05-01T01:33:11.020 回答
0

使用“isset”检查会话变量中是否有内容。就像是

if(!(isset($_SESSION['myusername']))) {
       ...
}
于 2013-05-01T00:44:05.120 回答
0

好吧,上面的代码中没有 PHP。听起来您需要放入一些 PHP 来检查您的会话变量以获取登录令牌,例如您可能有这样的东西。

<?php

    session_start();

    if(!isset($_SESSION['myusername']){
        header("HTTP/1.1 403 Forbidden");
        header("Location: http://localhost:8080/main_login.php");
    }

?>

<html>
    <body>
        Login Successful
    </body>
</html>

编辑:我现在看到了这个问题,来自 main_login.php 页面的帖子数据看起来不像被使用了。你可以试试这个 login_success.php

<?php
    $userName = $_POST['myusername'];
    $password = $_POST['mypassword'];

    /*Validate username and password - I am using a simple comparison because 
    I do not know if you are validating against a DB, text file, etx...*/

    if($userName == 'user' && $password == 'password'){
        session_start();
        $_SESSION['myusername'] = $userName; //This is storing the validated username in session
    }else{
        header("HTTP/1.1 403 Forbidden");
        header("Location: http://localhost:8080/main_login.php");
    }
?>

<html>
    <body>
        Login Successful
    </body>
</html>

session_register 在 PHP 5.3 中也被弃用并从 PHP 5.4 中删除

于 2013-05-01T00:54:45.533 回答
0

嗯,错误在于您正在尝试获取从未设置过的会话值,请查看 Html 中的表单,它显示“method = post”,因此,您需要以这种方式捕获该值

if(isset($_POST['myusername'])){
...
}

另一方面,如果您想设置会话的值,您只需要编写类似的内容

$_SESSION['sessionName'] = value;

而且,如果您想获得会话的价值,只需“调用”它

echo $_SESSION['sessionName']; //echo is for output, not for calling

请记住,您不是在设置会话的值,而是将输入的值发送到服务器,并且您使用 $_POST['nameOfInput'] 或 $_GET['nameOfInput'] 获取这些值

于 2013-05-01T01:28:31.193 回答