zoukankan      html  css  js  c++  java
  • 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() 优化表
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/meetrice/p/5038267.html
Copyright © 2011-2022 走看看