去评论
dz插件网

Discuz 模板数据查询详解

admin
2020/07/07 09:02:51
在创作模板的过程中,往往需要用到大量的数据库内容,来充实自己的模板。已达到独特的模板设计。
    查询数据库从而调取数据, 有两种方式可以实现。
DB::
C::t
而在实际使用的时候,我们一般通常使用DB:: 的方式来查询数据库。

一。数据库结构 Discuz数据库参考:http://www.688576.com/file.php?mod=tools_discuz_db

1.表名
Discuz的数据库在安装时不修改表前缀的情况下,均以 pre_xxxx_xxx 的格式来创建。其中:
pre:可在安装时自定义表前缀(用于区分同一数据库帐号多个Discuz数据库)
xxxx:Discuz数据库的划分,其中包括:common、forum、home、mobile、portal、ucenter
xxx:Discuz数据库具体功能表,比如我们经常用到的pre_forum_thread,其中 thread 就表明了这个表是论坛中主题的数据表。

2.字段
字段分为字段名、类型和默认值,字段类型不同代表它们存储的东西不同
int存的是数字,txt存的是文本。很多数字类型的字段都有默认值,
比如帖子内容数据表pre_forum_post里的帖子是否通过审核的字段invisible默认值是0,如果不是0,就说明帖子正在审核。


二。数据库查询

1.创建数据查询
通常为了后期的维护以及便于他人学习,并且在官方的建议下。我们采用的是外链的方式来引入查询数据。
第一步:在所创作的模板中创建新文件夹“config”
第二步:创建以 .php 为格式的文件
第三步:套入基础框架
  1. <?phpif(!defined('IN_DISCUZ')) {        exit('Access Denied');}//查询语句?>
第四步:模板中引入文件(为了有效的多次利用,通常将引入代码放至 hreader_common.htm 中)
  1. <!--{eval include TPLDIR.'/***/***.php';}-->
2.查询语句说明
    (1)单数据表单数据查询
             查询一个数据表,只返回一条数据。以下给出一个简单的例子来做分析
$thread_title=DB::result_first("select subject from ".DB::table("forum_thread")." where `tid`=123");
实例查询的输出值为:查询Tid为123的主题标题
语句中 所表达含义 固定存在备注
$thread_title 查询出来的输出变量值 非固定(可自定义)命名避免变量名冲突。用于模板中使用
DB:: 查询数据库 固定(不可修改/缺省)
result_first 输出值为单一值 固定(不可修改/缺省) 返回结果集中一个字段的值
select 需要查询的字段为 固定(不可修改/缺省)
subject要查询的字段名 非固定(可自定义)
from ".DB::table("forum_thread")." 查询的字段名所属数据表 非固定(可自定义) 这里省略pre_
where 条件限制固定(不可修改/缺省)
`tid`=123 TID为123的主题非固定(可自定义)可取 forum_thread 中任意字段做条件

    (2)单数据表多数据查询
             查询一个数据表,返回多条数据(数组)。以下给出一个简单的例子来做分析
$thread_list=DB::fetch_all("select subject,tid from ".DB::table("forum_thread")." where `fid`=38");
实例查询的输出值为:查询Fid为38的所有主题标题及Tid
语句中 所表达含义 固定存在备注
$thread_list 查询出来的输出变量值 非固定(可自定义)命名避免变量名冲突。用于模板中使用
DB:: 查询数据库 固定(不可修改/缺省)
fetch_all 输出值为多个值 固定(不可修改/缺省) 返回结果集中多个字段的值
select 需要查询的字段为 固定(不可修改/缺省)
subject,tid要查询的字段名 非固定(可自定义)用半角逗号间隔。不建议使用 *
from ".DB::table("forum_thread")."查询的字段名所属数据表非固定(可自定义)这里省略pre_
where条件限制固定(不可修改/缺省)
`fid`=38Fid为38的板块非固定(可自定义)可取 forum_thread 中任意字段做条件


    (3)多数据表多数据查询
             MySql属于关系型数据库,也就是说,表与表之间有相关性,这样,当一个表无法满足我们需要的数据时可以关联查询与之相关的多个表,所谓相关,即为有业务或功能相关,比如帖子的标题和内容分属不同的数据表,但之间有帖子固定编号tid作为共同字段,这就是关联条件。不相关的当然无法关联,比如帖子表和友情链接表,默认情况下它们之间没有逻辑上的相关性,当然也就无法关联。
             查询多个数据表,返回多条数据(数组)。以下给出一个简单的例子来做分析
  1. $thread_list=DB::fetch_all("select a.subject,b.message from ".DB::table("forum_thread")." a left join ".DB::table("forum_post")." b on b.tid=a.tid where b.invisible=0 order BY a.`dateline` desc limit 0,5");
