用户在第一次评论后被注销

时间:2010-05-31 10:30:49

标签: php mysql

我正在使用效果很好的登录系统。我也在使用评论系统。除非用户已登录,否则注释功能不会显示(如下面的commentformonoff.php所示)。

当用户发表评论时,信息将从“show_commentbox”函数传递到文件comments2a.php。然后,信息将传递给文件comments2.php。

首次在浏览器上启动网站时,登录并发表评论后,用户将被注销。在同一浏览器会话期间第二次登录后,用户在发表评论后不再注销。

如何在第一次评论后让用户登录?

提前致谢,

约翰

登录功能:

function show_loginform($disabled = false)
{

    echo '<form name="login-form" id="login-form" method="post" action="./index.php?'.$_SERVER['QUERY_STRING'].'"> 

    <div class="usernameformtext"><label title="Username">Username: </label></div> 
    <div class="usernameformfield"><input tabindex="1" accesskey="u" name="username" type="text" maxlength="30" id="username" /></div> 


    <div class="passwordformtext"><label title="Password">Password: </label></div> 
    <div class="passwordformfield"><input tabindex="2" accesskey="p" name="password" type="password" maxlength="15" id="password" /></div> 


    <div class="registertext"><a href="http://www...com/.../register.php" title="Register">Register</a></div> 
    <div class="lostpasswordtext"><a href="http://www...com/.../lostpassword.php" title="Lost Password">Lost password?</a></div> 

  <p class="loginbutton"><input tabindex="3" accesskey="l" type="submit" name="cmdlogin" value="Login" ';
    if ($disabled == true)
    {
        echo 'disabled="disabled"';
    }
    echo ' /></p></form>';


}

Commentformonoff.php:

<?php
if (!isLoggedIn())
{
    if (isset($_POST['cmdlogin']))
    {
        if (checkLogin($_POST['username'], $_POST['password']))
        {
            show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
        } else
        {
            echo "<div class='logintocomment'>Login to comment</div>";

        }
    } else
    {

        echo "<div class='logintocomment'>Login to comment</div>";
    }

} else
{
    show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
}
?>

功能“show_commentbox”:

function show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl)
{
echo '<form  action="http://www...com/.../comments/comments2a.php" method="post"> 
    <input type="hidden" value="'.$_SESSION['loginid'].'" name="uid">
    <input type="hidden" value="'.$_SESSION['username'].'" name="u">
    <input type="hidden" value="'.$submissionid.'" name="submissionid">  
    <input type="hidden" value="'.stripslashes($submission).'" name="submission">
    <input type="hidden" value="'.$url.'" name="url">
    <input type="hidden" value="'.$submittor.'" name="submittor">
    <input type="hidden" value="'.$submissiondate.'" name="submissiondate">
    <input type="hidden" value="'.$countcomments.'" name="countcomments">
    <input type="hidden" value="'.$dispurl.'" name="dispurl">



    <label class="addacomment" for="title">Add a comment:</label>

    <textarea class="checkMax" name="comment" type="comment" id="comment" maxlength="1000"></textarea>  

    <div class="commentsubbutton"><input name="submit" type="submit" value="Submit"></div> 
</form>
'; 
}

包含在comments2a.php中:

$uid = mysql_real_escape_string($_POST['uid']);
$u = mysql_real_escape_string($_POST['u']);

$query = sprintf("INSERT INTO comment VALUES (NULL, %d, %d, '%s', NULL)", $uid, $subid, $comment);

mysql_query($query) or die(mysql_error());

$lastcommentid = mysql_insert_id();
header("Location: comments2.php?submission=".$submission."&submissionid=".$submissionid."&url=".$url."&submissiondate=".$submissiondate."&comment=".$comment."&subid=".$subid."&uid=".$uid."&u=".$u."&submittor=".$submittor."&countcomments=".$countcomments."&dispurl=".$dispurl."#comment-$lastcommentid");
exit(); 

包含在comments2.php中:

if($_SERVER['REQUEST_METHOD'] == "POST"){header('Location: http://www...com/.../comments/comments2.php?submission='.$submission.'&submissionid='.$submissionid.'&url='.$url.'&submissiondate='.$submissiondate.'&submittor='.$submittor.'&countcomments='.$countcomments.'&dispurl='.$dispurl.'');}

$uid = mysql_real_escape_string($_GET['uid']);
$u = mysql_real_escape_string($_GET['u']);
编辑:有人说这些可能有用,所以我发布它们。

function isLoggedIn()
{

    if (session_is_registered('loginid') && session_is_registered('username'))
    {
        return true; // the user is loged in
    } else
    {
        return false; // not logged in
    }

    return false;

}

function checkLogin($u, $p)
{
global $seed; // global because $seed is declared in the header.php file

    if (!valid_username($u) || !valid_password($p) || !user_exists($u))
    {
        return false; // the name was not valid, or the password, or the username did not exist
    }

    //Now let us look for the user in the database.
    $query = sprintf("
        SELECT loginid 
        FROM login 
        WHERE 
        username = '%s' AND password = '%s' 
        AND disabled = 0 AND activated = 1 
        LIMIT 1;", mysql_real_escape_string($u), mysql_real_escape_string(sha1($p . $seed)));
    $result = mysql_query($query);
    // If the database returns a 0 as result we know the login information is incorrect.
    // If the database returns a 1 as result we know  the login was correct and we proceed.
    // If the database returns a result > 1 there are multple users
    // with the same username and password, so the login will fail.
    if (mysql_num_rows($result) != 1)
    {
        return false;
    } else
    {
        // Login was successfull
        $row = mysql_fetch_array($result);
        // Save the user ID for use later
        $_SESSION['loginid'] = $row['loginid'];
        // Save the username for use later
        $_SESSION['username'] = $u;
        // Now we show the userbox
        return true;
    }
    return false;
}

3 个答案:

答案 0 :(得分:1)

我认为你的错误是在isLoggedIn()中你可以发布这个。因为您有两个路径来编写注释框。这可能意味着在登录时选择了第一条路径,但是在刷新时,当你应该到达第二条路径时它不会。

错误也可能在checkLogin中,而不是设置会话变量?

请发布isLoggedIn()和checkLogin():)


<?php
if (!isLoggedIn()) // most likely the place of error
{
    if (isset($_POST['cmdlogin']))
    {
        if (checkLogin($_POST['username'], $_POST['password'])) // setting session variable correctly?
        {
            // path one
            // are you supposed to set some session variables here? or in checkLogin()?
            show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
        } else
        {
            echo "Login to comment";

        }
    } else
    {

        echo "Login to comment";
    }

} else
{
    // path two
    show_commentbox($submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl);
}
?>

编辑: 在isLoggedIn()中使用isset()而不是session_is_registered()。自PHP 5.3.0起,不推荐使用session_is_registered()。 if(isset($_SESSION['loginid']) && isset($_SESSION['username'])

在文件底部CommentOnOff.php你可以输入这段代码吗? var_dump($_SESSION) 它应该打印出会话中包含的所有内容。然后你可以看到loginind和username是否实际存储在会话中:)

答案 1 :(得分:0)

很高兴看到更多关于正在发生的事情。这些只是你认为可能很重要的片段,而不是整件事。

您提交的代码存在一些问题: - commentformonoff.php如何连接到您提交的其他php文件? - isLoggedIn()和checkLogin()函数会发生什么? - 为什么要将函数拆分为comments2.php和comments2a.php?无理由地重定向只会增加执行的延迟。有没有理由你不能在那里处理请求? - 评论值直接进入查询而没有在comments2a.php中的卫生,这是一个严重的安全漏洞。 - 在comments2a.php中,您创建一个重定向并通过GET传递变量,并在comments2.php中检查POST并在找到发布请求时重定向。你为什么这样做?

如果可以的话,请查看 Smarty ,这不是一个很大的开销,你不必编写函数吐出html表单。或者,如果内部没有参数,可以直接在代码中包含html代码,关闭并重新打开php标记。

答案 2 :(得分:0)

我在开发的网络应用中出现了类似的症状。

尝试将favicon.ico文件(空文件正常)添加到应用程序的根目录。

这些是我正在经历的症状......

火狐:

用户登录,首先出现“登录”页面。用户单击链接并且不再登录。用户再次登录并首先“登录”页面。用户单击链接并仍然登录。用户继续使用该应用程序作为登录用户没有问题。

铬:

用户登录,首先出现“登录”页面。用户单击链接并且不再登录。用户再次登录并首先“登录”页面。用户单击链接并再次注销。用户在首次“登录”页面后无法保持登录状态。

我检查了错误日志,发现每个请求都希望获取favicon.ico文件。我在我的应用程序根目录中添加了一个空的favicon.ico文件,问题就停止了。