2013年1月 的存档

php urlencode与rawurlencode的区别

2013年1月31日 1 条评论

urlencode的用途就是编码字符串,把原字符串中所有除”-_”以为的非所有字母数字字符替换成百分号(%)后跟两位十六进制数,但是需要注意:由于历史原因会把空格替换+号。rawurlencode其实和urlencode一样,也是用来编码字符串的,唯一的不同是它是使用RFC1738 编码,也就是会把空格替换成%20。

它们对应的解码函数是urldecode和rawurldecode。参考官方网站的说明,urldecode解码给出的已编码字符串中的任何%##,加号(’+')被解码成一个空格字符;rawurldecode解码字符字符串中百分号(%)后跟两位十六进制。有两点区别,一是urldecode解码是对百分号(%)后任意两位字符都去会进行解码,例如%MN也会解码,但是会失败;rawurldecode则只会对百分号(%)后两位是十六进制(0-9A-F)的字符才会解码,二是urldecode会把+号解码为空格。

通过上面对解码函数的描述,可以推论,使用urlencode或rawurlencode编码的都可以使用urldecode进行解码,但是如果原字符串中含有空格,使用urlencode编码后的字符串使用rawurlencode解码后获得的字符串会和原字符串不同。

分类: PHP 标签:

mysql date_add date_sub

2013年1月18日 没有评论

mysql中内置函数date_add和date_sub能对指定的时间进行增加或减少一个指定的时间间隔,语法如下:

DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)

其中date是指定的日期,INTERVAL为关键词,expr是具体的时间间隔,type是时间单位。注意:type可以复合型的,比如YEAR_MONTH。如果type不是复合型的,DATE_ADD和DATE_SUB其实可以通用,因为expr可以为一个负数。可用的type如下表:

MICROSECOND 间隔单位:毫秒
SECOND 间隔单位:秒
MINUTE 间隔单位:分钟
HOUR 间隔单位:小时
DAY 间隔单位:天
WEEK 间隔单位:星期
MONTH 间隔单位:月
QUARTER 间隔单位:季度
YEAR 间隔单位:年
SECOND_MICROSECOND 复合型,间隔单位:秒、毫秒,expr可以用两个值来分别指定秒和毫秒
MINUTE_MICROSECOND 复合型,间隔单位:分、毫秒
MINUTE_SECOND 复合型,间隔单位:分、秒
HOUR_MICROSECOND 复合型,间隔单位:小时、毫秒
HOUR_SECOND 复合型,间隔单位:小时、秒
HOUR_MINUTE 复合型,间隔单位:小时分
DAY_MICROSECOND 复合型,间隔单位:天、毫秒
DAY_SECOND 复合型,间隔单位:天、秒
DAY_MINUTE 复合型,间隔单位:天、分
DAY_HOUR 复合型,间隔单位:天、小时
YEAR_MONTH 复合型,间隔单位:年、月

对应复合型的type,需要使用引号对两个参数进行引用起来,中间用任何非数字字符作为间隔即可,并且不能使用负数。但是时间间隔只指定了一个值,那么也能正常工作,但是对应XXX_YYY使用的单位为YYY,也就相当于单一单位的type,同时可以使用负数。复合型的用法如下:

mysql> select date_add('2013-01-18', interval '1 2' YEAR_MONTH);
+-----------------------------------------------------+
| date_add('2013-01-18', interval '1 2' YEAR_MONTH) |
+-----------------------------------------------------+
| 2014-03-18                                          |
+-----------------------------------------------------+

mysql> select date_add('2013-01-18', interval '1-2' YEAR_MONTH);
+----------------------------------------------------+
| date_add('2013-01-18', interval '1-2' YEAR_MONTH) |
+----------------------------------------------------+
| 2014-03-18                                         |
+----------------------------------------------------+

mysql> select date_add('2013-01-18', interval '1,2' YEAR_MONTH);
+---------------------------------------------------+
| date_add('2013-01-18', interval '1,2' YEAR_MONTH) |
+---------------------------------------------------+
| 2014-03-18                                        |
+---------------------------------------------------+

mysql> select date_add('2013-01-18', interval 1 YEAR_MONTH);
+-----------------------------------------------+
| date_add('2013-01-18', interval 1 YEAR_MONTH) |
+-----------------------------------------------+
| 2013-02-18                                    |
+-----------------------------------------------+

