DX 模板 数据库SQL循环嵌套调用

2020年01月05日 01:49:29 发表评论 阅读
<!--{eval $slides = DB::fetch_all("SELECT id,title,street_id,add_time,type_id,xm,tel,cate_id,model_id FROM `pre_tom_tongcheng` where model_id=4 order by add_time desc limit 0,10");}-->
<!--{loop $slides $slide}-->
<!--{eval  $city = DB::result(DB::query("SELECT name FROM `pre_tom_tongcheng_district` WHERE id = '$slide[street_id]'"));}-->
<!--{eval  $type_id = DB::result(DB::query("SELECT name FROM `pre_tom_tongcheng_model_type` WHERE id = '$slide[type_id]'"));}-->
<li class="gc6"><a href="/plugin.php?id=tom_tongcheng&site=1&mod=list&model_id=$slide[model_id]&street_id=$slide[street_id]"  target="_blank" class="w60 c_link"> $city</a>   <a href="/plugin.php?id=tom_tongcheng&site=1&mod=view&xxid=$slide[id]"  target="_blank" class="gc3 ml5 mr5 w300">$slide[title]</a><a href="/plugin.php?id=tom_tongcheng&site=1&mod=list&model_id=$slide[model_id]&type_id=$slide[type_id]"  target="_blank" class="w60 c_link">$type_id</a><span class="w50 gc9 y"><!--{echo date('m-d', $slide[add_time]);}--></span></li>
<!--{/loop}-->	

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(别名, 方法)排序

注意事项:所有数据在插入数据库之前,均需要进行addslashes()处理,以免特殊字符未经转义在插入数据库的时候出现错误。Discuz!中所有通过 GET, POST, FILE,取得的变量默认情况下已经使用了addslashes()进行了转义,不必重复进行。如果数据处理必要(例如用于直接显示),可以使用 stripslashes() 恢复,但数据在插入数据库之前必须再次进行转义。缓存文件中,一般对缓存数据的值采用 addcslashes($string, '\'\\')进行转义。

最常见的查询数据库举例:
获取单条数据:
$rs = DB::fetch_first("SELECT * FROM ".DB::table('common_member')." WHERE uid=1");
这里获取的是UID为1的用户的数据,但是discuz内还有一个getuserbyuid可以获取用户数据
获取多条数据:
$rs = DB::fetch_all("SELECT * FROM " .DB::table('common_member')." WHERE uid in(1,2,3,4,5,6)");
这里获取的是UID为1 2 3 4 5 6的用户的信息

插入数据讲解
调用方式:DB::insert()
说明:关于是否是否。只要值为1就是 是,否就直接无视或者留空
举例:
首先是存在一个表名为pre_test
表内有以下字段:id(递增) name uid 字段类型就别管了
if(DB::insert('test',array('id'=>NULL,'name'=>'me','uid'=>1))) showmessage("数据插入成功");
说明:这边的数组的键名就是数据表中的字段名,键值就是插入的对应字段的值

DB::fetch_all('SELECT * FROM %t WHERE panel=%d', array($this->_table, $panel), 'uid');
DB::fetch_all('SELECT * FROM %t WHERE uid=%d ORDER BY dateline DESC', array($this->_table, $uid), 'bid') : array();

注:DZ中%号会当做参数,需要你传入,首先第一个你可以使用DB::table($this->_table)代替,第二个你可以用实实在在的表明,第三个的话你可以吧数值计算出来后填进去,这样的话应该就不会出现问题了。

转载于:http://blog.sina.com.cn/s/blog_0ee72b370102v5i1.html


更多参考:http://wiki.blueidea.com/index.php?title=Discuz!X/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95

函数功能
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对象,可以有效的利用缓存,并且数据获得都统一在 class/table 目录下,好处是所有的查询都集中和复用。方便维护和升级。默认的T方法有以下默认的获得数据方式。每个数据表还需要看具体的表数据定义函数。#开头的,是插件表定义,会去插件目录下的table目录下找,所以插件开发也可以用这种方法。

函数功能
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()优化表


举例:discuz中调用数据库的某个字段

//代码解析:
<!--{eval $slides = DB::fetch_all("SELECT * FROM `pre_common_block_item` WHERE `bid`=15 ORDER BY `displayorder` ASC,`id` DESC LIMIT 0, 10");}-->
<!--{loop $slides $slide}-->
<a href="$slide

" target="_black"><img src="data/attachment/$slide[thumbpath]" width="300" height="450" alt="$slide[title]"/></a>
<!--{/loop}-->


<!--{eval $slides = DB::fetch_all("    //执行SQL语句
SELECT *                                         //读取全部字段
FROM `pre_common_block_item`  //数据表 可以自定义 这个是DIY帖子内容表
WHERE `bid`=15                            //查询条件 BID 是DIY的模块id
ORDER BY `displayorder` ASC,`id` DESC //排序条件
LIMIT 0, 10                                      //获取前10条信息
");}-->
< !--{loop $slides $slide}-->    //循环 $slides 数组 使用  $slide[字段名]  获取内容
<a href="$slide

" target="_black"><img src="data/attachment/$slide[thumbpath]" width="300" height="450" alt="$slide[title]"/></a>
< !--{/loop}-->


  • 我的微信:seausun
  • 这是我的微信扫一扫
  • weinxin
  • 你领一次红包多一份动力
  • 支付宝搜索156-5053-9852领取
  • weinxin