最后我有了这个功能。它完成它的工作,但它看起来非常混乱,只是想听听你的想法,也许他们可以改进他们的想法?
非常感谢!
登录
$result = mysql_query("SELECT * FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
$row = mysql_fetch_object($result);
if (mysql_num_rows($result) == 0) {
exit('Bad Login');
}
$_SESSION['id'] = mysql_result($result, 0, 'id');
# The user wants to be remembered
if (isset($_POST['remember'])) {
$key = md5(uniqid());
setcookie('remember', $key, time()+900000); /* expire in 10 days */
mysql_query("UPDATE users SET sessionkey = '$key' WHERE id = ".mysql_result($result, 0, 'id'));
}
在每一页上我都会检查:
if (isset($_SESSION['id'])) {
header("Location: welcome.php");
}
elseif (isset($_COOKIE['remember'])) {
$rs = mysql_query("SELECT * FROM users WHERE sessionkey = '$_COOKIE[remember]'");
if (mysql_num_rows($rs) == 1) {
$_SESSION['id'] = 1;
header("Location: welcome.php");
}
}
答案 0 :(得分:2)
在mysql_fetch_object($result)
语句之前放置检查行数是否为零的代码。这样,如果用户不存在,您不会浪费额外的CPU周期。
改变这个(在两个地方):
mysql_result($result, 0, 'id');
到
$row->id;
此外,如果您的id
列不符合要求(即:用户已在某个时间点输入了某些数据),您可能希望在UPDATE
查询中将其转义
只是对此问题的偏好,但当我检查网址参数存在时,我喜欢使用!empty()
而不是isset
。原因是如果参数设置但为空,它仍将返回false:
!empty($_POST['remember'])
另外,请务必清理$_COOKIE['remember']
。 Cookie值可以由用户更改。
mysql_query("SELECT * FROM users WHERE sessionkey = '" . mysql_real_escape_string($_COOKIE[remember]) . "'");
最后,最好不要在查询中选择*
,因为这可能会让您在应用中遇到性能问题。考虑只选择用户的ID:
mysql_query("SELECT id FROM users ...
其他一切看起来都不错!
答案 1 :(得分:0)
我不是PHP专家,但可能有一个现成的会话管理解决方案 - 我建议你自己动手使用它。