需要帮助使用 cookie 完成登录脚本


Need help finishing loginscript with cookie

我的问题是,当我提交我的logform时,脚本显示"用户不存在",即使它确实存在于我的数据库中。

工作正常:如果未设置任何输入字段,它将正确打印"填写两个输入字段"。

PHP脚本

<? 
if(isset($_POST['login'])){////4
$hostname = "localhost";
$data_username = "xxxxx"; //database username
$data_password = "xxxxx"; //database password
$data_basename = "xxxxx"; //database name
$conn = mysql_connect("".$hostname."","".$data_username."","".$data_password."");  
mysql_select_db("".$data_basename."") or die(mysql_error()); 
$lastvisit = date("d-m-Y H:i:s");

if(isset($_POST['username']) && !empty($_POST['username'])  AND isset($_POST['password']) && !empty($_POST['password'])) {///3
    $check_user_data = mysql_query("SELECT * FROM so_users WHERE `username` = '$username'") or die(mysql_error());
    if(mysql_num_rows($check_user_data) !== 0){ //// 2
        $get_user_data = mysql_fetch_array($check_user_data);
        if($get_user_data['password'] == $password){//// 1
            if (isset($_POST['rememberme'])) {
                /* Set cookie to last 1 year */
                setcookie('username', $_POST['username'], time()+60*60*24*365, '/projekter/smartorder', 'www.xxxxx.dk');
                setcookie('password', $_POST['password'], time()+60*60*24*365, '/projekter/smartorder', 'www.xxxxx.dk');
                setcookie('usertype', $get_user_data['usertype'], time()+60*60*24*365, '/projekter/smartorder', 'www.xxxxx.dk');
                mysql_query("UPDATE so_users SET visits=visits+1 WHERE username='$username'");
                mysql_query("UPDATE so_users SET lastvisit='$lastvisit' WHERE username='$username'");
            } else {
                /* Cookie expires when browser closes */
                setcookie('username', $_POST['username'], false, '/projekter/smartorder', 'www.xxxxx.dk');
                setcookie('password', $_POST['password'], false, '/projekter/smartorder', 'www.xxxxx.dk');
                setcookie('usertype', $get_user_data['usertype'], false, '/projekter/smartorder', 'www.xxxxx.dk');
                mysql_query("UPDATE so_users SET visits=visits+1 WHERE username='$username'");
                mysql_query("UPDATE so_users SET lastvisit='$lastvisit' WHERE username='$username'");
            }
            header('Location: index.php');
       }//// 1
       else { $msg = 'Incorrect password<br><div class="border"></div><br>'; }
       }/// 2
       else { $msg = 'User does not exist!<br><div class="border"></div><br>'; }
       }/// 3
       else { $msg = 'You must fill out both fields!<br><div class="border"></div><br>'; }
       }/// 4


?>

网页表单:

<form class="boxCont" method="POST">
    <?php echo '<div class="statusmsg">'.$msg.'</div>'; ?>
        <div>
            <label for="userName">Username</label>
            <input id="username" type="text" name="username" placeholder="Please enter your username here" />
        </div>
        <br>
        <div>
            <label for="password">Password</label>
            <input id="password" type="password" name="password" placeholder="And your password here" />
        </div>
        <div>
                    <label>
                    <input type="checkbox" id="login" name="login" value="Login" style="margin-top:32px;"/>&nbsp;Remember me
                    </label>​
                    <input type="submit" id="login" name="login" value="Login" class="btn right" />
                </div>
        <div class="border"></div>
        <div style="font-size: 12px; margin-left:124px; color: #888888;">
             Arent't user yet? Register <a href="/projekter/smartorder/signup" style="color: #555555; font-weight: bold;">here</a>
        </div>
    </form>

你没有在任何地方设置$username的值(除非你打开了register_globals,在这种情况下......稍后会详细介绍),因此您的查询显示为:

SELECT * FROM so_users WHERE `username` = ''
                                           ^--look mom, no username!

如果你确实register_globals打开,那么我建议你立即关闭你的网络服务器,然后去阅读PHP网站上的文档,为什么register_globals是有史以来最大的愚蠢行为。

看到这样的构造:

mysql_select_db("".$data_basename."") or die(mysql_error()); 
                ^^-- huh?        ^^^-- double-huh?

建议一定数量的货物崇拜节目。

使用cookie而不是'$_SESSION'有什么原因吗?Cookie 存储在客户端的 PC 上,在服务器向客户端发送 HTML 之前,会话在服务器上进行处理。

因此,将密码存储在 cookie 而不是会话变量中可能非常不安全。

另外,在您的代码中

("SELECT * FROM so_users WHERE `username` = '$username'")

丢失 ' 周围的用户名。

^ 正如Matthieu所说,这确实是不必要的,但你应该记住,使用cookie是非常不安全的。