loopdb标签
loopdb的作用是将数据库取出的数据块进行循环展示
举例
```brush:html
ID | 标题 | 添加时间 |
[@ContentID] | [@1] | [@2] |
```
上例中从文章数据表(Content)中取出数据块(包含字段:ContentID、Title、AddTime),并进行循环展示。上例如果写成asp代码的话,如下
```brush:html
<%
dim rs,i
set rs = B_("Content").field("ContentID,Title,AddTime").where("ContentID > 20").select
i = 0
%>
ID | 标题 | 添加时间 |
<% do while not rs.eof and i
<%=rs("ContentID")%> | <%=rs(1)%> | <%=rs(2)%> |
<%
i = i +1
rs.moveNext
loop
%>
```
从上例中,我们发现了POPASP惊人的壮举,它将asp原生代码由14行压缩到了6行,在输出字段值时由方括号包含字段名或序号就能轻松输出,代码更优,逻辑关系更明了,极大地方便了网站开发,提高了开发效率。
### loopdb格式
```brush:html
循环体
```
### 数据表名
数据表名可以不带表名前缀,表名前缀的配置为`DB_PREFIX`。比如在配置文件中已经定义如下:
```brush:vb
POP_MVC.config("DB_PREFIX") = "popasp_"
```
文章数据表名为“popasp_content”,则此时在loopdb的表名则可以简写为content。
### 分隔符
loopdb="..." , where="..." 等这里的双引号并不是指定的,你也可以使用|、',如果值里面有了",那就得考虑用别的不冲突的分隔符了。
### 标识符
如果我们从控制器中进行了数据分配
```brush:vb
that.d("articleRS") = B_("Content").field("ContentID,Title,AddTime").where("ContentID > 20").select
```
我们也可以使用loopdb方便地循环出来,我们只要将第一行改成如下即可
```brush:html
```
如果我们不仅在控制器中进行了数据分配,而且在模板中也进行了取值,比如
```brush:html
```
那么系统会使用从控制器中取得的值,而忽略在模板中取到的值,这样设计的目的是为了维护控制器分配控制数据与页面转向的权威性。如果在控制器或前面代码中未分配articleRS,则会采用当前条件进行获取数据。
如果不指定取数据的方法,则默认使用“select”
```brush:html
```
与
```brush:html
```
等同。
### 可以用于loopdb取数据的方法
这里的select方法,依赖于模型中的获取数据方法。除了select方法外,我们还可以使用如下方法:
|方法名 |结果类型 |备注|
|----|----|----|
|select |Recordset |配合POPASP_POSITIONPAGE完成分页|
|getAll |二维Dictionary |作用同select|
|getRand |二维Dictionary |取随机记录,getRand(sort)|
|Search |Recordset|搜索,getRand(q,fields)|
注意:取数据块的方法getArr不能用于loopdb。
getRand与search含有参数,指定参数使用`arg_n=value`来指定,`n=1,2,3...`
### getRand举例
```brush:html
ID | 标题 | 添加时间 |
[@0] | [@title] | [@2] |
```
getRand取出的数据是Dictionry对象,在循环体内,由于程序的巧妙设计,也可以像Recordset那样通过序号取值,并且采用键名取值时,也可以不区分大小写。
### search举例
```brush:html
ID | 标题 | 添加时间 |
[@0] | [@title] | [@2] |
```
### $__index输出序号
有时候我们需要在循环体内输出序号,那么这时候就要用到`$__index`,它是从0开始编号的。
举例:
```brush:html
```
### $[label]__index输出序号
如果给循环体一个标识符,那么则可以使用`$标识符__index`来输出序号,尤其是在循环嵌套中,这种做法则不会使序号混乱。
举例:
```brush:html
```
### loopdb的嵌套
loopdb不仅可以跟loopdb嵌套,也可以跟if等其他块标签相互嵌套。
举例:
```brush:html
```