|
<? /* *
名称:cnkknd php login class * 描述:php用于登录的类,基于mysql * 作者:daniel
king,cnkknd@msn.com *
日期:start@2003/8/25,update@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]!='attachment')
$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();
|