基于会话的登录不会;无法在远程服务器上工作


Session based login doesn't work on remote server

我目前正在为一个网站构建一个基于php的登录,该网站恰好在我用Wamp创建的本地主机中运行,但如果我将文件复制到远程服务器并在那里设置相同的数据库,它就不起作用。与数据库的连接应该是可以的,因为我可以在网站上注册一个新用户,网站也会显示要从数据库中删除的所有内容。

该网站的登录部分的问题在于它根本不做任何事情。我尝试登录,如果它有正确的帐户详细信息,它会说登录成功,并且它还会为了测试目的而回显会话变量(例如:它显示保存在数据库中的给定用户的ID)。但当我导航到另一个页面时,用户根本没有登录。我将尝试在这里列出所有应该很重要的代码,看看问题出在哪里:

登录表单:

<form action="submit.php" method="POST" id="loginForm">
    <fieldset>
        <table id="form_Table">
            <tr>
                <td><label for="login_Username">Username</label></td>
                <td><input type="text" name="login_Username" id="login_Username" class="" /></td>
            </tr>
            <tr>
                <td><label for="login_Password">Password</label></td>
                <td><input type="password" name="login_Password" id="login_Password" class="" /></td>
            </tr>
        </table>
    <p class="submit"><input type="submit" name="login_Submit" value="Log in" /></p>
    </fieldset>
</form>

处理submit.php中登录过程的php代码:

if (isset($_POST['login_Submit'])) { 
    if (!empty($_POST['login_Username']) && !empty($_POST['login_Password'])) {
        $username = mysql_real_escape_string($_POST['login_Username']);
        $password = md5(mysql_real_escape_string($_POST['login_Password']));
        $sql = "SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password'";
        $checklogin = mysql_query($sql);

        $result = mysql_query($sql);
        if($result === FALSE) {
            die(mysql_error());
        }
        if(mysql_num_rows($checklogin) == "1") {
            $row = mysql_fetch_array($checklogin);
            $group = $row['group'];
            $userid = $row['id'];
            $cart = array();
            $_SESSION['Username'] = $username;
            $_SESSION['Group'] = $group;
            $_SESSION['UserID'] = $userid;
            $_SESSION['LoggedIn'] = 1;
            $_SESSION['cart'] = $cart; 
            echo '<h1>Logged in successfully!</h1>';
            //echo '<meta http-equiv="refresh" content="1;index.php">';
            echo $_SESSION['Username'];
            echo $_SESSION['LoggedIn'];
            echo $_SESSION['UserID'];
            echo $_SESSION['Group'];
            } else {
            echo '<h1>Wrong username or password!</h1>';
                }
            }
        }

index.php:

<?php
@session_start();
include 'header.php';
?>

connection.php:

<?php
@session_start();
//connect variables are here
mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL connection error: " . mysql_error());  
mysql_select_db($dbname) or die("MySQL database error: " . mysql_error());
mysql_query('SET NAMES utf8');
?> 

header.php:

<?php include 'connection.php'; 
@session_start();?>

我的最佳猜测是,由于某种原因,在我离开给定页面后,网站没有保留会话变量,这就是为什么我将@session_start()添加到多个页面,但它也不能以这种方式工作。

由于我现在已经没有办法做什么了,任何帮助都将不胜感激。非常感谢。

当您收到"headers already sended"错误时,它应该指定导致过早输出的文件和行。

我怀疑您的一个文件中的PHP结束标记后面可能有一个尾随空格。因为这是一个问题,所以最好完全省略结束PHP标记。PHP解析器不在乎,那么你为什么要这样做呢?:)

一个简单的修复方法可能是简单地使用输出缓冲,但在这种情况下不应该是必要的。

你检查过是否正在设置cookie吗?你在哪里打session_destroy()session_start()应该只被调用一次。将其放入引导文件中,并将其包含在每个页面中,这可能是有意义的。