实例查询的输出值为:按降序排列出最新发表的五篇主题标题及主题内容
语句中所表达含义固定存在备注
$thread_list查询出来的输出变量值非固定(可自定义)命名避免变量名冲突。用于模板中使用
DB::查询数据库固定(不可修改/缺省)
fetch_all输出值为多个值固定(不可修改/缺省)返回结果集中多个字段的值
select需要查询的字段为固定(不可修改/缺省)
a.subject,b.message要查询的字段名非固定(可自定义) 请详细阅读 *备注1。用半角逗号间隔
".DB::table("forum_thread")." a查询的字段名所属数据表非固定(可自定义)将表 forum_thread 表示为 a
left join后续数据表与前面有关联固定(不可修改/缺省)
".DB::table("forum_post")." b查询的字段名所属数据表非固定(可自定义)将表 forum_post 表示为 b
on b.tid=a.tid两个表中所关联的条件非固定(可自定义)请详细阅读 *备注2。
where条件限制固定(不可修改/缺省)
b.invisible=0 是否通过审核非固定(可自定义)可取 forum_post 中任意字段做条件
order BY a.`dateline` 排序方式非固定(可自定义)按表 forum_thread 中的最后发布排序
desc 顺序方式非固定(可自定义)asc:按升序排列,desc:按降序排列
limit 0,5 选择查询的条数非固定(可自定义) 0,5 表示从第一条到第五条。

*备注1:因为这里是多数据表多数据查询,为了便于区分,我们在后面查询表的时候,将表:forum_thread 表示为a,将表:forum_post 表示为b,所以这里的 a.subject,b.message,表示 forum_thread 表里的 subject 及 forum_post 表里的 message。当需要查询的字段名过多时,可酌情考虑使用 a.*,b.*。

*备注2:表示 b 表与 a 表的关联条件是 b 表里的 tid 等于 a 表里的 tid。即:forum_thread 里的字段 Tid 等于 forum_post 里的字段 Tid。


三。查询结果使用

    (1)单数据表单数据(返回唯一结果,直接使用变量)
              模板中使用:$thread_title
    (2)单数据表多数据、多数据表多数据(返回结果是数组,需要loop)
  1. <!--{loop $thread_list $value}-->    标题:$value['subject']    TID:$value['tid']    内容:$value['message']<!--{/loop}-->
语句中 备注
$thread_list 这里的变量必须为查询语句中查询出来的输出变量值
$value 仅限于在该loop中存在并使用,可自定义。不会与此loop之外的变量冲突

*备注1:这里便涉及到了Discuz的全局变量及局部变量。上例中的:$value 为局部变量,也就是说它仅在 <!--{loop $thread_list $value}--> 中才可以输出出来具体的值。否则会产生错误。而全局变量通常以$_G[***]为格式,并且不受局限性,在模板任何地方都可使用。

*备注2:如遇到调用的字段同时存在于2个表的话,可以通过重命名来解决。例如:
                forum_thread 和 forum_threadimage 里的 attachment 字段。查询时分a/b能区分,但 loop 时都是$value['attachment'],那么需要给其中一个字段改一个代称,这样 loop 里调用 b 表的 attachment 字段时,直接使用 $value['pics'] 即可。
  1. SELECT a.attachment,b.attachment as pics

四。注意事项

* 在选择条件限制时,如有多个条件限制 使用 and 做间隔
* 在使用自定义变量时,如果变量需要写在 [  ] 内,则必须给变量添加 {  }。如:[{$test[views]}],实际输出为:[123]
* 赋值使用:=,比较使用:==
* 判断“”使用:&&
* 判断使用:!
* <!--{if}--> 为非自闭和标签,结尾后添加<!--{/if}-->闭合
* 注意先后,作为前提的语句要写在上部,这是逻辑问题
* 如果是输出了Array,说明这是个数组
* 查询时要先分析好具体的条件限制