Top test

json数据使用

分类:Web | 作者:small2 | 发表于2012/03/05 1条评论 

本没打算写这篇,不过今天在班上一哥们误解,说我给的数据格式错误,我当时手头还插有别的急活,就撂一边了,之后我细细看来发现不是我的错。
--我当时就想,咋说也不可能,我直接用的php json_encode()转换的,这种情况顶多有一种可能,稍后再说。
还是举个例子上图说吧,类似这样:

他当时也是用safari看的返回数据格式,就老想让我把前面的0、1、2、3序号给去掉xxx之类的
而事实上呢,我传的数据中其中的data数据这一段是{"data":[{},{},{}]}这样,data为键后面数组为值的一个Object(这里按JS环境来描述吧),数组中的每个value又是一个Object。只不过,浏览器在解析、展示的时候自动给加了“序号”0、1、2、3、4....!也就是这样造成视觉误解了。如果把data对应的value(php中对应的是数字为键的数组)换成JS对象(php中对应字母为键的关联数组),估计他就一眼看清楚结构了;告诉他之后这样才完事了;
纠结完了顺便说一下json数据使用的一个注意事项吧,也就是篇头说的可能出错的情况--"
对,就是双引号!
json格式在定义时候就已经说明了value必须用双引号括起来(有些低版本的JS也要求key被括起来),这样的话value中要是再使用双引号的话就会破坏json格式、相应地报错!!!如此以来,我们再使用的时候就要:
1、value里面 注意转义双引号
2、value里面 干脆直接改用单引号
现在想来,之前写的 JSON化数据时丢失数据其实就是双引号造成的!后来在使用中已经解决了。

JSON介绍

Tag:

php header location 使用注意事项

分类:LAMP | 作者:small2 | 发表于2012/02/27 没有评论  

前两天帮同事上线代码,由分支合并到主干时我大致view(这年头嘴里不蹦俩abcd唯恐大家不知道咱学过英格力士)了一些改动,发现有个地方用了header location 的方式来跳转。大致是这样的:
代码零

  1. //上面巴拉巴拉一堆代码
  2. if(A == a) header('Location: url');
  3. //下面巴拉巴拉一堆代码

其实这样写是不“规范“的、易出错的,现总结一下header location语句的使用注意事项:
1、语句前面不允许有多余输出;
2、location与冒号“:"之间不能有空格;
3、语句后面的代码会继续执行,但不输出内容。
下面一一举例释怀阿
代码一语句前面不允许有多余输出

  1. <html>
  2. <?php
  3. //绝对路径或正确的相对路径也行
  4. $url = 'http://gfeng.org';
  5. //header前面有多余输出<html>是不行的,甚至空格也不要
  6. header('Location:'. $url);
  7. ?>

实际上,不止header location语句前面不能有多余输出,header的其它语句也不能有多余输出

代码二location与冒号“:"之间不能有空格

  1. <?php
  2. //此句无效
  3. header('Location :http://gfeng.org');
  4. //这个ok
  5. header('location:http://m.weibo.cn');
  6. //顺便下了个广告
  7. ?>

注意事项3就有多个含义可讲了,
代码三header location 后面的输出看不到,即使页面跳转了

  1. <?php
  2. $test = 12345678;
  3. if($test)header('Location: '. $urlA); //此句ok,页面会跳转
  4. //我们一般地都是echo 、print_r、或var_dump一下,测测看看“实际效果“
  5. //但这里的输出 在页面中是看不到的
  6. echo $test;
  7. ?>

代码四两个或多个header location的话,会执行最后一句header location的

  1. <?php
  2. header('Location: '. $urlA); //此句跳转会忽略
  3. header('Location: '. $urlB); //此句跳转会忽略
  4. header('Location: '. $urlZ)//最后会跳转$urlZ这个地址
  5. ?>

代码五header location后面的其它代码会继续有效地执行

  1. <?php
  2. //前面可能巴拉巴拉一堆代码
  3. if($notLogin)header('Location: '. $urlA); //此句ok,页面会跳转
  4. //如果$notLogin条件为真,程序会继续有效地执行
  5. //////下面开始记录成功登录的日志数据
  6. //这样就会造成下面的“错误”执行,而这不决是我们本想要的

对于注意事项1、2我们在写代码时候多注意规范避免就行,而对于事项3的解决方法,其实我们通常会这样做:
在header location语句后面加一个exitreturn尤其是header语句封装在函数里面使用时更不可少

Tag:

awk中文手册及若干问题

