工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表2008年06月的文章

一个不错的PHP下中文编码各种格式间的转换类

一个不错的PHP下各种编码转换类

 * 中文编码集合类库
 *
 * 目前该类库可以实现,简体中文 <-> 繁体中文编码互换,简体中文、繁体中文 -> 拼音单向转换,
 * 简体中文、繁体中文 <-> UTF8 编码转换,简体中文、繁体中文 -> Unicode单向转换

 

附件: chinese.rar (126.71 K, 下载次数:48)

php5中加入了时区的设置,造成了我们中国的用户会差八个小时的问题

从php5.10开始,php中加入了时区的设置,在php中显示的时间都是格林威治标准时间,这就造成了我们中国的用户会差八个小时的问题!
相关设置是修改php.ini中的 date.timezone 参数:
[Date]
; Defines the default timezone used by the date functions
;date.timezone =

默认是关闭的,只需把注释去掉,改为即可
[Date]
; Defines the default timezone used by the date functions
date.timezone = PRC

其中PRC是“中华人民共和国”!
其他选项可以参考php手册。
不过这上面的亚洲地区漏掉了我们的首都北京,不知道老外是不是故意的!

如果没有修改php.ini的权限,只需要在调用时间日期函数的时候,调用 date_default_timezone_set(’PRC’) 即可!
也可以调用date_default_timezone_get()来查看当前的时区设置!

 

關於XXX,大陸內地可用的值是:
Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次為重慶,上海,烏魯木齊)
港台地區可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次為澳門,香港,台北)
台灣地区可設為:date.timezone = "Asia//Taipei"
還有新加坡:Asia/Singapore

使用distinct在mysql中查询多条不重复记录值的解决办法

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我们两人都郁闷了。。。。。。。。。

下面先来看看例子:

    table
  id name
  1 a
  2 b
  3 c
  4 c
  5 b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

  name
  a
  b
  c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

  id name
  1 a
  2 b
  3 c
  4 c
  5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

很麻烦吧?确实,费尽心思都没能解决这个问题。没办法,继续找人问。

拉住公司里一JAVA程序员,他给我演示了oracle里使用distinct之后,也没找到mysql里的解决方案,最后下班之前他建议我试试group by。

试了半天,也不行,最后在mysql手册里找到一个用法,用group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试试。

报错。。。。。。。。。。。。郁闷。。。。。。。连mysql手册也跟我过不去,先给了我希望,然后又把我推向失望,好狠哪。。。。

再仔细一查,group_concat函数是4.1支持,晕,我4.0的。没办法,升级,升完级一试,成功。。。。。。

终于搞定了,不过这样一来,又必须要求客户也升级了。

突然灵机一闪,既然可以使用group_concat函数,那其它函数能行吗?

赶紧用count函数一试,成功,我。。。。。。。想哭啊,费了这么多工夫。。。。。。。。原来就这么简单。。。。。。

现在将完整语句放出:

select *, count(distinct name) from table group by name

结果:

  id name count(distinct name)
  1 a 1
  2 b 1
  3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧(对了,还有容容那家伙),现在拿出来希望大家不要被这问题折腾。

哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错,差不多了,发给容容放网站上去,我继续忙碌。。。。。。

-----------------------------------------------------------------------------------------


更郁闷的事情发生了,在准备提交时容容发现,有更简单的解决方法。。。。。。

select id, name from table group by name

看来对mysql的了解还是太肤浅了,不怕被笑话,发出来让大家别犯同样的错误。。。。。。

by 索尔

原文 http://www.phpv.net/html/1501.html

 

这篇文章帮了我个很大的忙,帮我解决了我想了一个下午和晚上都没解决的问题,就一个group by name给解决了."看来对mysql的了解还是太肤浅了"

FreeBSD做Gateway(转)

开始:  
1、使用双网卡。一块连接外,一块连接内网.连接外网的网卡标识rl1,连接内网的为rl0
(因为我2块网卡都是REALTEK8139的,所以网卡标识为rl,1和0是两块网卡的区别号)

2、在/etc/rc.conf中加上:  
ifconfig_rl1="inet 218.92.251.108 netmask 255.225.225.0" 
##(对外网卡的设置,很显然,218.92.251.108为静态IP地址。255.255.255.0子网掩码。不懂?我颠~)  
ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0" 
##(对内网卡IP地址以及子网掩码的设置)  
##以上加进rc.conf是为了再每次开机的时候配置好两块网卡的IP地址等。
firewall_enable="NO"   #取消防火墙
gateway_enable="YES"    ##启用网关功能,很显然,很重要。
named_enable="YES"      ##启用DNS名字服务,这样可以让内网通过设置主机做DNS
natd_enable="YES"        ##启用nat功能,很显然,特重要
natd_interface="rl1"       ##设置NAT转发的网卡标识号,rl1为对外连接网卡。相当于###WIN2000里的连接共享设置的那块网卡连接。

3,设置/etc/ipnat.conf
map rl1 192.168.0.0/24 ->; 218.92.251.108/32 portmap tcp/udp 10000:65000
map rl1 192.168.0.0/24 ->; 218.92.251.108/32
##以上是设置允许共享连接的内网IP范围,很显然,24精确到最后一位!也就是说###192.168.0.*的子机都可以通过这台主机上网。

4,设定开机自动执行ipnat。
#cd /usr/local/etc/rc.d
#vi runipnat.sh  
##加入以下内容:  
        #!/bin/sh  
        /sbin/ipnat -f /etc/ipnat.conf
#chmod 755 runipnat.sh   ##权限设为可执行。  

5、设置内核,至关重要!
因为ipfw和ipfilter不能共存,所以如果要使用ipfilter,必须将内核中有关ipfw的部份注释掉
#cd /usr/src/sys/i386/conf    ##/usr/src/sys/i386/conf是内核文件所在目录
#cp GENERIC DWOLF      ##备份内核文件GENERIC

#grep -i IPFIREWALL DWOLF ##查找:IPFIREWALL,如果找到,就加"#"注释掉:
#vi   DWOLF   ##vi编辑,也可以用ee编辑器   
    #options IPFIREWALL  
    #options IPDIVERT  
##再加入:
    options IPFILTER  
    options IPFILTER_LOG  
##保存!
#config DWOLF    ##检查有没有错误
#cd /usr/src  
#make kernel KERNCONF=DWOLF    ##编译内核  
#reboot  

##重起以后打dmesg查看启动信息,我看到有一条
IP Filter: v3.4.31 initialized.   Default = pass all, Logging = enabled  
#ipnat -l    ## 显示ipnat的设定状况
map rl1 192.168.0.0/24 ->; 218.92.251.108/32 portmap tcp/udp 10000:65000
map rl1 192.168.0.0/24 ->; 218.92.251.108/32
呵呵,搞定!

试试内网机器能不能上网,(测试,可省略)
PING 192.168.0.1    成功连接主机,OK!
PING mdxy.3322.org   解析到IP地址,DNS OK!
PING 218.92.251.122   PING通外网主机,OK!(注意,因为8月中旬全国ISO升级,禁止ICMP数据包,路由器外的IP一般都不给PING,你可以找一个自己可以PING通的外网IP,或者省略这一步,无所谓)
==附录几个常用的IPNAT命令
ipnat -l  会列出目前ipnat的设定及状况  
ipnat -C 清除ipnat的设定  
ipfstat 监测数据的流量

多表关联查询

mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id;
mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id);
mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
    ->          LEFT JOIN table3 ON table2.id=table3.id;
mysql> SELECT * FROM table1 USE INDEX (key1,key2)
    ->          WHERE key1=1 AND key2=2 AND key3=3;
mysql> SELECT * FROM table1 IGNORE INDEX (key3)
    ->          WHERE key1=1 AND key2=2 AND key3=3;

dedecms笔记

模板制作帮助文档
http://www.dedecms.com/archives/templethelp/help/index.htm


1、默认底层模板
位置: cmspath/templets/system
功能:在没有指定标记的默认底层模板的时候,系统将自动调用这个文件夹的相应文件作为底层模板。
2、插件目录模板
位置: cmspath/templets/plus
功能:评论、友情链接、RSS地图等模板。
3、会员后台模板
位置: cmspath/member/templets
功能:会员后台的模板。


二次开发
  DedeCms主要的模板解析类是 include/inc_arcpart_view.php、include/inc_arclist_view.php、include/inc_archives_view.php,这些

类是与pub_dedetag.php一起工作的,如果你想为文档模板、列表模板、板块模板增加一些功能,可以直接修改这几个类的ParseTemplet()或

ParseTempletsFirst()这类的方法,把标记名称,属性对应试相应该的功能函数即时。


Dedecms标记入门(新手必读的模板教程)
http://bbs.dedecms.com/read.php?fid=4&tid=51186

Dedecms模型增加字段教程
http://bbs.dedecms.com/read.php?tid=40780

在网站首页调用显示最新加入企业
http://bbs.dedecms.com/read.php?tid=41172
http://www.yoursite.cn/?action=show&id=189

自定义宏标记的应用
http://bbs.dedecms.com/read.php?tid=23661

添加关键字链接的详细说明以及问题
http://bbs.dedecms.com/read.php?tid=59517

Dedecms默认模板用户评论扩展
http://bbs.dedecms.com/read.php?tid=50280

{dede:arclist}的学习心得,如何调用文章或者软件,你想调用的任何字段[已成功]
http://bbs.dedecms.com/read.php?tid=32358&fpage=3

如何得到当前 文章/栏目 对应的一级栏目id [似乎已解决]
http://bbs.dedecms.com/read.php?tid=1073&

DEDE V5一个简单实现栏目文章数统计的方法
http://bbs.dedecms.com/read.php?tid=61947

function @me用法总结 自定义函数
http://www.yoursite.cn/?action=show&id=187

【SQL标记】推荐会员(带用户头像)调用方法
http://bbs.dedecms.com/read.php?tid=55616

 首页调用会员头像排列怎么才能让间隙均衡?
http://bbs.dedecms.com/read.php?tid=59976

【4.0】修改让自定义标记支持position,title
http://bbs.dedecms.com/read.php?tid=15855

 

技巧和教程帮助文档索引【08.05.13整理】
http://bbs.dedecms.com/read.php?tid=60818

dedecms2007RC1 BUG修正及修改汇总贴
http://bbs.dedecms.com/read.php?tid=39793

复制文章自动加上版权的功能

放在<body></body>内
<script type="text/javascript">
document.body.oncopy = function () { setTimeout( function () { var text = clipboardData.getData("text"); if (text) { text = text + "本篇文章来源于 XXXXXXXXXXXXX 原文链接:"+location.href; clipboardData.setData("text", text); } }, 100 ) }
</script>

sed使用

sed -e '编辑指令1' -e '编辑指令2' ... 文件档

其中 , 所有编辑指令都紧接在选项 -e 之後 , 并置於两个 " ' " 特殊字元间。
另外 , 命令上编辑指令的执行是由左而右。

 一般编辑指令不多时 , 使用者通常直接在命令上执行它们。例如 , 删除 yel.
dat 内 1 至 10 行资料 , 并将其
 馀文字中的 "yellow" 字串改成 "black" 字串。此时 , 可将编辑指令直接在命
令上执行 , 其命令如下 :

   sed -e '1,10d' -e 's/yellow/black/g' yel.dat

在命令中 , 编辑指令 '1,10d'(解[5])执行删除 1 至 10 行资料 ; 编辑指令
's/yellow/black/g'(解[6]) ,

 

2.2.1 位址(address)参数的表示法
 实际上 , 位址参数表示法只是将要编辑的资料行 , 用它们的行数或其中的字串
来代替表示它们。下面举几个例子
 说明(指令都以函数参数 d(参照[section4.2]) 为例) :
删除档内第 10 行资料 , 则指令为 10d。
删除含有 "man" 字串的资料行时 , 则指令为 /man/d。
删除档内第 10 行到第 200 行资料, 则指令为 10,200d。

 

执行多个文件档的编辑
 在 sed 命令列上 , 一次可执行编辑多个文件档 , 它们跟在编辑指令之後。例
如 , 替换
  white.dat、red.dat、black.dat 档内的 "yellow" 字串成 "blue" , 其命令
如下:
     sed -e 's/yellow/blue/g' white.dat red.dat black.dat

上述命令执行时 , sed 依 white.dat、red.dat、black.dat 顺序 , 执行编辑指
令 s/yellow/blue/(请参照[section 4.1] ,
进行字串的替换。

 


对t.txt文件内容前加上#
sed -i -e 's/^/#/' t.txt


sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
把config里的enforcing替换为disabled

sed -i -e '/alias vi=vim/d' /root/.bashrc
删除所有含有"alias vi=vim"的行

sed -i -e 's/alias vi=vim//g' /root/.bashrc
替换所有"alias vi=vim"串为空,也即是删除

sed -i "8 s/^/alias vi='vim'/" /root/.bashrc
在第8行增加"alias vi='vim'"

sed -i -e 's/^LANG=.*/LANG="zh_CN.GB18030"/'   /etc/sysconfig/i18n
将LANG开头的行替换为LANG="zh_CN.GB18030"

sed -i '205 s#;open_basedir =#open_basedir = /data/www/wwwroot:/tmp#g' /usr/local/Zend/etc/php.ini
把 ;open_basedir = 替换为 open_basedir = /data/www/wwwroot:/tmp
sed -i '205 s#open_basedir = /data/www/wwwroot:/tmp#;open_basedir =#g' /usr/local/Zend/etc/php.ini

Records:1012