• Discuz!X/数据库操作方法


    原DB类的改进

    Discuz! X2.5新版对数据库DB层进行了功能和安全方面的加强:

    • addslashes的处理

    仅insert(),update(),delete() 方法对传入其的数组形式的参数进行 intval 或 addslashes 安全处理,字符串形式的参数将不处理,请注意

    • 新添加的方法 fetch_all($sql),order(), limit(),field() 等方法

    其中 fetch_all 方法以数组方式返回查询多条记录数据,且可以设置数据的 KEY 值使用某字段值; order(),limit(),field() 返回 SQL 语句中相应的部分

    • SQL 语句 format 的支持
    //例:查询10个用户uid大于100的用户数据,以uid为返回结果数组的key
    $arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('common_member', '100', '10'), 'uid');
    

    支持的fomat有:

     %t DB::table()
     %d intval()
     %s addslashes()
     %n in IN (1,2,3)
     %f sprintf('%f', $var)
     %i 直接使用不进行处理
    • 返回值的处理

    在非UNBUFFERED的情况下:INSERT SQL 语句返回 insert_id();UPDATE 和 DELETE SQL 语句返回 affected_rows()

    新增数据层:数据层的规范和约定

    • 一个数据表一个class文件,以table_加上不带前缀的表名命名,尽量不操作其它表;
    • 不能使用$_G、$POST、$GET等全局变量;
    • 关联查询(JOIN)尽量拆分为单条查询,不能拆分的放入主表的类中;
    • 方法名以下划线分隔,全部为小写,全部为单数,直接返回结果,保留关键字:on、get、set, 方法参数不能以数组的形式传入,数据可以;
    • 除数据表文件以外,其它文件禁止出现SQL语句;
    • 查询结果返回一行记录方法名使用fetch开头,返回多行记录方法名使用fetch_all开头,查询中使用SQL语句count函数返回一个数值的使用count开头;
    • 方法名中by后面的是以下划线(_)分隔的表字段名,不要使用复数型,例如: fetch_all_by_uid()而不是fetch_all_by_uids();
    • 方法名需去掉表名,如:common_member表类方法 fetch_member_by_username应命名为fetch_by_username;
    • 数据表类继承discuz_table基类,基类实现CURD操作,fetch方法实现了根据一个主键 值得到一行记录、fetch_all方法实现了根据一组主键值得到多行记录(二维数据,主 键值为 key)、count方法返回了表的总记录数据;
    • 如果表是无主键或是关联主键,则基类中的CURD将不能使用,需自己在相应的表类中实现, 同时将$this->_pk设置为空;
    • DB层封装的函数实现了addslashes,个别直接写sql语句的需主意addslashes;
    • 使用C::t('tablename')->method();调用;
    • C::t插件调用方式
      表名:mytablename 
      目录:source/plugin/mypluginid/table/table_mytablename.php 
      类名:table_mytablename 
      用法:C::t('#mypluginid#mytablename')->method();
      

    更多相关: 

    ==============================================================================================================================
     
     
     
    此页由蓝色于 2013-03-11 11:37:03 在1033289127的基础上最后更改。
    函数功能
    DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄
    DB::delete($tablename, 条件,条数限制) 删除表中的数据
    DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent) 插入数据操作
    DB::update($tablename, 数据(数组)条件) 更新操作
    DB::fetch(查询后的资源) 从结果集中取关联数组,注意如果结果中的两个或以上的列具有相同字段名,最后一列将优先。
    DB::fetch_first($sql) 取查询的第一条数据fetch
    DB::fetch_all($sql) 查询并fetch
    DB::result_first($sql) 查询结果集的第一个字段值
    DB::query($sql) 普通查询
    DB::num_rows(查询后的资源) 获得记录集总条数
    DB::_execute(命令,参数) 执行mysql类的命令
    DB::limit(n,n) 返回限制字串
    DB::field(字段名, $pid) 返回条件,如果为数组则返回 in 条件
    DB::order(别名, 方法) 排序

    注意:由于 X1.5 里增加了SQL的安全性检测。因此,如果你的SQL语句里包含以下开头的函数 load_file,hex,substring,if,ord,char。 或者包含以下操作 intooutfile,intodumpfile,unionselect,(select')都将被拒绝执行。

    替换参数功能
    %t 表名,
    %s 字串,如果是数组就序列化
    %f 按 %F 的样式格式化字串
    %d 整数
    %i 不做处理
    %n 若为空即为0,若为数组,就用',' 分割,否则加引号
    函数功能
    C::t($tablename')->count() 获取表所有行数
    C::t($tablename')->update(键值,$data) 更新键值数据
    C::t($tablename')->delete(键值) 删除键值数据
    C::t($tablename')->truncate() 清空表
    C::t($tablename')->insert($data, $return_insert_id,$replace) 插入数据
    C::t($tablename')->fetch_all($ids) fetch 数据,可以是单一键值或者多个键值数组
    C::t($tablename')->fetch_all_field() fetch所有的字段名表
    C::t($tablename')->range($start, $limit, $sort) fetch值域范围
    C::t($tablename')->optimize() 优化表
  • 相关阅读:
    python文件操作总结
    hidoCoder #1514 偶像的条件
    2017浙江省赛大学生程序设计竞赛 C题 What Kind of Friends Are You?
    51nod 1503 猪和回文串(动态规划)
    整数划分(若干不同),时间复杂度O(n*sqrt(n))
    Jiu Yuan Wants to Eat
    牛牛数括号
    P3254 圆桌问题
    方格取数(1)
    Taeyeon的困惑
  • 原文地址:https://www.cnblogs.com/meetrice/p/5038267.html
Copyright © 2020-2023  润新知