分类:LAMP | 作者:small2 | 发表于2011/11/27 没有评论  

三个在线手册及一个pdf地址:
awk手册
unix awk使用手册
awk学习笔记
awk手册PDF
若干问题(学习整理中):
一、>与>>的输出重定向问题
学习中遇到这段例子代码:

BEGIN {
print " ID Number Arrival Time " > "today_rpt1" #第一处
print "============" > "today_rpt1" #第二处
}
{printf (" %s %s\n", $1,$2) > "today_rpt1"} #第三处

详见手册中 7. awk 程序的应用实例
这段例子实际打印出来是:
ID Number Arrival Time
===========================
(xxx xxx)(要执行文件的前两个字段域)
按照常规UNIX命令的I/O重定向写法,我们知道的是:“>”是覆盖式写入,">>"是追加式写入
如此的话,上面应该输出的只是:
(xxx xxx)(要执行文件的前两个字段域)
问题就出来了:怎么会打印出前两句的内容呢?是不是awk里面的>与>>功能一样呢?
看了网上的一些说法了解到:
在同一个awk命令中的>、>>是没区别的,都是追加的意思;如果执行两次awk的命令结果就覆盖和追加区别出来了;
另外,第一个在线手册中人家也解释到:

读者或许觉得本程序中的I/O重定向符号应使用 " >>" (append)而非 " >".
本程序中若使用 ">" 将数据重导到 today_rpt1, awk 第一次执行该指令时会产生一个新档 today_rpt1, 其后再执行该指令时则把数据追加到today_rpt1文件末, 并非每执行一次就重开一个新文件.
若采用">>"其差异仅在第一次执行该指令时, 若已存在today_rpt1则 awk 将直接把数据append在原文件之末尾.
这一点, 与UNIX中的用法不同.

当时看也不太明白,现在再看这句话就理解了:
>>其实和UNIX中的用法差不多,
而awk中第一次执行到>命令就打开了一个文件,之后就不再打开而是直接追加了
如果想按照我们UNIX思路,则可以在代码中加入close("fileName")修改如下:

BEGIN {
print " ID Number Arrival Time " > "today_rpt1" #第一处
close("today_rpt1")
print "============" > "today_rpt1" #第二处
close("today_rpt1")
}
{printf (" %s %s\n", $1,$2) > "today_rpt1"} #第三处

这样之后,“>”就成了覆盖写入了:只显示第三处执行文本的前两个字段而不显示前两处的文本。

Tag:

[转]《sort命令的k选项大讨论》

分类:LAMP | 作者:small2 | 发表于2011/11/20 没有评论  

最近看sort命令,网上有些写法及例子中有些 +1 -2之类的写法,
但按照例子试试,均不奏效
后来在其他地方找到说 这种写法已经很老套了,都已经不支持了
新的写法放在选项k中了……

这里有一篇有关参数选项k的讨论,内容及用例较全,拷来备用:)
原文在这里
继续阅读 »

Tag:

windows下svn中文件大小写事件

分类:LAMP | 作者:small2 | 发表于2011/10/22 2条评论 

前一段svn分支中建了一个Lbsxxx的文件,合主干时候发现主干中是LBSXXX文件;
而我发现之后本着想不删而该名称的想法来处理,硬性更改文件大小写提交,提交了LBSXXX文件;
再之后update,clear up,甚至check out 等都会报错,报LBSXXX未纳入版本库之类;
等等类似问题吧

网上说的一堆方法都试了,都行不同;

后来仔细研究了看,发现是Windows下文件名大小写不能同名造成的:
一个是LBSXXX与Lbsxxx的不能共存
一个是该目录下svn的log文件中.svn/text-base/下的LBSXXX.svn-base与Lbsxxx.svn-base不能共存

众所周知的,Windows下文件名大小写是敏感的、区分大小写。
以至于如filename与fileName是不能共存的,已创建一个之后再建另一个则会覆盖或更名;
svn版本库中的文件大小写没要求,当然应该限于svn版本库服务器得是Uinix-like了;

然后想到解决办法(后来证明是有效、可行的):
登录Linux系统上把不要的Lbsxxx文件删除,并svn提交版本库,之后再在Windows下重新check out一份副本即可;

后记:
其实现在想起来,当时发现分支某文件同主干的大小写不一致的时候,最佳方法是:
先svn删除不要的Lbsxxx(如内容还有用价值,拷贝一份放其它地方),提交
之后新建一个新的LBSXXX(如有需要,把备份文件内容再拷过来),增加提交
最后提交新的LBSXXX就ok了。

Tag: