公司SVN仓库
- 大部svn仓库
- 产品svn仓库
- 产品内代码用svn仓库
- branches
- 分支
- 现在的开发模式中,不推荐多分支开发,此处不做为重点
- tags
- 用于版本控制、测试、发布等用途
- trunk
- 主干
- libs
- 共用库函数
- 可以存在外部项目引入
- services
- www
- 静态文件存放
- images
- 页面配图
- public
- 404.html
- 500.html
- favicon.ico
- robots.txt
- css
- css文件
- daemon
- 存放后台守护进程相关代码
- config
- 存放本项目的配置文件
- template
- 存放本项目的模板文件
- 一般都是用smarty模板引擎
- test
- 存放测试和单元测试代码
- program
- 存放项目中属于web前端上的代码
- 分层结构
- application
- 应用程序层
- business
- 业务逻辑层
- component
- 组件层
- datadriver
- 数据驱动层
- systemdriver
- 系统驱动层
- 存放项目中属于web前端上的代码
- branches
- 产品内代码用svn仓库
- 产品svn仓库
来自QQ群:
svn也是有目录结构的... 分支下建分支.
比如 svn/tags/tag1
你想建立 svn/tags/tag1/tag2
那就直接建立这么个文件夹就好了..
但是tag1这个再检出就已经不是你的项目了... (多了tag2)
如果你是想在tag1的基础上, 建立新的tag.
那么建立tag的时候, 从tag1建就好了...
http://toys.lerdorf.com/archives/57-ZeroMQ-+-libevent-in-PHP.html
写了一个简单的队列任务处理。多进程任务,异步任务可能会用到这个(主要是命令行应用)
比如,任务的某个一个环节速度十分不稳定,可能执行几秒,也可能执行几分钟,
我就可以把那个环节包括前面的部分扔进队列,多跑几个进程,同时往队列里面写。
然后后面比较快的环节只跑一个处理任务就OK了。让整体速度达到更好的效果。阅读全文
写了一个简单的队列任务处理。多进程任务,异步任务可能会用到这个(主要是命令行应用)
比如,任务的某个一个环节速度十分不稳定,可能执行几秒,也可能执行几分钟,
我就可以把那个环节包括前面的部分扔进队列,多跑几个进程,同时往队列里面写。
然后后面比较快的环节只跑一个处理任务就OK了。让整体速度达到更好的效果。阅读全文
FRAME ICMP IP UDP TCP
traceroute 数据传输路径
ping 一般用ICMP协议,定制可以使用IP ICMP
ping 192.168.0.1 -n -c l -s 65527
tranceroute -n -I 10.210.121.128
tcpdump -n -s o -l eth0 icmp
ifconfig eth0|grep inet
ping -b -n -c l 192.168.0.1
[root@vm0000055 templates]# ping -c 1 -s 65535 192.168.0.1
Error: packet size 65535 is too large. Maximum is 65507
常见 IP 碎片攻击详解阅读全文
traceroute 数据传输路径
ping 一般用ICMP协议,定制可以使用IP ICMP
ping 192.168.0.1 -n -c l -s 65527
tranceroute -n -I 10.210.121.128
tcpdump -n -s o -l eth0 icmp
ifconfig eth0|grep inet
ping -b -n -c l 192.168.0.1
[root@vm0000055 templates]# ping -c 1 -s 65535 192.168.0.1
Error: packet size 65535 is too large. Maximum is 65507
常见 IP 碎片攻击详解阅读全文
IE中,快捷键是CTLR+F5.
Firefox中,快捷键是CTLR+SHIFT+R.
Firefox中,快捷键是CTLR+SHIFT+R.
其实本质是:
Mysql查询从以往常规的的Limit:
$offset*($page-1),$offset
0,20
20,20
40,20
........
变为了:
永远的:
0,20 ,但前面有一个:where id>动态的数值,这个id是有索引的,所以,查询起来更快一些。
这里的Id是经过计算后的一个数值,主要是它用到了索引,所以在大数据量下快了不是一星半点。
=========================================================
阅读全文
Mysql查询从以往常规的的Limit:
$offset*($page-1),$offset
0,20
20,20
40,20
........
变为了:
永远的:
0,20 ,但前面有一个:where id>动态的数值,这个id是有索引的,所以,查询起来更快一些。
这里的Id是经过计算后的一个数值,主要是它用到了索引,所以在大数据量下快了不是一星半点。
=========================================================
阅读全文
FCKeditor 2.6.4 released 之前版本,全部存在严重漏洞,请立即检查您的服务器、程序中是否调用了FCKeditor编辑器,如果存在,请升级到 2.6.4 released版本。
如果不需要上传功能,请将上传功能相关文件删除,如果需要上传功能,请严格限制上传文件后缀,并配置目录权限,禁止上传目录的PHP、ASP、JSP执行权限。
我们发现在一些产品中集成了带有严重漏洞的 FCKeditor 富文本编辑器。请管理员和程序员自查自己的系统、程序。
下月开始,系统部将对服务器上的 FCKeditor 进行专项扫描,届时如果发现仍然存在漏洞的FCKeditor,将对相关责任人进行相应处理。
FCKeditor是一款流行的富文本编辑器,还支持强大的文件上传功能,可以工作在asp,aspx,php,perl,python等脚本环境,由于用户多
功能强大,所以也成为了黑客重点攻击对象。
一些程序员喜欢将某个版本的FCKeditor打包,每次程序都调用这个版本,一些程序也会直接集成该编辑器,往往这种习惯都
导致将一个旧版本的编辑器嵌入到了程序中.
漏洞示例(asp下):
http://www.xxx.com/admin/FCKeditor/editor/filemanager/browser/default/browser.html?Type=../&Connector=connectors/asp/connector.asp
将type改为../,这样将跳出目录文件类型的限制,还可以进行目录遍历.
即使做了不让跳转,配合服务器的一些缺陷也可以得到webshell,比如Windows2003服务器使用fckeditor建立一个xx.asp的目录,那么向
这个目录下上传任意文件,比如jpg(包含可执行脚本代码),都可以被服务器执行.
webshell地址:
http://www.xxx.com/shell.cer
漏洞示例(jsp下):
查看配置和列出目录下的文件:
http://www.xxx.com/fckeditor/editor/filemanager/browser/default/connectors/jsp/connector?
Command=FileUpload&Type=Image&CurrentFolder=%2F
webshell地址:
http://www.xxx.com/fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector
漏洞示例(php下):
fckeditor采用黑名单方式进行过滤,Windows下上传xxx.php+空格即可绕过检测.
另外PHP版本对媒体类型没有做任何限制,可以上传任意文件.
以上漏洞均在最新版本(2.6.4)中解决,可以在http://www.fckeditor.net/download下载到最新版本.
另外一些fckeditor的设置,如果你不提供上传服务,或者有更好的上传方案,那删除掉目前的上传功能是非常必要而且彻底的!(删除FCKeditor\editor
\filemanager).
根目录下的fckconfig.js可以进行具体的设置,根据以下开关来限制上传的风险(多一种类型就多一种风险,没必要的请关闭)
FCKConfig.LinkBrowser = true;
FCKConfig.ImageBrowser = true ;
FCKConfig.FlashBrowser = true ;
FCKConfig.LinkUpload = true ;
FCKConfig.ImageUpload = true ;
FCKConfig.FlashUpload = true ;
对你存储上传文件的目录,比如UserFilesPath = "~/UserFiles",禁止下面的脚本文件执行.
新版本中提供这么个函数:
private bool CheckAuthentication()
{
// WARNING : DO NOT simply return "true". By doing so, you are allowing
// "anyone" to upload and list the files in your server. You must implement
// some kind of session validation here. Even something very simple as...
//
// return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );
//
// ... where Session[ "IsAuthorized" ] is set to "true" as soon as the
// user logs in your system.
return false;
}
去掉注释,写入
try{
return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true ;
}
catch{return false;}
在登录后台成功的地方写入session,Session["IsAuthorized"] = true;即可,这样就不会任何人都可以进行上传等操作了.
PS:FCKeditor检测路径关键字editor/filemanager, 另外fckconfig.js 是编辑器的配置文件,里面有允许&拒绝上传的文件类型配置等,这个文件基本不会
改名.
PS2:因为FCKeditor的广泛使用,黑客仍然会重点攻击该编辑器,所以不推荐使用该程序,建议使用内部开发的一些富文本编辑器
如果不需要上传功能,请将上传功能相关文件删除,如果需要上传功能,请严格限制上传文件后缀,并配置目录权限,禁止上传目录的PHP、ASP、JSP执行权限。
我们发现在一些产品中集成了带有严重漏洞的 FCKeditor 富文本编辑器。请管理员和程序员自查自己的系统、程序。
下月开始,系统部将对服务器上的 FCKeditor 进行专项扫描,届时如果发现仍然存在漏洞的FCKeditor,将对相关责任人进行相应处理。
FCKeditor是一款流行的富文本编辑器,还支持强大的文件上传功能,可以工作在asp,aspx,php,perl,python等脚本环境,由于用户多
功能强大,所以也成为了黑客重点攻击对象。
一些程序员喜欢将某个版本的FCKeditor打包,每次程序都调用这个版本,一些程序也会直接集成该编辑器,往往这种习惯都
导致将一个旧版本的编辑器嵌入到了程序中.
漏洞示例(asp下):
http://www.xxx.com/admin/FCKeditor/editor/filemanager/browser/default/browser.html?Type=../&Connector=connectors/asp/connector.asp
将type改为../,这样将跳出目录文件类型的限制,还可以进行目录遍历.
即使做了不让跳转,配合服务器的一些缺陷也可以得到webshell,比如Windows2003服务器使用fckeditor建立一个xx.asp的目录,那么向
这个目录下上传任意文件,比如jpg(包含可执行脚本代码),都可以被服务器执行.
webshell地址:
http://www.xxx.com/shell.cer
漏洞示例(jsp下):
查看配置和列出目录下的文件:
http://www.xxx.com/fckeditor/editor/filemanager/browser/default/connectors/jsp/connector?
Command=FileUpload&Type=Image&CurrentFolder=%2F
webshell地址:
http://www.xxx.com/fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector
漏洞示例(php下):
fckeditor采用黑名单方式进行过滤,Windows下上传xxx.php+空格即可绕过检测.
另外PHP版本对媒体类型没有做任何限制,可以上传任意文件.
以上漏洞均在最新版本(2.6.4)中解决,可以在http://www.fckeditor.net/download下载到最新版本.
另外一些fckeditor的设置,如果你不提供上传服务,或者有更好的上传方案,那删除掉目前的上传功能是非常必要而且彻底的!(删除FCKeditor\editor
\filemanager).
根目录下的fckconfig.js可以进行具体的设置,根据以下开关来限制上传的风险(多一种类型就多一种风险,没必要的请关闭)
FCKConfig.LinkBrowser = true;
FCKConfig.ImageBrowser = true ;
FCKConfig.FlashBrowser = true ;
FCKConfig.LinkUpload = true ;
FCKConfig.ImageUpload = true ;
FCKConfig.FlashUpload = true ;
对你存储上传文件的目录,比如UserFilesPath = "~/UserFiles",禁止下面的脚本文件执行.
新版本中提供这么个函数:
private bool CheckAuthentication()
{
// WARNING : DO NOT simply return "true". By doing so, you are allowing
// "anyone" to upload and list the files in your server. You must implement
// some kind of session validation here. Even something very simple as...
//
// return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );
//
// ... where Session[ "IsAuthorized" ] is set to "true" as soon as the
// user logs in your system.
return false;
}
去掉注释,写入
try{
return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true ;
}
catch{return false;}
在登录后台成功的地方写入session,Session["IsAuthorized"] = true;即可,这样就不会任何人都可以进行上传等操作了.
PS:FCKeditor检测路径关键字editor/filemanager, 另外fckconfig.js 是编辑器的配置文件,里面有允许&拒绝上传的文件类型配置等,这个文件基本不会
改名.
PS2:因为FCKeditor的广泛使用,黑客仍然会重点攻击该编辑器,所以不推荐使用该程序,建议使用内部开发的一些富文本编辑器
在FROM表单提交时,浏览器会自动对提交内容进行转码,会将除“- ”,“_”,数字和字母之外的所有字符进行%形式的URL编码,其中空格会被转换成“+”。
在PHP中函数urlencode对字符串URL编码的处理方式同浏览器相同,所以如果对一个字符串进行2次或2次以上的urlencode将会把空格转换成“+”
例:$str = "ce shi";
echo urlencode($str);// ce+shi
echo urlencode(urlencode($str));//ce%2bshi
echo urlencode(urlencode(urlencode($str)));//ce%2bshi
%2b在服务器接收到后会解码为“+”
若使用rawurlencode则会直接将空格转换为%20,不存在此问题
但是:
使用utf-8模式对空格先编码然后再解码后得到的不是空格字符,而是一个代码为160的char字符,如果不注意这一点将导致对空格判断的错误,我没有试验在其他encoding下的效果。
程序中使用空格分割字符串分隔符数组现在是这样:new char[3] { ' ', ' ',Convert.ToChar(160) }.
其中第一个是半角空格,第二个是全角空格,第三个就是Convert.ToChar(160)
在PHP中函数urlencode对字符串URL编码的处理方式同浏览器相同,所以如果对一个字符串进行2次或2次以上的urlencode将会把空格转换成“+”
例:$str = "ce shi";
echo urlencode($str);// ce+shi
echo urlencode(urlencode($str));//ce%2bshi
echo urlencode(urlencode(urlencode($str)));//ce%2bshi
%2b在服务器接收到后会解码为“+”
若使用rawurlencode则会直接将空格转换为%20,不存在此问题
但是:
使用utf-8模式对空格先编码然后再解码后得到的不是空格字符,而是一个代码为160的char字符,如果不注意这一点将导致对空格判断的错误,我没有试验在其他encoding下的效果。
程序中使用空格分割字符串分隔符数组现在是这样:new char[3] { ' ', ' ',Convert.ToChar(160) }.
其中第一个是半角空格,第二个是全角空格,第三个就是Convert.ToChar(160)
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.URLRequest;
Server:red5 flash media server2-3 flashcom
import flash.net.NetStream;
import flash.net.URLRequest;
Server:red5 flash media server2-3 flashcom
arsort.php
result:
这个结论是正确的结果,但是假如我们的文件编码是gbk编码,而我们的输出键值是utf-8的编码,如:'1183888' '879126'是utf-8的字符串时候,那就会出现通过arsort排序出现错误的情况,于是我们只好这样:
foreach($userscoreinfo as $key =>$values)
{
$userscoreinfo[$key] = (int)$values;
}
强制转为int类型即可!!!
<?php
$str = array(1548940117=>'1183888',1377417885=>'879126');
print_r($str);
arsort($str);
print_r($str);
?>
$str = array(1548940117=>'1183888',1377417885=>'879126');
print_r($str);
arsort($str);
print_r($str);
?>
result:
0> php arsort.php
Array
(
[1548940117] => 1183888
[1377417885] => 879126
)
Array
(
[1548940117] => 1183888
[1377417885] => 879126
)
Array
(
[1548940117] => 1183888
[1377417885] => 879126
)
Array
(
[1548940117] => 1183888
[1377417885] => 879126
)
这个结论是正确的结果,但是假如我们的文件编码是gbk编码,而我们的输出键值是utf-8的编码,如:'1183888' '879126'是utf-8的字符串时候,那就会出现通过arsort排序出现错误的情况,于是我们只好这样:
foreach($userscoreinfo as $key =>$values)
{
$userscoreinfo[$key] = (int)$values;
}
强制转为int类型即可!!!
删除 core 文件
# find ~ -name core -exec file {} \; -exec rm -i {} \;
查看使用文件的进程
# fuser -u /usr/my_application/foo
搜索字符串
#grep "hello world" `find ./ -name "*" -print -exec file {} \; |grep text | cut -d ':' -f 1`
目录
#alias dir='ls -Lla|grep ^d'
输出 IP 地址
#ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}'
按文件长度排序
#ls -l | grep ^- | sort -nr -k 5 | more
#ls -lR | grep ^- | sort -nr -k 5 | more
二进制文件中的可打印字符
# strings name of binary file
一个月的最后一个星期天执行任务:
18 * * * 0 [`date "+%d"` -gt 24] && /path/to/script
修改扩展名:
# for f in *.abc; do mv $f `basename $f .abc`.def ; done
查看硬盘情况:(Solaris)
# iostat -En
整个目录树拷贝:
# cd
# find . -depth -print | cpio -pudm
按长度排序目录下所有文件
# du -a | sort -n -r | more
检查文件内每行是否有相同列数
#awk '{print NF}' test.txt |sort -nu|more
去除空行
#sed -e '/^[ ]*$/d' InputFile >OutputFile
查看进程占用的对应文件 inode 号(Solaris)
#/usr/proc/bin/pfiles
删除指定用户的所有进程
# kill -9 `ps -fu username |awk '{ print $2 }'|grep -v PID`
Bash 操作快捷键:
ctrl-l -- clear screen
ctrl-r -- does a search in the previously given commands so that you don't
have to repeat long command.
ctrl-u -- clears the typing before the hotkey.
ctrl-a -- takes you to the begining of the command you are currently typing.
ctrl-e -- takes you to the end of the command you are currently typing in.
esc-b -- takes you back by one word while typing a command.
ctrl-c -- kills the current command or process.
ctrl-d -- kills the shell.
ctrl-h -- deletes one letter at a time from the command you are typing in.
ctrl-z -- puts the currently running process in background, the process
can be brought back to run state by using fg command.
esc-p -- like ctrl-r lets you search through the previously given commands.
esc-. -- gives the last command you typed.
文件名里的空格替换为下划线
# for i in $1 ; do mv "$i" `echo $i | sed 's/ /_/g'` ; done
查看远程主机时间
# telnet remotehostname 13|grep :
只显示 top 命令的states 行
#while true; do top -d 2 | col -b | grep states; sleep 10; done
加速显示 tar 文件内容
# tar tvfn
让 目录名也能 Spell Check
#shopt -s cdspell
当输错命令时,系统会自动进入类似的目录
查看 Sun 服务器型号
# /usr/platform/`uname -m`/sbin/prtdiag -v | grep `uname -m`
在vi 中一行文字前后添加字符
:/^\(.*\)/s//我要 \1 添加/
查找某包含字符串(Verita)软件包的详细信息 (Solaris)
pkginfo -l `pkginfo | grep -i VERITAS | awk '{print $2}'`
Sun 的一大堆脚本
http://www.sun.com/bigadmin/scripts/index.html
# find ~ -name core -exec file {} \; -exec rm -i {} \;
查看使用文件的进程
# fuser -u /usr/my_application/foo
搜索字符串
#grep "hello world" `find ./ -name "*" -print -exec file {} \; |grep text | cut -d ':' -f 1`
目录
#alias dir='ls -Lla|grep ^d'
输出 IP 地址
#ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}'
按文件长度排序
#ls -l | grep ^- | sort -nr -k 5 | more
#ls -lR | grep ^- | sort -nr -k 5 | more
二进制文件中的可打印字符
# strings name of binary file
一个月的最后一个星期天执行任务:
18 * * * 0 [`date "+%d"` -gt 24] && /path/to/script
修改扩展名:
# for f in *.abc; do mv $f `basename $f .abc`.def ; done
查看硬盘情况:(Solaris)
# iostat -En
整个目录树拷贝:
# cd
# find . -depth -print | cpio -pudm
按长度排序目录下所有文件
# du -a | sort -n -r | more
检查文件内每行是否有相同列数
#awk '{print NF}' test.txt |sort -nu|more
去除空行
#sed -e '/^[ ]*$/d' InputFile >OutputFile
查看进程占用的对应文件 inode 号(Solaris)
#/usr/proc/bin/pfiles
删除指定用户的所有进程
# kill -9 `ps -fu username |awk '{ print $2 }'|grep -v PID`
Bash 操作快捷键:
ctrl-l -- clear screen
ctrl-r -- does a search in the previously given commands so that you don't
have to repeat long command.
ctrl-u -- clears the typing before the hotkey.
ctrl-a -- takes you to the begining of the command you are currently typing.
ctrl-e -- takes you to the end of the command you are currently typing in.
esc-b -- takes you back by one word while typing a command.
ctrl-c -- kills the current command or process.
ctrl-d -- kills the shell.
ctrl-h -- deletes one letter at a time from the command you are typing in.
ctrl-z -- puts the currently running process in background, the process
can be brought back to run state by using fg command.
esc-p -- like ctrl-r lets you search through the previously given commands.
esc-. -- gives the last command you typed.
文件名里的空格替换为下划线
# for i in $1 ; do mv "$i" `echo $i | sed 's/ /_/g'` ; done
查看远程主机时间
# telnet remotehostname 13|grep :
只显示 top 命令的states 行
#while true; do top -d 2 | col -b | grep states; sleep 10; done
加速显示 tar 文件内容
# tar tvfn
让 目录名也能 Spell Check
#shopt -s cdspell
当输错命令时,系统会自动进入类似的目录
查看 Sun 服务器型号
# /usr/platform/`uname -m`/sbin/prtdiag -v | grep `uname -m`
在vi 中一行文字前后添加字符
:/^\(.*\)/s//我要 \1 添加/
查找某包含字符串(Verita)软件包的详细信息 (Solaris)
pkginfo -l `pkginfo | grep -i VERITAS | awk '{print $2}'`
Sun 的一大堆脚本
http://www.sun.com/bigadmin/scripts/index.html
linux date得到上一小时的时间:
date -d "-1 hour" "+%Y-%m-%d-%H"
直接输出时间和日期:
监控到XXXX。2016-01-28 14:55:34
七天前的日期:
[root@i popularity]# cat a.sh
echo `date +%y-%m-%d`
`:是ESC上面那个点,不是单纯的点。
1. 利用时区,比较笨的办法,不过也可以用.注意改回时区哦.
$#看当前时区
$echo $TZ
CST-8
$#显示当前时间
$date
Mon Apr 2 15:48:36 CST 2002
$#改变当前时区,
TZ=CST+16;export TZ
$#显示当前时间(中间未改变系统时间,但date命令的显示已为昨天)
Mon Apr 1 15:48:33 CST 2002
2.
假如今天是2005-05-17
取2004-09-25
#date -d"-1 year +4 month +8 day" +%Y-%m-%d
取2008-02-12
#date -d"+3 year -3 month -5 day" +%Y-%m-%d
有哥们回复加上:
date +%F --date='1 days ago'
name=$(date -u +'%Y%m%d')
echo $name;
[/usr/local/361sport_2010]# sh date.sh
select FQQ from Tbl_User order by FScoreCount into outfile '/tmp/361sport_2010_order_out_all_20100823.log
date -u:直接输出时间
20101203
date -d://时间天数加减
昨天:
date -d"-1 day" +%Y%m%d
(1)年月天数相减:
date -d"+3 year -3 month -5 day" +%Y-%m-%d
2013-08-29
(2)年月日格式2:
date -d"+3 year -3 month -5 day" +%Y%m%d
20130829
date -d "-1 hour" "+%Y-%m-%d-%H"
直接输出时间和日期:
监控到XXXX。2016-01-28 14:55:34
七天前的日期:
[root@i popularity]# cat a.sh
echo `date +%y-%m-%d`
`:是ESC上面那个点,不是单纯的点。
1. 利用时区,比较笨的办法,不过也可以用.注意改回时区哦.
$#看当前时区
$echo $TZ
CST-8
$#显示当前时间
$date
Mon Apr 2 15:48:36 CST 2002
$#改变当前时区,
TZ=CST+16;export TZ
$#显示当前时间(中间未改变系统时间,但date命令的显示已为昨天)
Mon Apr 1 15:48:33 CST 2002
2.
假如今天是2005-05-17
取2004-09-25
#date -d"-1 year +4 month +8 day" +%Y-%m-%d
取2008-02-12
#date -d"+3 year -3 month -5 day" +%Y-%m-%d
有哥们回复加上:
date +%F --date='1 days ago'
[root@i model]# date +%F --date='1 days ago'
2009-05-06
2009-05-06
name=$(date -u +'%Y%m%d')
echo $name;
#!/bin/bash
sql="select FQQ from Tbl_User order by FScoreCount into outfile '/tmp/361sport_2010_order_out_all_$(date +%Y%m%d).log";
echo $sql;
sql="select FQQ from Tbl_User order by FScoreCount into outfile '/tmp/361sport_2010_order_out_all_$(date +%Y%m%d).log";
echo $sql;
[/usr/local/361sport_2010]# sh date.sh
select FQQ from Tbl_User order by FScoreCount into outfile '/tmp/361sport_2010_order_out_all_20100823.log
date -u:直接输出时间
date -u +%Y%m%d
20101203
date -d://时间天数加减
昨天:
date -d"-1 day" +%Y%m%d
(1)年月天数相减:
date -d"+3 year -3 month -5 day" +%Y-%m-%d
2013-08-29
(2)年月日格式2:
date -d"+3 year -3 month -5 day" +%Y%m%d
20130829
firefox和ie在修改了本机的hosts文件后,必须重起一下ie才起作用,今天看到有人讨论这个问题,问有没有办法可以用命令行清空dns的cache,直接使修改过的hosts文件生效,而不需要重起ff或者ie。
方法很简单
ipconfig/displaydns Display the contents of the DNS Resolver Cache.
显示dns cache的内容,包括hosts文件里的信息也会显示出来。
ipconfig这个命令经常用,常用的有:
/all Display full configuration information.
/release Release the IP address for the specified adapter.
/renew Renew the IP address for the specified adapter.
但是这个关于dns的功能很少用。还有
/registerdns Refreshes all DHCP leases and re-registers DNS names
/showclassid Displays all the dhcp class IDs allowed for adapter.
/setclassid Modifies the dhcp class id
方法很简单
ipconfig /flushdns
相应的还有ipconfig/displaydns Display the contents of the DNS Resolver Cache.
显示dns cache的内容,包括hosts文件里的信息也会显示出来。
ipconfig这个命令经常用,常用的有:
/all Display full configuration information.
/release Release the IP address for the specified adapter.
/renew Renew the IP address for the specified adapter.
但是这个关于dns的功能很少用。还有
/registerdns Refreshes all DHCP leases and re-registers DNS names
/showclassid Displays all the dhcp class IDs allowed for adapter.
/setclassid Modifies the dhcp class id
在新的centos6.2里是这样来安这个setup的。
在command terminal输入:
当我登陆到 CentOS 5.3 中,尝试使用netconfig 是不能使用的,并不奇怪。。。
以前版本:
rpm -ivh netconfig-0.8.24-1.2.2.1.i386.rpm
在CentOs5.3没有找到。
也可以直接:
vi /etc/sysconfig/network-script/ifcfg-eth0
一 ,修改:
/etc/sysconfig/network-scripts/ifcfg-eth0
二修改网关
三修改DNS
四重新启动网络配置
改主机名
vi /etc/sysconfig/network
但是我是一个懒人的嘛: 其次就使用 setup 来配置,觉得有点惊奇,因为5.1版本可以使用的命令,现在不能
rpm -ql setup-2.5.58-4.el5.noarch.rpm
可能是setup没有添加到环境变量的原因,连setup都没有用上,太他妈的倒霉了饿:
最后,
使用了。只好使用 system-config-network!
注意:netconfig是RHEL4 CentOS4里的命令了, RHEL5和CentOS5用setup了,界面跟以前几乎一样。
# rpm -q -a
或者:
rpm -qa |grep man
看有没有man、netconfig的包文件?
没有就要安装
-q name :查询
-qa查询所有已安装的RPM
-qi name 查询这个软件详细信息
-ql 显示列表
-qf path :查询一个文件属于哪个包
-qp 包名 :查文件是什么
-qpl 包名 :针对一个没装过的包
没有的话安装相应的RPM包吧?
你如果用的是:as5不完全安装时没有这个命令的
直接用setup!
选择:network configuration 即可配置!
其实你也可以修改:
进行配置!
Centos6,Rpm安装,不知道是不是这个,但安了才能使用setup:
rpm -ihv ./Packages/setuptool-1.19.9-3.el6.i686.rpm
rpm -ihv ./Packages/usermode-1.102-3.el6.i686.rpm
在command terminal输入:
#netconfig
[code][root@vm02 ~]# netconfig
netconfig: Command not found.
[/code]检查你是root?你装了netconfig的rpm包了吗?find / -name netconfig -print找一下有没有!netconfig: Command not found.
当我登陆到 CentOS 5.3 中,尝试使用netconfig 是不能使用的,并不奇怪。。。
以前版本:
rpm -ivh netconfig-0.8.24-1.2.2.1.i386.rpm
在CentOs5.3没有找到。
也可以直接:
vi /etc/sysconfig/network-script/ifcfg-eth0
一 ,修改:
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static dhcp
IPADDR=192.168.1.101
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
ONBOOT=yes
BOOTPROTO=static dhcp
IPADDR=192.168.1.101
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
二修改网关
vi /etc/sysconfig/networkNETWORKING=yes
HOSTNAME=Aaron
GATEWAY=192.168.1.254
HOSTNAME=Aaron
GATEWAY=192.168.1.254
三修改DNS
vi /etc/resolv.confnameserver 202.96.128.68
nameserver 219.136.241.206
nameserver 219.136.241.206
四重新启动网络配置
/etc/init.d/network restart
service network stop
service network start
service network stop
service network start
改主机名
vi /etc/sysconfig/network
但是我是一个懒人的嘛: 其次就使用 setup 来配置,觉得有点惊奇,因为5.1版本可以使用的命令,现在不能
setup-2.5.58-4.el5.noarch.rpm
rpm -ihv setup-2.5.58-4.el5.noarch.rpm
rpm -ihv setup-2.5.58-4.el5.noarch.rpm
rpm -ql setup-2.5.58-4.el5.noarch.rpm
可能是setup没有添加到环境变量的原因,连setup都没有用上,太他妈的倒霉了饿:
最后,
使用了。只好使用 system-config-network!
注意:netconfig是RHEL4 CentOS4里的命令了, RHEL5和CentOS5用setup了,界面跟以前几乎一样。
# rpm -q -a
或者:
rpm -qa |grep man
rpm -qa |grep netconfig
看有没有man、netconfig的包文件?
没有就要安装
-q name :查询
-qa查询所有已安装的RPM
-qi name 查询这个软件详细信息
-ql 显示列表
-qf path :查询一个文件属于哪个包
-qp 包名 :查文件是什么
-qpl 包名 :针对一个没装过的包
没有的话安装相应的RPM包吧?
你如果用的是:as5不完全安装时没有这个命令的
直接用setup!
选择:network configuration 即可配置!
其实你也可以修改:
/etc/sysconfig/network-scripts/ifcfg-eth0
进行配置!
Centos6,Rpm安装,不知道是不是这个,但安了才能使用setup:
rpm -ihv ./Packages/setuptool-1.19.9-3.el6.i686.rpm
rpm -ihv ./Packages/usermode-1.102-3.el6.i686.rpm
我们需要对这个数组先按照score【分数排序:由高到低】,然后再由name[姓名低到高排序]:
特别注意:array_multisort对姓名排序时候要utf8【假如是UTF8】转为gbk,否则排序出现错误,切忌切忌!!!
1.排序代码:[特别注意:我在排序分数的时候有个千分位输出,最后排序发现它会当成整形去处理,逗号{千分位分隔符}会截断],所以,最好是先排好【对score排好--》在通过number_format来千分位输出,见下代码:】
由于调用用户姓名接口是utf8输出,我们这儿的php文件是gbk编码【由于大部规定:除了html模板,接口返回编码和数据存储为utf8外其余都是gbk编码,因此:我这个modle层的编码也是gbk的】,为此,必须转为gbk来进行中文名的二次排序【首先是按照分数来排序,这个数组在后面给出】,
注意:转为GBK编码片段: iconv("UTF-8","GBK",$v);
排序代码:
Array
(
[0] => Array
(
[name] => 盛大师
[uid] => 1159375663
[score] => 88,897,776
[potourl] => http://p8.sinaimg.cn/1159375663/50/1236592606
[imgsrc] => Array
(
[0] => renyuan_level_1.gif
[1] => renyuan_level_1.gif
[2] => renyuan_level_1.gif
[3] => renyuan_level_1.gif
[4] => renyuan_level_1.gif
[5] => renyuan_level_1.gif
)
)
[1] => Array
(
[name] => 你好
[uid] => 1377417885
[score] => 728,888
[potourl] => http://p6.sinaimg.cn/1377417885/50/1234321817
[imgsrc] => Array
(
[0] => renyuan_level_1.gif
[1] => renyuan_level_1.gif
[2] => renyuan_level_1.gif
[3] => renyuan_level_1.gif
)
)
[2] => Array
(
[name] => 笨蛋
[uid] => 1584778420
[score] => 77,909
[potourl] => http://p5.sinaimg.cn/1584778420/50/
[imgsrc] => Array
(
[0] => renyuan_level_2.gif
[1] => renyuan_level_2.gif
[2] => renyuan_level_2.gif
[3] => renyuan_level_2.gif
[4] => renyuan_level_2.gif
)
)
[3] => Array
(
[name] => 吥喜欢
[uid] => 1581862283
[score] => 17,776
[potourl] => http://p4.sinaimg.cn/1581862283/50/1239087886
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[4] => Array
(
[name] => 阿里爸
[uid] => 1582003980
[score] => 17,776
[potourl] => http://p5.sinaimg.cn/1582003980/50/1232551415
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[5] => Array
(
[name] => 科比
[uid] => 1582157323
[score] => 17,776
[potourl] => http://p4.sinaimg.cn/1582157323/50/1232615329
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[6] => Array
(
[name] => 琳琳琳
[uid] => 1281167662
[score] => 17,776
[potourl] => http://p7.sinaimg.cn/1281167662/50/1239361854
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[7] => Array
(
[name] => 克里斯大王
[uid] => 1141457724
[score] => 8,988
[potourl] => http://p5.sinaimg.cn/1141457724/50/1232521326
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
)
)
[8] => Array
(
[name] => 苗艳宏
[uid] => 1581837512
[score] => 8,988
[potourl] => http://p1.sinaimg.cn/1581837512/50/1236940821
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
)
)
[9] => Array
(
[name] => 朱阿里
[uid] => 1180166542
[score] => 8,988
[potourl] => http://p7.sinaimg.cn/1180166542/50/
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
)
)
)
对二维数组里的某列键值进行排序有点相当于sql语句,array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 关联(string)键名保持不变,但数字键名会被重新索引。 :
参考自己http://www.jb51.net/article/25882.htm
输出如下所示:
---------- 调试PHP ----------
Array
(
[0] => Array
(
[id] => 6
[value] => 6-1
[parent] => 3
)
[1] => Array
(
[id] => 5
[value] => 5-1
[parent] => 2
)
[2] => Array
(
[id] => 4
[value] => 4-1
[parent] => 2
)
[3] => Array
(
[id] => 3
[value] => 3-1
[parent] => 1
)
[4] => Array
(
[id] => 2
[value] => 2-1
[parent] => 1
)
[5] => Array
(
[id] => 1
[value] => 1-1
[parent] => 1
)
)
输出完成 (耗时 0 秒) - 正常终止
特别注意:array_multisort对姓名排序时候要utf8【假如是UTF8】转为gbk,否则排序出现错误,切忌切忌!!!
1.排序代码:[特别注意:我在排序分数的时候有个千分位输出,最后排序发现它会当成整形去处理,逗号{千分位分隔符}会截断],所以,最好是先排好【对score排好--》在通过number_format来千分位输出,见下代码:】
由于调用用户姓名接口是utf8输出,我们这儿的php文件是gbk编码【由于大部规定:除了html模板,接口返回编码和数据存储为utf8外其余都是gbk编码,因此:我这个modle层的编码也是gbk的】,为此,必须转为gbk来进行中文名的二次排序【首先是按照分数来排序,这个数组在后面给出】,
注意:转为GBK编码片段: iconv("UTF-8","GBK",$v);
foreach($resultname as $k =>$v)
{
$arraydisplay[$i][name] = iconv("UTF-8","GBK",$v);
$arraydisplay[$i][uid] = $k;
$arraydisplay[$i][score] = $json2array[$k];
$arraydisplay[$i][potourl] = $resulticon[$k];
foreach ($level_type as $kka =>$vvc)
{
if(($json2array[$k]<=$vvc[1])&&($json2array[$k]>=$vvc[0]))
{
$imgurl = $LeavelImg[$kka][0];//取得图片地址
$loopimg = $LeavelImg[$kka][1];
for($jj=0;$jj<$loopimg;$jj++)
{
$imgnum[] = $imgurl;
}
break;
}
}
$arraydisplay[$i][imgsrc] = $imgnum;
unset($imgnum);
$i++;
}
{
$arraydisplay[$i][name] = iconv("UTF-8","GBK",$v);
$arraydisplay[$i][uid] = $k;
$arraydisplay[$i][score] = $json2array[$k];
$arraydisplay[$i][potourl] = $resulticon[$k];
foreach ($level_type as $kka =>$vvc)
{
if(($json2array[$k]<=$vvc[1])&&($json2array[$k]>=$vvc[0]))
{
$imgurl = $LeavelImg[$kka][0];//取得图片地址
$loopimg = $LeavelImg[$kka][1];
for($jj=0;$jj<$loopimg;$jj++)
{
$imgnum[] = $imgurl;
}
break;
}
}
$arraydisplay[$i][imgsrc] = $imgnum;
unset($imgnum);
$i++;
}
排序代码:
$arraydisplay = array_chunk($arraydisplay,10,TRUE);//截取前10个人的数据给smarty $data = $arraydisplay[0];
unset($arraydisplay);
unset($arraydisplay);
foreach ($data as $key => $row)
{
$score[$key] = $row['score'];
$name[$key] = $row['name'];
}
array_multisort($score, SORT_DESC, $name, SORT_ASC, $data);
for($iii=0;$iii<10;$iii++)
{
$data[$iii]['name'] = iconv("GBK","UTF-8",$data[$iii]['name']);
$data[$iii]['score'] = number_format($data[$iii]['score']);
}
$result = $data;
}
unset($arraydisplay);
unset($arraydisplay);
foreach ($data as $key => $row)
{
$score[$key] = $row['score'];
$name[$key] = $row['name'];
}
array_multisort($score, SORT_DESC, $name, SORT_ASC, $data);
for($iii=0;$iii<10;$iii++)
{
$data[$iii]['name'] = iconv("GBK","UTF-8",$data[$iii]['name']);
$data[$iii]['score'] = number_format($data[$iii]['score']);
}
$result = $data;
}
Array
(
[0] => Array
(
[name] => 盛大师
[uid] => 1159375663
[score] => 88,897,776
[potourl] => http://p8.sinaimg.cn/1159375663/50/1236592606
[imgsrc] => Array
(
[0] => renyuan_level_1.gif
[1] => renyuan_level_1.gif
[2] => renyuan_level_1.gif
[3] => renyuan_level_1.gif
[4] => renyuan_level_1.gif
[5] => renyuan_level_1.gif
)
)
[1] => Array
(
[name] => 你好
[uid] => 1377417885
[score] => 728,888
[potourl] => http://p6.sinaimg.cn/1377417885/50/1234321817
[imgsrc] => Array
(
[0] => renyuan_level_1.gif
[1] => renyuan_level_1.gif
[2] => renyuan_level_1.gif
[3] => renyuan_level_1.gif
)
)
[2] => Array
(
[name] => 笨蛋
[uid] => 1584778420
[score] => 77,909
[potourl] => http://p5.sinaimg.cn/1584778420/50/
[imgsrc] => Array
(
[0] => renyuan_level_2.gif
[1] => renyuan_level_2.gif
[2] => renyuan_level_2.gif
[3] => renyuan_level_2.gif
[4] => renyuan_level_2.gif
)
)
[3] => Array
(
[name] => 吥喜欢
[uid] => 1581862283
[score] => 17,776
[potourl] => http://p4.sinaimg.cn/1581862283/50/1239087886
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[4] => Array
(
[name] => 阿里爸
[uid] => 1582003980
[score] => 17,776
[potourl] => http://p5.sinaimg.cn/1582003980/50/1232551415
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[5] => Array
(
[name] => 科比
[uid] => 1582157323
[score] => 17,776
[potourl] => http://p4.sinaimg.cn/1582157323/50/1232615329
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[6] => Array
(
[name] => 琳琳琳
[uid] => 1281167662
[score] => 17,776
[potourl] => http://p7.sinaimg.cn/1281167662/50/1239361854
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
[5] => renyuan_level_3.gif
)
)
[7] => Array
(
[name] => 克里斯大王
[uid] => 1141457724
[score] => 8,988
[potourl] => http://p5.sinaimg.cn/1141457724/50/1232521326
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
)
)
[8] => Array
(
[name] => 苗艳宏
[uid] => 1581837512
[score] => 8,988
[potourl] => http://p1.sinaimg.cn/1581837512/50/1236940821
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
)
)
[9] => Array
(
[name] => 朱阿里
[uid] => 1180166542
[score] => 8,988
[potourl] => http://p7.sinaimg.cn/1180166542/50/
[imgsrc] => Array
(
[0] => renyuan_level_3.gif
[1] => renyuan_level_3.gif
[2] => renyuan_level_3.gif
[3] => renyuan_level_3.gif
[4] => renyuan_level_3.gif
)
)
)
对二维数组里的某列键值进行排序有点相当于sql语句,array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 关联(string)键名保持不变,但数字键名会被重新索引。 :
参考自己http://www.jb51.net/article/25882.htm
输出如下所示:
---------- 调试PHP ----------
Array
(
[0] => Array
(
[id] => 6
[value] => 6-1
[parent] => 3
)
[1] => Array
(
[id] => 5
[value] => 5-1
[parent] => 2
)
[2] => Array
(
[id] => 4
[value] => 4-1
[parent] => 2
)
[3] => Array
(
[id] => 3
[value] => 3-1
[parent] => 1
)
[4] => Array
(
[id] => 2
[value] => 2-1
[parent] => 1
)
[5] => Array
(
[id] => 1
[value] => 1-1
[parent] => 1
)
)
输出完成 (耗时 0 秒) - 正常终止
//程序中
//函数地定义
//模板中使用
实例:
HTML调用:
参看:http://movoin.com/index.php/archives/182
http://www.phpx.com/happy/thread-123410-1-1.html
$smarty->register_function('asc','asc_num');
//函数地定义
function asc_num($params){
extract($params);
echo chr($num+64);
}
extract($params);
echo chr($num+64);
}
//模板中使用
<{asc num=$smarty.section.loop2.iteration}>
实例:
function insert_left($params, &$smarty) {
global $FOURAPP;
$o_app = new AppProx;
$bRet = $o_app->getUserList(&$objarr, $params['cuseruid']);
if($bRet) {
if(is_array($objarr) && count($objarr)>0) {
$userapplist = array_diff_key($objarr, $FOURAPP);
} else {
$userapplist = array();
}
$smarty->assign('cuseruid', $params['cuseruid']);
$smarty->assign('userappnum', count($userapplist));
$smarty->assign('userapplist', &$userapplist);
$smarty->assign('fourapp', &$FOURAPP);
}
$html = &$smarty->fetch('part/left.html');
return $html;
}
function insert_top($params,&$smarty){
$smarty->assign('cuseruid',$params['cuseruid']);
return $smarty->fetch('part/top.html');
}
global $FOURAPP;
$o_app = new AppProx;
$bRet = $o_app->getUserList(&$objarr, $params['cuseruid']);
if($bRet) {
if(is_array($objarr) && count($objarr)>0) {
$userapplist = array_diff_key($objarr, $FOURAPP);
} else {
$userapplist = array();
}
$smarty->assign('cuseruid', $params['cuseruid']);
$smarty->assign('userappnum', count($userapplist));
$smarty->assign('userapplist', &$userapplist);
$smarty->assign('fourapp', &$FOURAPP);
}
$html = &$smarty->fetch('part/left.html');
return $html;
}
function insert_top($params,&$smarty){
$smarty->assign('cuseruid',$params['cuseruid']);
return $smarty->fetch('part/top.html');
}
HTML调用:
<div class="SG_wrapall">
{insert name="top" cuseruid=$uidowner}
</div>
<div class="SG_wrap950 pybg">
<div class="SG_colW13 SG_colFirst">
{insert name="left" cuseruid=$uidowner}
</div>
{insert name="top" cuseruid=$uidowner}
</div>
<div class="SG_wrap950 pybg">
<div class="SG_colW13 SG_colFirst">
{insert name="left" cuseruid=$uidowner}
</div>
参看:http://movoin.com/index.php/archives/182
http://www.phpx.com/happy/thread-123410-1-1.html
{cycle} 用于在值集合中轮换。便于实现下述情况,在一个表格中交替输出两种或多种颜色,在值数组中循环。
Example 8-5. {cycle}
{section name=rows loop=$data}<tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}"> <td>{$data[rows]}</td></tr>{/section}
The above template would output:
<tr bgcolor="#eeeeee"> <td>1</td></tr><tr bgcolor="#d0d0d0"> <td>2</td></tr><tr bgcolor="#eeeeee"> <td>3</td></tr>
自己测试:
PHP端:
Html输出端:
浏览器展现:
Example 8-5. {cycle}
{section name=rows loop=$data}<tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}"> <td>{$data[rows]}</td></tr>{/section}
The above template would output:
<tr bgcolor="#eeeeee"> <td>1</td></tr><tr bgcolor="#d0d0d0"> <td>2</td></tr><tr bgcolor="#eeeeee"> <td>3</td></tr>
自己测试:
PHP端:
Html输出端:
浏览器展现: