Skip to content

components data

tolizhan edited this page Jul 6, 2023 · 7 revisions

数据封装

of_base_com_data::json($data, $mode = 1) 安全的json

  • datastring, array
    编码或解码的数据
  • modeint
    位运算操作选项
    0=解码
        2=解码前去掉反斜杠
    1=编码
        2=编码后添加反斜杠
<?php
/**
 * 返回编码解码后的数据
 */
$data = '<script>"嗨"';
json_encode($data);                                 //"<script>\"\u55e8\""

$result = of_base_com_data::json($data, 1);         //""\u003Cscript\u003E&quot;嗨&quot;" of_base_com_data::json($result, 0);                 //<script>"嗨"

//添加反斜线 $result = of_base_com_data::json($data, 1 | 2);     //&quot;\u003Cscript\u003E\&quot;嗨\&quot;&quot; of_base_com_data::json($result, 0 | 2);             //<script>"嗨"

of_base_com_data::digest($data) 计算数据的唯一摘要值

  • data
    指定计算的数据
<?php
//键的顺序不同结果相同
of_base_com_data::digest(array('a' => 1, 'b' => 2));    //ef8ba71070086c47bd785b4271d1fb54
of_base_com_data::digest(array('b' => 2, 'a' => 1));    //ef8ba71070086c47bd785b4271d1fb54

of_base_com_data::lock($name, $lock = 2, $argv = array()) 为并发流程创建独占通道, 工作中的锁会随工作结束而解锁

  • namestring
    锁通道标识
  • lockint
    文件加锁方式 1=共享锁, 2=独享锁, 3=解除锁, 4=非堵塞(LOCK_NB)
  • argvarray
    操作参数 {"space" : 命名空间, 默认"", 空间之间同名锁冲突}
<?php
/**
  成功返回true, 失败返回false
  使用"2 | 4"方式尝试加独享锁
  配置_of.com.data.lock调整分布式锁属性
 /
of_base_com_data::lock('group::demo', 2);   //打开demo标识独享锁
of_base_com_data::lock('group::demo', 3);   //关闭demo标识独享锁
<!--
<?php
/**
* 通过配置_of.com.data.lock切换磁盘锁模式
* 默认files文件模式, 配置mysql模式的例子如下
* 在支持"READ UNCOMMITTED"的数据库中创建表结构
* 框架会克隆dbPool连接, 自动修改隔离级别
*/
CREATE TABLE _of_com_data_lock_mysql (
nMd5 char(32) NOT NULL COMMENT '加锁名的md5',
uuid char(28) NOT NULL COMMENT '唯一排序, UUID方法生成, 锁操作使用',
type tinyint(1) NOT NULL COMMENT '加锁类型, 1=读锁, 2=写锁',
mark char(32) NOT NULL COMMENT '加锁代码生成的唯一标识, 代码定位',
info char(255) NOT NULL COMMENT '加锁名的前255备注信息',
PRIMARY KEY (nMd5,uuid) USING BTREE,
KEY idx_markSearch (mark,nMd5) USING BTREE,
KEY idx_typeSearch (nMd5,type,uuid) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='协同加锁表';
    //框架配置文件
    _of.com.data.lock => array(
        //适配文件 of_accy_com_data_lock_xxx
        'adapter' => 'mysql',
        //对应的配置
        'params'  => array(
            //多个_of.db连接池可分布, 类mysql数据库需支持"READ UNCOMMITTED"隔离级别
            'dbPool' => array('default'),
            //是否使用变量方式, true=是(性能更高), false=否(类mysql不兼容时设置)
            "useVar" => true
        )
    )
    
    //监控锁信息, 首先要修改RU隔离级别, 然后通过SQL查询
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    SELECT * FROM `_of_com_data_lock_mysql`;</pre> -->
</div>
<h2 id="rule" class="bottomBorder arguement">
    of_base_com_data::rule(&amp;$data, $rule)
    <span class="fontSize">数据格式校验</span>
</h2>
<ul class="block">
    <li>
        <div class="arguement bottomBorder">data<span>array</span></div>
        待填充校验的数据
    </li>
    <li>
        <div class="arguement bottomBorder">rule<span>array</span></div>
        校验规则
        <pre class="block">

{     节点键, "."与""为关键词, "`"为转义字符的分割键名 : 参数结构如下, 字符串代表数组的type {         "type"    : 值的类型              数组=验证子节点键{                 子节点键 : 同"值的类型",                 ...             },             "@"开头字符串=正则验证,             字符串=内置类型                 "int"   : 整形, argv参数 {                     "idem" : 类型一致, 默认false,                     "min"  : 最小值,                     "max"  : 最大值,                 }                 "float" : 包括整型的浮点型, argv参数 {                     "idem" : 类型一致, 默认false,                     "min"  : 最小值,                     "max"  : 最大值,                 }                 "text"  : 包含数字类型文本, argv参数 {                     "min" : 最小长度,                     "max" : 最大长度                 }                 "bool"  : 布尔类型, argv参数 {                     "format" : 转换布尔,                          默认=枚举方式["ok", "true", "success", "on", "yes", "done", 1] 转true,                          false=强制验证布尔类型,                         true=弱类型为true的均转true                 }                 "date"  : 时间类型, argv参数 {                     "format" : 格式化样式, 默认="Y-m-d H:i:s", false=不格式,                     "min"    : 最小时间,                     "max"    : 最大时间,                 }                 "enum"  : 枚举类型, argv参数 {                     "list" : 枚举列表, [有效字符串, ...]                     "min"  : 最少选项,                     "max"  : 最多选项,                     "mode" : 校验类型, null(默认)=不校验, true=数组格式, false=标量格式                 }                 "mail"   : 验证邮箱, argv无参数                 "call"   : 回调验证, null=验证成功, 其它=提示错误, argv参数符合回调结构, 接收参数 {                     "check" :&引用的验证数据                 }         "default" : 默认值, null=必存在, 其它=默认值         "keys"    : 按顺序验证键名中各""的类型, 如"a..b..c."分别对应0~2的配置 [             null为不验证,             type字符串验证类型(正则或内置),             {"type" => 同"值的类型", "min" => 数组最小个数, "max" => 数组最大个数},             ...         ],         "argv"    : 对应"值的类型"提供的参数 {                      }     } }

<?php
$data = array(
    'user'    => 'userName',
    'captcha' => 'asdf',
    'data'    => array(
        'mail' => '[email protected]',
        'age'  => '12'
    ),
    'detail'  => array(
        'bbb' => array(
            'b44' => '221'
        ),
        'ddd' => array(
            'a22' => '331'
        ),
    )
);
$error = of_base_com_data::rule($data, array(
    //文本类型切必须存在
    'user'      => 'text',
    //文本类型自动填充
    'nick'      => array('type' => 'text', 'default' => '昵称'),
    //文本类型限制长度
    'captcha'   => array('type' => 'text', 'argv' => array('min' => 3, 'max' => 3)),
    //验证子类型
    'data.mail' => 'mail',
    //分组验证子类型
    'data'      => array(
        'type' => array(
            //强制验证数据类型
            'age' => array('type' => 'int', 'argv' => array('idem' => true)),
            //填充默认数据
            'sex' => array('type' => 'text', 'default' => '男'),
        )
    ),
    'detail..' => array(
        'keys' => array(
            //验证第一个""的键名全为"b"或"c"
            array('type' => '@^[bc]+$@'),
            //验证第二个"*"的键名以"a"+数字结构
            array('type' => '@^a\d+$@'),
        )
    )
));

echo '错误: '; print_r($error); /* 错误: Array ( [captcha] => Val illegal, should be text, length >= 3 and <= 3 : asdf [data.age] => Val illegal, should be int, strict type : 12 ) / echo '结果: '; print_r($data); / 结果: Array ( [user] => userName [captcha] => asdf [data] => Array ( [mail] => [email protected] [age] => 12 [sex] => 男 )

[nick] =&gt; 昵称

) */

Clone this wiki locally