mysql> select date_add('2013-01-18', interval -1 YEAR_MONTH);
+------------------------------------------------+
| date_add('2013-01-18', interval -1 YEAR_MONTH) |
+------------------------------------------------+
| 2012-12-18                                     |
+------------------------------------------------+
分类: MySQL 标签: ,

mysql ifnull

2013年1月17日 没有评论

mysql内置的ifull函数可以用在查询时候为NULL值字段给一个默认值,例如:

select ifnull(col1, 'default-value'), col2 from test;

当test表的col1字段为NULL时,数据库返回的结果就为default-value,否则就返回本身的值。但是当col1字段的值为空字符串(”),由于空字符不是NULL,因此返回的结果还是空字符串。如果需要把空字符串或NULL值都用default-value代替,显然ifnull是不行,不过使用case when语句能搞定,示例如下:

select c1,
(case when c2 = '' or c2 is null then 'default-value' else  c2 end) 
from test;
分类: MySQL, 数据库 标签:

PHP Warning: Call-time pass-by-reference has been deprecated

2013年1月17日 没有评论

今天执行一个php脚本的时候得到如题的警告信息,原因是在调用function的时候在参数前面加了符号”&”,这种做法已经没php遗弃了。参数前加符号”&”,就是相当于传地址,function内部可以修改此变量。那么如何去掉此警告的同时且达到function内部能对参数进行修改呢?答案就是在定义function的时候使用”&”符号。例如:

function foo(&$var) {
	$var = 321;
}

$var = 123;
foo($var);

echo $var;   // 输出为 321
分类: PHP 标签:

vim 块操作

2013年1月16日 没有评论

以前写shell脚本或修改某些配置文件(如:nginx)时,由于没有块注释,只能一行一行的来加注释,甚是麻烦。今天无意中发现了vim中的快操作,使用此功能能很方便的实现块注释。

在非insert模式使用组合键 ctrl + v 来开启块模式,这时在窗口左下角显示“ — VISUAL BLOCK — ”,可以通过方向键或h、j、k、l来选择需要操作的块。可以对选择的块进行编辑、复制、粘贴、删除等操作。

例如注释nginx配置文件中的某一段,具体操作是:先把光标移动到需要注释的开始行的最前面,使用 ctrl + v 开启块模式,使用j向下移动光标,可以看到被选取的块,在使用 shift + i (即大写的I)进入插入模式(注意此时插入点会自动回到开启块模式的位置),输入注释符#,ESC 退出插入模式,稍等片刻,刚才选取的块自动被填充了#,就达到了快速注释一段配置的目的。操作示例如下:

 

分类: Linux 标签:

防止点空链接页面回到顶部

2013年1月15日 没有评论

由于现在AJAX的流行,页面的上a标签的功能可能不仅仅是作为一个链接跳转,还可能是用作触发一个ajax请求,即用上a标签的onclick事件。a标签是通过属性href来指定链接地址的,如果用做ajax的button,可能会把href的属性值设置为#,例如:

<a href="#" onclick="doAjax()">Btn</a>

这样做其实是没有错的,但是当点击此链接后,页面会跑到顶端,特别的,当页面设置了 时候,会跳出另外一个页面,所以在用户体验上不是很好。

如何解决这样的问题呢?其实很简单,给href属性赋值一个javascript空函数即可,例如:

<a href="javascript:void(0)" onclick="doAjax()">Btn</a>
分类: web前端 标签:

vim 分屏操作

2013年1月14日 没有评论

启动vim打开多个文件并分屏显示:

vim -on file1 file2
o为小写字母,上下分,n是分屏的个数,后面是待打开的文件

vim -On file1 file2
O为大写字母,左右分,n是分屏的个数,后面是待打开的文件

在已经打开的vim中对文件进行分屏

对光标所在的窗口进行上下分屏
:sp
ctrl + w s

对光标所在的窗口进行左右分屏
:vsp
ctrl + w v

不同窗口间的移动

移动到光标左边的窗口
ctrl + w h
ctrl + w 

移动到光标上边的窗口
ctrl + w k
ctrl + w ↑

移动到光标下边的窗口
ctrl + w j
ctrl + w ↓

