百度空间 | 百度首页 
 
查看文章
 
Mojavi入门--第七章:生成query的类,session,用户认证功能
2007年01月22日 星期一 14:08

第七章:生成query的类,session,用户认证功能
1.生成query的类SQLStatement
     SQLStatement类,在SQLStatement实例中登录字段名后,可以进行生成query,添加或删除字段名,控制字段名等操作。例如:
/webapp/modules/Mochat/actions/IndexAction.class.php的向数据库中插入数据             
         //得到要插入的数据
            $name = $DB->qstr($request->getParameter('name'));
            $comment = $DB->qstr($request->getParameter('comment'));
            //保存数据
            $sql = "INSERT INTO t_comment(name,comment) VALUES ($name,$comment)";  
如果改成用SQLStatement操作             
           //调用并实例化
            require_once(OPT_DIR . 'sql/SQLStatement.class.php'); 
            $sqlst = new SQLStatement();
            //登陆数据的字段名
            $sqlst->setStringAttribute('name',$request->getParameter('name'));
            $sqlst->setStringAttribute('comment',$request->getParameter('comment'));
            //クエリ?作成
            $sql = $sqlst->prepare('INSERT INTO t_comment (%A{names}) VALUES (%A{values})');  
    使用SQLStatement的setStringAttribute()方法时,登陆字段名和数据后,在prepare()函数%A{names}中的内容是用逗号分割的字段名,%A{values}中的内容是用逗号分割的字段值。setStringAttribute()会自动执行特殊字符(如字符内有「'」sql会出错)及用「'」扩起的处理。
    的AutoExecute()函数的功能与SQLStatementADOdb相近。

2.SQLStatement
    SQLStatement的地址/mojavi/opt/sql/SQLStatement.class.php
    require_once(OPT_DIR . 'sql/SQLStatement.class.php');   
    调用
    $sqlst = new SQLStatement();生成实例
    主要是用以下两种方法将字段名和值登录到SQLstatement对象中。
 void setRawAttribute (string $name, mixed $value) 
    在Attribute内用$name做键$value设。此时尚未处理$value。
    例:$sqlst->setRawAttribute('number','110');
void setStringAttribute (string $name, mixed $value) 
    在Attribute内用$name做键$value设。与setRawAttribute不同,$value已被处理。(处理特殊字符和用‘’扩起$value)
    例:$sqlst->setStringAttribute('messages','This is test message.');
    此时$sqlst->attribute[messages]的值为'This is test message.'。  
    setStringAttribute()是主要针对字符串的函数,会自动对字符串做一些特殊处理。setRawAttribute()是针对数值型的函数,不对字符串作特殊处理。
    $name主要作为字段名,$value主要作为字段值是用。还有setRawValue(),setStringValue()等方法,不再详述。

    登陆后的数据可用prepare()函数调出。
string &prepare (string $statement)
  参数的字符串中可使用如下的控制代码
%a{name} 是attribute[name]的值
例 %a{title} → Test 
%A{names|values} 用逗号分割的字段名或字段值
例 %A{names} → id, title, messages 、 %A{values} → 'TestID', 'test', 'This is test message.' 
%C{constant} php的预设值
例 %C{BASE_DIR} → /workspace/mojavi/ 
%e attribute显示成name=value
例 %e → ID = 'TestID', title = 'test', messages = 'This is test message.' 
%n 换行
 
    调用SQLStatement.class.php:require_once(OPT_DIR . 'sql/SQLStatement.class.php');
    SQLStatement实例化:$sqlst = new SQLStatement();
    用setStringAttribute和setRawAttribute登陆数据:$sqlst->setStringAttribute('title','test');
    插入数据:$sql = $sqlst->prepare('INSERT INTO テ?ブル名(%A{names}) VALUES (%A{values})'); 
    更新数据:$sql = $sqlst->prepare("UPDATE テ?ブル名 SET %e WHERE ~"); 
    void removeAttribute(string $name)
    通过$name删除字段属性
    void clearAttributes()
    删除所有字段属性
3.session
    Mojavi通过User对象(Action的execute之类的参数$user)来使用session功能。
    User的使用方法与Request几乎相同,对$user进行setAttribute()和removeAttribute()操作。看如下例子:
/webapp/modules/Mochat/actions/IndexAction.class.php     /*
     * GET方式:读文件
     */
    function getDefaultView (&$controller, &$request, &$user)
    {
        …
        //设字段
        $request->setAttribute('data', $data);
        
        //从session中读入姓名
        $request->setAttribute('name',$user->getAttribute('name'));
                
        return VIEW_INPUT;
    }

    
    /*
     * POSTの方式:追加文件
     */
    function Execute (&$controller, &$request, &$user)
    {
        …
            
        //将姓名存入session中
        $user->setAttribute('name',$request->getParameter('name'));
            
        $module = $controller->getRequestModule();  //模块名
        $controller->redirect("?module=$module");
    }  
在session的有效时间内(默认180分钟)名字被保存在session内。
    在使用类似手机这样不能使用cookie的浏览器时,session被写入URL中,在编译PHP时如果不设定--enable-trans-sid(自动将session写入URL)的话session就会中断。
    User不能自动序列化,对象被存入session中时需要手动序列化。
4.Mojavi的认证功能
    认证功能主要有两步:用户认证,登陆权限。
5.用户认证
    为能使用认证功能,在需要使用认证的Action中,写入isSecure()函数,当需要认证时返回TRUE否则返回FALSE。
function isSecure ()
    {
        return TRUE;
    }  
所有Action的父类Action类已经定义了isSecure()函数,在未被重写的情况下通常返回FALSE。
    如果使用户被认证,需对User对象设置如下方法void setAuthenticated(bool $status)
    当$status为TRUE时认证,否则为FALSE时未认证。
    判断是否被认证用bool isAuthenticated()
    返回TRUE时为被认证,返回FALSE时为未被认证。 

    未认证的状态下与isSecure()设为TRUE的Action相连接时,将被转送到在config.php内被按如下设置的程序中处理(默认情况下是Default模块的GlobalSecure程序)
 define('AUTH_MODULE', 'Default');
define('AUTH_ACTION', 'Login'); 
6.设定权限
    认证后,如果想要设置权限的话,在Action内需设置可返回权限名的函数getPrivilege()。
    function getPrivilege (&$controller, &$request, &$user)
{
    return array('权限名', '权限namespace(可省略,默认为org.mojavi)');
}  
    
父类Action类中该函数已经被定义,默认的返回值是NULL(不设权限)
    namespace是权限的分类名,不指定的话也没关系。(内部处理时,在处理权限时,数组$namespace[$name]被设值时表示允许处理,未被设值表示不允许处理。namespace是数组,权限名是数组的键)

User的权限,User的如下函数群中设定。
void addPrivilege(string $name, [string $namespace = 'org.mojavi'])
    User中追加权限。$name权限名、$namespace
void  &removePrivilege(string $name, [string $namespace = 'org.mojavi'])
    删除User权限
void removePrivileges([string $namespace = 'org.mojavi'])
    删除指定的$namespace的所有权限。
login同时,权限也被设定

在没有权限的情况下,将被转送到在config.php内被按如下设置的程序中处理。(默认情况下是Default模块的GlobalSecure程序) define('SECURE_MODULE', 'Default');
define('SECURE_ACTION', 'GlobalSecure');  
7.Login示例
   以下是填入用户名和密码,利用数据库进行认证处理和添加权限的例子。
<?php
require_once(LIB_DIR . 'DBAction.class.php');

class LoginAction extends DBAction
{
    
    /*
     * GET方式:输入画面
     */
    function getDefaultView (&$controller, &$request, &$user)
    {
        return VIEW_INPUT;
    }

    
    /*
     * POST方式:认证
     */
    function Execute (&$controller, &$request, &$user)
    {
        $DB = $request->getAttribute('DB');
        
        $id = $db->qstr($request->getParameter('id'));
        $pass = $db->qstr($request->getParameter('pass')); 
        $sql = "SELECT Privilege FROM t_user WHERE id = $id AND pass = $pass";
        
        if($array = $db->GetRow($sql)){
            //认证成功
            $user->setAuthenticated(true);
            
            if($array['Privilege'] == 'admin') {
             //如果是管理者添加特权
             $user->addPrivilege('ADMIN');
            }
        }else{
            //认证失败
            return VIEW_INPUT;
        }
        
        //成功画面
        return VIEW_SUCCESS;
    }
 
    function getRequestMethods ()
    {
        return REQ_POST;
    }
    
    //校验功能有效
    function validate (&$controller, &$request, &$user)
    {
        return TRUE;
    }
    
    //Validator登陆
    function registerValidators (&$validatorManager, &$controller, &$request, &$user)
    {    
        //用户名密码必填
        $validatorManager->setRequired('id', TRUE, '用户名必填'); 
        $validatorManager->setRequired('pass', TRUE,'密码必填'); 
    }
    
    //错误处理
    function handleError (&$controller, &$request, &$user)
    {
        return VIEW_INPUT;
    }
}
?>  

在显示和模板完成后,在需要设置访问权限的Action内写unction isSecure()和function getPrivirage()即可。

<?php
class SampleAction extends Action
{
    /*
    * GET:成功画面
    */
    function getDefaultView (&$controller, &$request, &$user)
    {
    return VIEW_SUCCESS;
    }
    
    function getRequestMethods ()
    {
        return REQ_NONE;
    }
    
    function isSecure ()
    {
        return true;
    }
    
    function getPrivilege (&$controller, &$request, &$user)
    {
        return array('ADMIN');
    }
}
?>  

============================================================================

整篇资料就这些了,希望对大家有帮助。
 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1232136


类别:Php | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu