|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。关于一个网站的背景办理体系,单一的超等办理员权限常常不克不及满意我们的需求,特别是关于年夜型网站而言,这类单一的权限会激发许很多多的成绩呈现。好比:一个网站编纂,平常他只是卖力公司网站的通告更新,但假如网站背景没有严厉的权限限定,他是否是就能够操纵到客户的一些信息,这是存在很年夜隐患的。假如学过ThinkPHP框架的伴侣必定晓得有个器材叫RBAC,明天咱不说谁人,来讲说在原生PHP言语中,怎样完成交织权限把持。好了,话未几说,老模样,间接说道理,上代码。关于权限的交织把持能够有良多种办法完成,这里只是供应一种思绪:(我接纳的是二进制数的办法)1、这里先提下按位与和按位或的运算办法:1、按位与运算符(&)列入运算的两个数据,按二进制位举行“与”运算。(“与”运算=>是不是有包括的值如:7&8=0)运算划定规矩:0&0=0;0&1=0;1&0=0;1&1=1;即:两位同时为“1”,了局才为“1”,不然为0比方:3&5即00000011&00000101=00000001因而,3&5的值得1。另,正数按补码情势列入按位与运算。2、按位或运算符()列入运算的两个工具,按二进制位举行“或”运算。(“或”运算=>能包括的值如:7=421,用“异或”往除包括如:7^2)运算划定规矩:00=0;01=1;10=1;11=1;即:列入运算的两个工具只需有一个为1,其值为1。比方:35 即0000001100000101=00000111因而,35的值得7。 另,正数按补码情势列入按位或运算。懂得了按位与和按位或的运算,我们来看上面这个例子:复制代码1<?php2define(ADD,1);//二进制13define(DELETE,2);//二进制104define(UPDATE,4);//二进制1005define(SELECT,8);//二进制100067//有权限为1,没有权限为08$admin=ADDDELETEUPDATESELECT;//11119$editor=ADDUPDATESELECT;//110110$user=SELECT;//100011?>复制代码我把增编削查分离做成了4个权限并定为常量1的二进制数是1,2的二进制数是10,4的二进制数是100,8的二进制数是1000,这里恰好成一个纪律大概有些伴侣会问下面权限变量admin,editor,user所对应的1111,1101,1000是怎样来的?PHP里有一个十进制数转二进制数的函数叫decbin()上面是对应的函数注释:复制代码decbin(PHP3,PHP4,PHP5)decbin--十进制转换为二进制申明stringdecbin(intnumber)前往一字符串,包括有给定number参数的二进制暗示。所能转换的最年夜数值为十进制的4294967295,其了局为32个1的字符串。例子1.decbin()典范<?phpechodecbin(12)."
";echodecbin(26);?>上例将输入:110011010拜见bindec(),decoct(),dechex()和base_convert()。复制代码我们来测试输入看看吧:复制代码1<?php234define(ADD,1);//二进制15define(DELETE,2);//二进制106define(UPDATE,4);//二进制1007define(SELECT,8);//二进制100089//有权限为1,没有权限为010$admin=ADDDELETEUPDATESELECT;//11111511$editor=ADDUPDATESELECT;//11011312$user=SELECT;//100081314echodecbin($admin)."<br/>";15echodecbin($editor)."<br/>";16echodecbin($user)."<br/>";171819?>复制代码输入了局:那末我们就能够使用这个运算来判别权限了,1代表有权限,0代表无权限好比:admin(超等办理员)具有的权限是增编削查也就是1111——>00001111editor(网站编纂)具有的权限是增,改,查也就是1101——>00001101user(一般用户)只具有扫瞄、查询的权限也就是1000——>00001000那末我们只需对它们举行按位与运算就能够判别是不是具有权限了比方:(从后往前看) 取十进制(数据库存储范例值)转二进制举行"与"运算网站编纂权限00001101(权限十进制为13)&00000010(删除权限十进制为2转二进制为10) 了局:00000000也就是没有具有权限再来尝尝一般用户权限00001000&00000001(增加权限十进制为1二进制为1) 了局:00000000也一样不具有权限超等办理员权限00001111&00001101(网站编纂的权限) 了局:00001101也就是具有了网站编纂的权限好了看详细实例吧我建了一个数据库,内里有2张表一张是user用户表:gid代表权限表的组id一张是权限表:flag代表增编削查的权限,可依据本人必要界说基础设置页面:config.php复制代码1<?php23define(HOST,localhost);4define(DBNAME,member);5define(USER,root);6define(PASS,);789$link=@mysql_connect(HOST,USER,PASS)ordie(数据库毗连失利);1011mysql_select_db(DBNAME,$link);1213define(ADD,1);//二进制114define(DELETE,2);//二进制1015define(UPDATE,4);//二进制10016define(SELECT,8);//二进制10001718//有权限为1,没有权限为019$admin=ADDDELETEUPDATESELECT;//111120$editor=ADDUPDATESELECT;//110121$user=SELECT;//100022?>复制代码上岸首页:index.html复制代码1<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2<htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en">3<head>4<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">5<title>Document</title>6</head>7<body>8<formaction="action.php"method="post">9账号:<inputtype="text"name="username"/>10暗码:<inputtype="password"name="password"/>11<inputtype="submit"name="submit"value="上岸">12</form>13</body>14</html>复制代码提交页面:action.php复制代码1<?php23require_once(config.php);4$username=$_POST[username];5$password=$_POST[password];678$sql="select*fromuserasa,roleasbwherea.gid=b.gid9anda.username=$usernameandpassword=$password";1011$result=mysql_query($sql);12if($data=mysql_fetch_array($result)){13//账号考证经由过程,判别对应权限14//此处判别的是是不是具有删除权限如:user数据库存储的值为8转二进制为1000删除权限的值为2转二进制为0010与运算0000无权限15if($data[flag]&DELETE){16echo"你有删除权限";17}else{18echo"你没有删除权限";19}2021}else{22echo"毛病账号暗码";23}242526?>基础这个工具是个比较笼统的概念,如果你之前学习过c语言,c语言被认为是 |
|