我正在使用效果很好的登录系统。我也在使用评论系统。除非用户已登录,否则注释功能不会显示(如下面的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;
}
答案 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文件,问题就停止了。