json数据使用
本没打算写这篇,不过今天在班上一哥们误解,说我给的数据格式错误,我当时手头还插有别的急活,就撂一边了,之后我细细看来发现不是我的错。
--我当时就想,咋说也不可能,我直接用的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化数据时丢失数据其实就是双引号造成的!后来在使用中已经解决了。
php header location 使用注意事项
前两天帮同事上线代码,由分支合并到主干时我大致view(这年头嘴里不蹦俩abcd唯恐大家不知道咱学过英格力士)了一些改动,发现有个地方用了header location 的方式来跳转。大致是这样的:
代码零
- //上面巴拉巴拉一堆代码
- if(A == a) header('Location: url');
- //下面巴拉巴拉一堆代码
其实这样写是不“规范“的、易出错的,现总结一下header location语句的使用注意事项:
1、语句前面不允许有多余输出;
2、location与冒号“:"之间不能有空格;
3、语句后面的代码会继续执行,但不输出内容。
下面一一举例释怀阿
代码一语句前面不允许有多余输出
- <html>
- <?php
- //绝对路径或正确的相对路径也行
- $url = 'http://gfeng.org';
- //header前面有多余输出<html>是不行的,甚至空格也不要
- header('Location:'. $url);
- ?>
实际上,不止header location语句前面不能有多余输出,header的其它语句也不能有多余输出
代码二location与冒号“:"之间不能有空格
- <?php
- //此句无效
- header('Location :http://gfeng.org');
- //这个ok
- header('location:http://m.weibo.cn');
- //顺便下了个广告
- ?>
注意事项3就有多个含义可讲了,
代码三header location 后面的输出看不到,即使页面跳转了
- <?php
- $test = 12345678;
- if($test)header('Location: '. $urlA); //此句ok,页面会跳转
- //我们一般地都是echo 、print_r、或var_dump一下,测测看看“实际效果“
- //但这里的输出 在页面中是看不到的
- echo $test;
- ?>
代码四两个或多个header location的话,会执行最后一句header location的
- <?php
- header('Location: '. $urlA); //此句跳转会忽略
- header('Location: '. $urlB); //此句跳转会忽略
- header('Location: '. $urlZ); //最后会跳转$urlZ这个地址
- ?>
代码五header location后面的其它代码会继续有效地执行
- <?php
- //前面可能巴拉巴拉一堆代码
- if($notLogin)header('Location: '. $urlA); //此句ok,页面会跳转
- //如果$notLogin条件为真,程序会继续有效地执行
- //////下面开始记录成功登录的日志数据
- //这样就会造成下面的“错误”执行,而这不决是我们本想要的
对于注意事项1、2我们在写代码时候多注意规范避免就行,而对于事项3的解决方法,其实我们通常会这样做:
在header location语句后面加一个exit或return,尤其是header语句封装在函数里面使用时更不可少
awk中文手册及若干问题
三个在线手册及一个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"} #第三处
这样之后,“>”就成了覆盖写入了:只显示第三处执行文本的前两个字段而不显示前两处的文本。
[转]《sort命令的k选项大讨论》
最近看sort命令,网上有些写法及例子中有些 +1 -2之类的写法,
但按照例子试试,均不奏效
后来在其他地方找到说 这种写法已经很老套了,都已经不支持了
新的写法放在选项k中了……
windows下svn中文件大小写事件
前一段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了。