关闭当前窗口

ctrl + w c
ctrl + w q
:q
分类: Linux 标签:

vim recording功能介绍

2013年1月13日 没有评论

使用vim时无意间触碰到q键,左下角出现“recording”这个标识,觉得好奇,遂在网上查了一下,然后这是vim的一个强大功能。他可以录制一个宏(Macro),在开始记录后,会记录你所有的键盘输入,包括在insert模式下的输入、正常模式下使用的各种命令等。

具体使用:

第一步:在正常模式下(非insert模式、非visual模式)按下q键盘

第二步:选择a-z或0-9中任意一个作为缓冲器的名字,准备开始录制宏

第三步:正常的操作,此次所有的操作都会被记录在上一步中定义的缓冲器中

第四步:在非insert模式下输入q停止宏的录制

第五步:使用@ + 第二步中定义的缓冲器的名字即可。

例如想把下面的文字

line1
line-2
line3-1
l4

变成如下的文字

System.out.println(line1);
System.out.println(line1);
System.out.println(line-2);
System.out.println(line3-1);
System.out.println(L4);

观察可以发现他们的规律,在每行文字的开头添加“System.out.println(”,结尾添加“);”就变成下面的信息了。下面简单介绍一下如何使用recording来完成这样的操作。
首先把光标移动line1上,输入qt,准备开始录制,缓冲器的名字为t,录制的动作为:shift + ^ 回到行首、按下i键进入insert模式、输入“System.out.println(”、按下esc键回到正常模式、shift + $ 回到行尾部、按下i键进入insert模式、输入“);”按下esc键回到正常模式,按下q停止录制。然后把光标移动到下面一行的任意位置输入 @ + t 即可。

recording还可以和查询结合起来使用,例如想把一个文件中含有特定字符串的行注释,可以通过这样的宏来实现。在正常模式下输入/search string + enter、shift + ^、i、#、esc、shift + $。

让定制的宏自动执行多次的方法是先输入一个数字,然后在输入@ + 缓冲器的名字。 例如 100@t,表示执行100次。

分类: Linux 标签:

linux 终端下的常用快捷键

2013年1月13日 没有评论

使用linux的少不了玩命令行,掌握一下快捷键可以让你做事达到事半功倍的效果。用的最多的应该是属于Tab键,功能是自动补齐。主要用在命令本身名字和进入目录查看文件,有了它就不需要一字一字的输出命令的完整名字,只要输入前面几个字符,然后Tab一下就可以了,如果存在多个它会全部提示出来;进入一个很深的目录时候,使用Tab也能快速进入。下面列举一些我常用的组合快捷键。

  • ctrl + a  回到命令行的行首
  • ctrl + e  回到命令行的行尾
  • ctrl + c  取消当前行输入的命令,并重新到下一行
  • ctrl + r  出现命令历史记录搜索提示,输入字符后会自动匹配命令
  • ctrl + b  向后退一个字符,相当于向左方向键
  • ctrl + f  向前进一个字符,相当于向右方向键
  • alt  + b  向后跳一个字
  • alt +  f  向前进一个字
  • ctrl + p  向上翻以前的输入命令,相当于向上方向键
  • ctrl + n  向下翻以前的输入命令,相当于向下方向键
  • ctrl + w  从光标位置向后删除一个字
  • ctrl + y  粘贴最后一个删除的字
  • ctrl + d  删除当前光标位置的一个字符
  • ctrl + u  从光标当前位置删除所有字符至行首
  • ctrl + k  从光标当前位置删除所有字符至行尾,相当于长按ctrl + d
分类: Linux 标签:

linux nohup用途

2013年1月12日 没有评论

玩过Linux的人应该都知道,如果想让一个程序在后台运行,只要在执行命令的末尾加上一个&符号就可以了。但是这种方式不是很保险,有些程序当你登出终端后它就会停止。那么如何让一个程序真正永远在后台执行呢。答案就是使用 nohub 命令,格式为:

nohup 执行程序的命令 &

如果程序有输出,它会试着把输出写入执行上述命令的当前文件夹下的 nohup.out 文件中,当写入失败,就会写当前用户的$HOME目录下的nohup.out 中。

分类: Linux 标签:

无觅相关文章插件,快速提升流量