IE 6下cookie写入失败

2013年3月4日 1 条评论

一个简单的页面在加载的时候种植一个cookie,其他浏览器都能成功写入,测试IE 6时始终无法写入。由于是本地指定的一个测试三级子域,一度以为是域名长度问题,通过测试其他域名,排除了此问题。后来发现这个域名中使用了下划线,查了一下域名命名规范,规范规定域名只能是字母、数字和-(中划线)的组合,显然这不是一个规范的域名,IE 6自身机制拒绝种植cookie,所以导致失败。

想起曾经也碰到过IE 6通过js的方法无法在domain字符串少于5个字符的情况。也是源于IE 6自身的安全机制考虑的,可能在开发IE 6的时候还没有例如cn、uk、au之类的域名,其想当然的认为域名至少超过5个字符吧。

分类: web前端 标签:

mysql 查看数据库中所有表的记录数

2013年3月3日 没有评论

mysql使用select count(*) from table_name可以查询某个表的总记录数。想快速的知道数据库中所有表的记录数信息怎么办?如果使用mysql的版本在5.0及以上,可以通过查询information_schema库中的tables表来获取,该表中使用table_rows记录表的行数信息。例如查看库testdb中所有表的记录数:

use information_schema;

select table_name,table_rows from tables 
where TABLE_SCHEMA = 'testdb' 
order by table_rows desc; 

不过需要注意的是,对于InnoDB表,table_rows行计数仅是大概估计值。

另外一种办法还是借助information_schema库的tables表,来拼接出一个条sql语句,例如:

use information_schema;

select concat(
    'select "', 
    TABLE_name, 
    '", count(*) from ', 
    TABLE_SCHEMA, 
    '.',
    TABLE_name,
    ' union all'
) from tables 
where TABLE_SCHEMA='testdb';

把生成的结果手动加工一下就行了,起码比一张张表去拼写要来的快。

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 标签:

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