<?   
/*  
* 名称:CnkknD PHP Login Class  
* 描述:PHP用于登录的类,基于MySQL  
* 作者:Daniel King,[email]cnkknd@msn.com[/email]  
* 日期:Start@2003/8/25Update@2004/4/16  
*/  
  
class Login   
{   
var $appname="login"; //网站名称   
  
  
var $username; //用户名   
  
var $userpass; //密码   
  
  
var $authtable="account"; //验证用数据表   
  
var $col_username="username"; //用户名字段   
  
var $col_password="password"; //用户密码字段   
  
var $col_banned="banned"; //是否被禁止字段   
  
  
var $use_cookie=true; //使用cookie保存sessionid   
  
var $cookiepath='/'; //cookie路径   
  
var $cookietime=108000; //cookie有效时间   
  
  
var $err_mysql="mysql error"; //mysql出错提示   
  
var $err_auth="username invalid or wrong password"; //用户名无效提示   
  
var $err_user="user invalid"; //用户无效提示(被封禁)   
  
  
var $err; //出错提示   
  
  
var $error_report=false; //显示错误   
  
  
function Login($appname="")   
{   
$this->appname=$appname; //初始化网站名称   
  
}   
  
function isLoggedin() //判断是否登录   
  
{   
if(isset($_COOKIE['sid'])) //如果cookie中保存有sid   
  
{   
session_id($_COOKIE['sid']);   
session_start();   
if($_SESSION['appname']!=$this->appname) Return false;   
//为了防止不同的程序使用同一个登录类产生冲突,加了个appname作为区分标记   
  
return true;   
}   
else //如果cookie中未保存sid,则直接检查session   
  
{   
session_start();   
if(isset($_SESSION['appname']))   
return true;   
}   
return false;   
}   
  
function userAuth($username,$userpass) //用户认证   
  
{   
$this->username=$username;   
$this->userpass=$userpass;   
$query="select * from `".$this->authtable."` where `".$this->col_username."`='$username';";   
$result=mysql_query($query);   
if(mysql_num_rows($result)==1) //找到此用户   
  
{   
$row=mysql_fetch_array($result);   
  
if($row['banned']==1) //此用户被封禁   
  
{   
$this->errReport($this->err_user);   
$this->err=$this->err_user;   
return false;   
}   
elseif(md5($userpass)==$row[$this->col_password]) //密码匹配   
  
{   
$this->userinfo=$row;   
return true;   
}   
else //密码不匹配   
  
{   
$this->errReport($this->err_auth);   
$this->err=$this->err_auth;   
return false;   
}   
}   
else //没有找到此用户   
  
{   
$this->errReport($this->err_auth);   
$this->err=$this->err_auth;   
return false;   
}   
}   
  
function setSession() //置session   
  
{   
$sid=uniqid('sid'); //生成sid   
  
session_id($sid);   
session_start();   
$_SESSION['appname']=$this->appname; //保存程序名   
  
$_SESSION['userinfo']=$this->userinfo; //保存用户信息(表中所有字段)   
  
  
if($this->use_cookie) //如果使用cookie保存sid   
  
{   
if(!setcookie('sid',$sid,time()+$this->cookietime,$this->cookiepath))   
{   
$this->errReport("set cookie failed");   
$this->err="set cookie failed";   
}   
}   
else  
setcookie('sid','',time()-3600); //清除cookie中的sid   
  
}   
  
function userLogout() //用户注销   
  
{   
session_start();   
unset($_SESSION['userinfo']); //清除session中用户信息   
  
unset($_SESSION['appname']); //清除session中程序名   
  
if(setcookie('sid','',time()-3600)) //清除cookie中的sid   
  
return true;   
else    
return false;   
}   
  
function errReport($str) //报错   
  
{   
if($this->error_report)   
echo "ERROR: $str";   
}   
}   
?>   
注意一下置session的一段,我是用select *把所有字段的信息都取出来了,其实没有必要,很多字段没有必要放在session里,大家可以根据需要,在通过验证之后,修改$类名->userinfo,然后$类名->setSsesion()。   
  
放一个例子   
<?   
include 'header.php';   
  
if(isset($_POST[logout]))   
{   
$login->userLogout();   
die('<script>window.location="'.$_POST[url].'";</script>');   
}   
if(isset($_POST[login]))    
{   
if($login->userAuth($_POST[account],$_POST[passwd]))   
{   
if($_SERVER[PHP_SELF]!='p_w_upload') $login->setSession();   
die('<script>window.location="'.$_POST[url].'";</script>');   
}   
echo ($login->err);   
}   
if(!$login->isLoggedin()) echo '<form method=post action=login.php><input name=account><input type=password name=passwd><input type=submit name=login></form>';   
?>   
我这个里面的$_POST[url]一般是可以用$_SERVER["HTTP_REFERER"]取得的,但是有时候因为客户端装了诺顿的个人防火墙,$_SERVER["HTTP_REFERER"]就没用了。   
header.php里面关于login的一段   
include_once 'inc/classLogin.php';   
$login=new Login();   
$login->sitename='uu';   
$login->authtable='u_account';   
$login->col_username='account';   
  
$isloggedin=$login->isLoggedin();   
?>