第七章:生成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');
}
}
?>
============================================================================
整篇资料就这些了,希望对大家有帮助。