王石是谁?股民们都知道,房奴们都知道,这次十元门事件之后,网民们、灾民们也都知道了,要是谁还说自己还不知道,大概相当于股民还不知道股市里有只股票叫深万科。
王石是个大富豪,估摸着把那些钱从银行取出来,几栋大别墅都堆不下,看一眼,许多人即使不犯心脏病,可能也会犯高血压。不过,这钱是人家自己挣来的,羡慕也没用,人家想咋花就咋花,哪怕扔进水里听个响儿,或者当厕纸用,那也是人家自己的事儿,别人管不着。至于耗费巨资娶儿媳妇儿,也是人之常情,寻常百姓家娶媳妇,父母不也是经常掏出棺材本、养老钱给小两口买新房、买靓车吗?怎么王石就不行呢?再说,那几百万对王石来说恐怕只相当于寻常家庭的几百块钱吧,这样的父母还不够节俭?至于人家爱攀登世界高峰,那只是个人爱好,和寻常人家打麻将、钓鱼没什么区别,人家花自己的钱,无可厚非,唠叨这些事儿实在没什么意思,说多了人家会认为咱们犯了红眼病!
汶川大地震发生后,王石迅速地捐出了200万善款。有钱出钱,有力出力,全民齐心抗击灾害,钱不在多少,而在于爱心,有人多点,有人少点,都是善举,值得尊敬。捐助不受道德、法律约束,仅仅是爱心、爱国的体现。网友们提出质疑,刚刚在经历房地产暴利时代赚得盆满钵满的超级富豪王石显得有点小家子气,也是心忧灾区的同胞之情的体现,但也仅仅是说说而已,抒发一下郁闷,过些日子自然烟消云散了,总不会有人会跑到万科去要、去抢吧?
可是,一向稳重、睿智、大气度的王总犯了一个低级错误,在博客对此阐述了自己的看法,并提出了令人诧异的所谓“常态”、“十元”、“负担”等几个观点,一石激起千层浪,引发了全国网民的齐声声讨,王总顿时陷入了“困境”,导致其多年精心培育、维护的个人和企业形象大为受损。经常在电视上曝光,在经济界地位崇高的王总大概过于相信自己的口才,同时对网络的力量有些不屑一顾吧,始料未及,竟然发展到如此境地。我想,王总一定是相当地后悔!
如果王总捐助200万之后,针对网民的质疑采取不问不理的态度,或者干脆躲到珠穆朗玛峰上闭关修炼,过些日子自然就风平浪静了。相对于中国地产巨鳄,200万的确有点少,但总比其他一些不捐助的更有社会责任感、更有爱心吧,比上不足,比下还有余呢,网民除了失望还能怎样?
如果王总捐出200万之后,发现网民有意见,不妨赶紧再忍痛拿出个800万,凑齐1000万,我想此事也能立即化解,风平浪静。网民们并不贪心,差不多像个样子就好,也不会想着剜你的肉,只不过在你大腿上拔根毛而已,再说大家也并非为自己,而是为解救受难的同胞,是爱国心、同胞情的体现,想必经常站在高山之颠高瞻远瞩的王总能够体谅吧?
可是向来高瞻远瞩的王总却老马失蹄,盛怒之下方寸大乱,做出了不恰当的解释,终于引火烧身了。几十年一遇的特大地震,死伤惨重,被王总轻描淡写称之为“常态”,你捐助多少是你自己的事情,又凭什么限制员工的爱心捐助不能超过十元呢?这是什么心态?
不要说区区两百万,就是一两千万对万科而言,不过是几套房子而已,又怎么就成了负担了?作为房地产暴利时代的既得利益者,从老百姓身上赚取了那么多违反常理的超额利润,稍微拿出一点无关痛痒的小钱怎么就不行呢?你经常谈到的所谓企业的社会责任感又该怎么体现呢?即便从商业角度而言,平时你花了那么多钱做商业广告,充满战略眼光的您为什么不把握这次树立企业和个人形象的好机会呀,这可是一举两得、一石二鸟、一箭三雕的绝好时机啊!你看,人家王老吉就很机灵,听说凉茶都被热情的网民买脱销了,难道万科不想自己的房子热销吗?王总呀,您老久经沙场,可不该犯这种小迷糊啊!
虽然王总不小心老马失了蹄,但王总毕竟还是王总,生姜还是老的辣,王总是见过大世面的人,大风大浪都走过了,像这种小河沟自然不在话下。你看,王总不是决定拿出一亿参与震后重建工作了?而且还信誓旦旦不从中谋取任何商业利益。虽然迟了点,终究还是拿出了点社会责任感,应该予以褒奖、肯定,革命不分先后嘛!不过,我不清楚,这一个亿会不会增加万科的负担,王总会不会心痛许久呢?还有,会不会在王总心里留下“捐助阴影”呢?
王石是个大富豪,估摸着把那些钱从银行取出来,几栋大别墅都堆不下,看一眼,许多人即使不犯心脏病,可能也会犯高血压。不过,这钱是人家自己挣来的,羡慕也没用,人家想咋花就咋花,哪怕扔进水里听个响儿,或者当厕纸用,那也是人家自己的事儿,别人管不着。至于耗费巨资娶儿媳妇儿,也是人之常情,寻常百姓家娶媳妇,父母不也是经常掏出棺材本、养老钱给小两口买新房、买靓车吗?怎么王石就不行呢?再说,那几百万对王石来说恐怕只相当于寻常家庭的几百块钱吧,这样的父母还不够节俭?至于人家爱攀登世界高峰,那只是个人爱好,和寻常人家打麻将、钓鱼没什么区别,人家花自己的钱,无可厚非,唠叨这些事儿实在没什么意思,说多了人家会认为咱们犯了红眼病!
汶川大地震发生后,王石迅速地捐出了200万善款。有钱出钱,有力出力,全民齐心抗击灾害,钱不在多少,而在于爱心,有人多点,有人少点,都是善举,值得尊敬。捐助不受道德、法律约束,仅仅是爱心、爱国的体现。网友们提出质疑,刚刚在经历房地产暴利时代赚得盆满钵满的超级富豪王石显得有点小家子气,也是心忧灾区的同胞之情的体现,但也仅仅是说说而已,抒发一下郁闷,过些日子自然烟消云散了,总不会有人会跑到万科去要、去抢吧?
可是,一向稳重、睿智、大气度的王总犯了一个低级错误,在博客对此阐述了自己的看法,并提出了令人诧异的所谓“常态”、“十元”、“负担”等几个观点,一石激起千层浪,引发了全国网民的齐声声讨,王总顿时陷入了“困境”,导致其多年精心培育、维护的个人和企业形象大为受损。经常在电视上曝光,在经济界地位崇高的王总大概过于相信自己的口才,同时对网络的力量有些不屑一顾吧,始料未及,竟然发展到如此境地。我想,王总一定是相当地后悔!
如果王总捐助200万之后,针对网民的质疑采取不问不理的态度,或者干脆躲到珠穆朗玛峰上闭关修炼,过些日子自然就风平浪静了。相对于中国地产巨鳄,200万的确有点少,但总比其他一些不捐助的更有社会责任感、更有爱心吧,比上不足,比下还有余呢,网民除了失望还能怎样?
如果王总捐出200万之后,发现网民有意见,不妨赶紧再忍痛拿出个800万,凑齐1000万,我想此事也能立即化解,风平浪静。网民们并不贪心,差不多像个样子就好,也不会想着剜你的肉,只不过在你大腿上拔根毛而已,再说大家也并非为自己,而是为解救受难的同胞,是爱国心、同胞情的体现,想必经常站在高山之颠高瞻远瞩的王总能够体谅吧?
可是向来高瞻远瞩的王总却老马失蹄,盛怒之下方寸大乱,做出了不恰当的解释,终于引火烧身了。几十年一遇的特大地震,死伤惨重,被王总轻描淡写称之为“常态”,你捐助多少是你自己的事情,又凭什么限制员工的爱心捐助不能超过十元呢?这是什么心态?
不要说区区两百万,就是一两千万对万科而言,不过是几套房子而已,又怎么就成了负担了?作为房地产暴利时代的既得利益者,从老百姓身上赚取了那么多违反常理的超额利润,稍微拿出一点无关痛痒的小钱怎么就不行呢?你经常谈到的所谓企业的社会责任感又该怎么体现呢?即便从商业角度而言,平时你花了那么多钱做商业广告,充满战略眼光的您为什么不把握这次树立企业和个人形象的好机会呀,这可是一举两得、一石二鸟、一箭三雕的绝好时机啊!你看,人家王老吉就很机灵,听说凉茶都被热情的网民买脱销了,难道万科不想自己的房子热销吗?王总呀,您老久经沙场,可不该犯这种小迷糊啊!
虽然王总不小心老马失了蹄,但王总毕竟还是王总,生姜还是老的辣,王总是见过大世面的人,大风大浪都走过了,像这种小河沟自然不在话下。你看,王总不是决定拿出一亿参与震后重建工作了?而且还信誓旦旦不从中谋取任何商业利益。虽然迟了点,终究还是拿出了点社会责任感,应该予以褒奖、肯定,革命不分先后嘛!不过,我不清楚,这一个亿会不会增加万科的负担,王总会不会心痛许久呢?还有,会不会在王总心里留下“捐助阴影”呢?
http://hometown.aol.de/_ht_a/memtronic/
download:http://download.microsoft.com/download/7/b/9/7b90644d-1af0-42b9-b76d-a2770319a568/dotnetfx.exe
http://www.x2blog.cn/supNate/UserFiles/X2JSCompactor.rar
blogurl:http://www.x2blog.cn/supnate/?tid=4175
对哦无奈哦:下载
download:http://download.microsoft.com/download/7/b/9/7b90644d-1af0-42b9-b76d-a2770319a568/dotnetfx.exe
http://www.x2blog.cn/supNate/UserFiles/X2JSCompactor.rar
blogurl:http://www.x2blog.cn/supnate/?tid=4175
对哦无奈哦:下载
# 将domain.com/xxx转向www.domain.com/xxx
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,NC]
# 将xxx.domain.com/yyy...重定向到www.domain.com/xxx/yyy..., xxx 5-20位, 字母开头只含字母, 数字以及"-"和"_"
RewriteCond %{SERVER_NAME} ^([a-z][a-z0-9\-\_]{4,19})\.domain\.com [NC]
RewriteRule ^(.+)$ %{SERVER_NAME}$1 [C]
RewriteRule ^([a-z][a-z0-9\-\_]{4,19})\.domain\.com(.*)$ http://www.domain.com/$1$2 [R=301,NC]
# 将首页www.domain.com转向www.domain.com/html/index.html
RewriteCond %{HTTP_HOST} www\.domain\.com
RewriteRule ^/$ http://www.domain.com/html/index.html [R=301,L]
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,NC]
# 将xxx.domain.com/yyy...重定向到www.domain.com/xxx/yyy..., xxx 5-20位, 字母开头只含字母, 数字以及"-"和"_"
RewriteCond %{SERVER_NAME} ^([a-z][a-z0-9\-\_]{4,19})\.domain\.com [NC]
RewriteRule ^(.+)$ %{SERVER_NAME}$1 [C]
RewriteRule ^([a-z][a-z0-9\-\_]{4,19})\.domain\.com(.*)$ http://www.domain.com/$1$2 [R=301,NC]
# 将首页www.domain.com转向www.domain.com/html/index.html
RewriteCond %{HTTP_HOST} www\.domain\.com
RewriteRule ^/$ http://www.domain.com/html/index.html [R=301,L]
工作三年了,各个方面都表现不错,但是职位上一直没有什么变化。眼看跟公司的合同到期了,公司为了留住人才,提拔我作了部门经理,呵呵,真是很高兴。但老板私下里也跟我说,我各个方面都不错,业务、人缘、能力都可以,但是还缺少管理者的气质,还要练练。
这管理者的气质怎么练呢?苦恼了很久;作为新提拔的经理,员工们也都不是很佩服。终于有一天,在酒席上,老板吐了真言,小王,你去买个lenovo的手机用用。老板就是老板!这句点拨,事后证明,绝对可以与当年一位道家达人暗示一位孙姓的猴子三更到后门学艺之事相媲美!
正巧,手机刚丢。于是,直奔国美,790元购得一款lenovo的G620C手机。那么,这个lenovo手机和当管理者有什么联系呢?我深深的陷入了思考,经过清晰的分析,得出以下论断:
1、从价位和品牌看,老板应该不是想让我买了送他,所以肯定不是索贿;
2、当好一个管理者的秘籍,肯定包含在这个手机里。一定要好好体会,成为一名成功的管理者---我暗地下了决心!
功夫不负有心人,刚开始用lenovo手机的第一天,我就发现了一个问题,这手机经常莫名的死机。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之一--不和员工交流!过去刚提拔起来的时候,和大家都很熟悉,交流也很多,所以大家跟我也都很随便;现在我明白了,这是管理者的大忌,于是我学着lenovo手机的样,经常在和下属交流的时候,打断或者是离开(死机),下属们渐渐的对我产生了畏惧,感觉我是一个爱生气的人,刚毕业的美女小刘也不敢只穿吊带来上班了,呵呵,好厉害的招数!看着老板赞许的目光,我知道,我悟到了~~ 但这是远远不够的。
刚开始用lenovo手机的第二天,我就又发现了一个问题,这手机会音量突然变的很小,以至于我早上放在枕边的手机铃声不能叫醒我。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之二--低音量。过去作业务人员的时候,办事干练,嗓门也大;现在我明白了,这是管理者的大忌--显的没城府,于是我学着lenovo手机的样,经常在开会的时候,说话声音越来越小,下属们生怕漏听了哪句话,开会的时候再也不嘻嘻吁吁的了,一个个紧张的不行,树着耳朵大气不敢出一声。刚毕业的美女小刘也总是凑到我身边听我安排工作,呵呵,好管用的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第三天,我就又发现了一个问题,这手机发短信经常发着发着,手机屏幕就只显示半屏。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之三--说话说一半。过去是汇报工作,跟领导说话一定要说清楚;现在向下属安排工作,就不能说的太明白了,这是管理者的大忌,于是我学着lenovo手机的样,经常在安排工作的时候,说到一半不说了,下属们走出我办公室的时候,往往是一脸狐疑,不知道我到底让他们干什么。但是又不敢问,于是干完工作来找我的时候,总是提心吊胆的,生怕我批评他们没领会领导意图!刚毕业的美女小刘总也是急得红着耳朵走出办公室。呵呵,好辛辣的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第四天,我就又发现了一个问题,这手机号称彩屏手机,其实除了桌面是彩色的,其他包括短信、游戏、设置等都是黑白的。操作界面的程序都编的非常可笑,以至于有时候我会以为某段程序是用foxbase编写的。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之四--做表面文章。开始做部门经理的时候,生怕某些工作做的不细,事事都追求完美,而且做完了不向上级汇报,总觉得是自己部门应该做的,这是管理者的大忌。于是我学着lenovo手机的样,在处理部门工作的时候,更多的是向上级老总们宣传做了多少工作,至于工作的效果,也没人细问。挂了羊头卖了狗肉,业绩大了还省了成本,呵呵,好刁钻的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第五天,我就又发现了一个问题,这手机里有一个大家都非常熟悉的游戏--黑白棋,这游戏我在红白机上玩过、在文曲星上玩过,但是还是没想到这老游戏lenovo还是能做出新花样。居然在整个棋盘下满棋局结束的时候,它不会象别的游戏一样跳出一个“you win”或者“you lose”的字样,而是不管胜负就显示“game over”,胜负让你自己去判断。而且虽然是彩屏,但实际连棋盘和“game over”都混在一起黑白显示,不仔细注意你还真看不出显示了一句E文。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之五--别告诉下属结果。开始做部门经理的时候,喜欢让下属知道上级是怎么评价他的工作的,以增强下属的责任心和成就感。其实这是管理者的大忌。于是我学着lenovo手机的样,在下属询问某项工作结果的时候,我故做神秘的应对,让下属们觉得神秘、觉得上级工作不好对付不敢随便交差。呵呵,好古怪的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第六天晚上,我终于不能忍受这古怪的机器了,频繁的死机、半屏,号称彩屏的黑白界面,经常令人哭笑不得的操作设计,内心的烦恼、愤怒差点让我把手机从窗户扔出去。我发誓明天一定要退掉手机。终于,我象杨过悟出黯然销魂掌一样,悟出了人生的真谛――比丢了手机更痛苦的事,就是丢了手机以后买了一款让人想扔的手机!!聪明如我,在气愤之余,悟到了做一名成功的管理者的终极秘籍――秘籍之六--让下属体会人生的真谛,苦上加苦!!正好公司裁员,我们部门必须裁一个,但是我还没决定。员工们人人自危,但是大家都觉得老杨肯定不会被裁掉――老杨的媳妇也刚刚失业,家里很困难。但是,心慈手软是管理者的大忌,于是我学着lenovo手机的样,向员工们宣布,裁掉老杨!!员工们从此以后谁也不敢有意见了,这么绝情的上司,谁敢忍。连刚毕业的美女小刘,和擦肩而过的时候,也有意无意的用胸脯蹭一下我的胳膊!呵呵,好歹毒的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的.
在用lenovo手机的第七天早上,我一早来到国美准备退手机。国美说退可以,但是需要 lenovo的检测中心出具质量不合格的检测报告。靠,这不是欺负人吗?lenovo怎么会说自己的手机不合格。硬着头皮到了检测中心,结果很明显,检测中心告诉我手机没有任何问题!也就是说,退是不可能了!想到我这一生以来最难以煎熬的几天,我誓要把手机卖掉。于是到了商店外,放眼望去,数十个收购旧手机的贩子。随便找了一个一问,手机贩子居然告诉我,这手机他买也就350元(原价790啊!),但是给他200块钱,他就能帮我开出质量不合格的检测报告。果真,他轻而易举的从号称“联想阳光服务”的检测中心里开出了质量不合格的检测报告,我也付了他200元,回到国美退掉了手机。退掉手机的感觉,爽!没有比这再爽的事了。有过退手机经历的人一定有同感。在快感之余,我悟到了做一名成功的管理者的最终极秘籍――秘籍之七(完结篇)--用钱搞定关键人物!!以前怕人说三道四,从来不去老板家,老板的私人情况也不了解。这绝对是管理者的大忌,于是我学着退掉lenovo手机的样,摸清了情况,结识了老板正在上学的儿子,帮他报销了几千块给正在追求的女朋友买衣服的发票。呵呵,女朋友有了新衣服,当然乐了,老板儿子追求得手,当然爽了,老板儿子高兴,老板能不高兴吗?呵呵,好曲折的招数! 看着老板赞许的目光,我知道,我又悟到了~~
掌握了七大秘籍,公司上下刮目相看。部门经理这一工作,我算称职了。但是我自觉和老板比,还有很多差距。听说lenovo收购IBM的笔记本业务了,看来我当上总裁是有希望了~~~
这管理者的气质怎么练呢?苦恼了很久;作为新提拔的经理,员工们也都不是很佩服。终于有一天,在酒席上,老板吐了真言,小王,你去买个lenovo的手机用用。老板就是老板!这句点拨,事后证明,绝对可以与当年一位道家达人暗示一位孙姓的猴子三更到后门学艺之事相媲美!
正巧,手机刚丢。于是,直奔国美,790元购得一款lenovo的G620C手机。那么,这个lenovo手机和当管理者有什么联系呢?我深深的陷入了思考,经过清晰的分析,得出以下论断:
1、从价位和品牌看,老板应该不是想让我买了送他,所以肯定不是索贿;
2、当好一个管理者的秘籍,肯定包含在这个手机里。一定要好好体会,成为一名成功的管理者---我暗地下了决心!
功夫不负有心人,刚开始用lenovo手机的第一天,我就发现了一个问题,这手机经常莫名的死机。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之一--不和员工交流!过去刚提拔起来的时候,和大家都很熟悉,交流也很多,所以大家跟我也都很随便;现在我明白了,这是管理者的大忌,于是我学着lenovo手机的样,经常在和下属交流的时候,打断或者是离开(死机),下属们渐渐的对我产生了畏惧,感觉我是一个爱生气的人,刚毕业的美女小刘也不敢只穿吊带来上班了,呵呵,好厉害的招数!看着老板赞许的目光,我知道,我悟到了~~ 但这是远远不够的。
刚开始用lenovo手机的第二天,我就又发现了一个问题,这手机会音量突然变的很小,以至于我早上放在枕边的手机铃声不能叫醒我。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之二--低音量。过去作业务人员的时候,办事干练,嗓门也大;现在我明白了,这是管理者的大忌--显的没城府,于是我学着lenovo手机的样,经常在开会的时候,说话声音越来越小,下属们生怕漏听了哪句话,开会的时候再也不嘻嘻吁吁的了,一个个紧张的不行,树着耳朵大气不敢出一声。刚毕业的美女小刘也总是凑到我身边听我安排工作,呵呵,好管用的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第三天,我就又发现了一个问题,这手机发短信经常发着发着,手机屏幕就只显示半屏。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之三--说话说一半。过去是汇报工作,跟领导说话一定要说清楚;现在向下属安排工作,就不能说的太明白了,这是管理者的大忌,于是我学着lenovo手机的样,经常在安排工作的时候,说到一半不说了,下属们走出我办公室的时候,往往是一脸狐疑,不知道我到底让他们干什么。但是又不敢问,于是干完工作来找我的时候,总是提心吊胆的,生怕我批评他们没领会领导意图!刚毕业的美女小刘总也是急得红着耳朵走出办公室。呵呵,好辛辣的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第四天,我就又发现了一个问题,这手机号称彩屏手机,其实除了桌面是彩色的,其他包括短信、游戏、设置等都是黑白的。操作界面的程序都编的非常可笑,以至于有时候我会以为某段程序是用foxbase编写的。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之四--做表面文章。开始做部门经理的时候,生怕某些工作做的不细,事事都追求完美,而且做完了不向上级汇报,总觉得是自己部门应该做的,这是管理者的大忌。于是我学着lenovo手机的样,在处理部门工作的时候,更多的是向上级老总们宣传做了多少工作,至于工作的效果,也没人细问。挂了羊头卖了狗肉,业绩大了还省了成本,呵呵,好刁钻的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第五天,我就又发现了一个问题,这手机里有一个大家都非常熟悉的游戏--黑白棋,这游戏我在红白机上玩过、在文曲星上玩过,但是还是没想到这老游戏lenovo还是能做出新花样。居然在整个棋盘下满棋局结束的时候,它不会象别的游戏一样跳出一个“you win”或者“you lose”的字样,而是不管胜负就显示“game over”,胜负让你自己去判断。而且虽然是彩屏,但实际连棋盘和“game over”都混在一起黑白显示,不仔细注意你还真看不出显示了一句E文。开始我还很着急,后来我悟到了,这就是做一名成功的管理者的秘籍之五--别告诉下属结果。开始做部门经理的时候,喜欢让下属知道上级是怎么评价他的工作的,以增强下属的责任心和成就感。其实这是管理者的大忌。于是我学着lenovo手机的样,在下属询问某项工作结果的时候,我故做神秘的应对,让下属们觉得神秘、觉得上级工作不好对付不敢随便交差。呵呵,好古怪的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的。
刚开始用lenovo手机的第六天晚上,我终于不能忍受这古怪的机器了,频繁的死机、半屏,号称彩屏的黑白界面,经常令人哭笑不得的操作设计,内心的烦恼、愤怒差点让我把手机从窗户扔出去。我发誓明天一定要退掉手机。终于,我象杨过悟出黯然销魂掌一样,悟出了人生的真谛――比丢了手机更痛苦的事,就是丢了手机以后买了一款让人想扔的手机!!聪明如我,在气愤之余,悟到了做一名成功的管理者的终极秘籍――秘籍之六--让下属体会人生的真谛,苦上加苦!!正好公司裁员,我们部门必须裁一个,但是我还没决定。员工们人人自危,但是大家都觉得老杨肯定不会被裁掉――老杨的媳妇也刚刚失业,家里很困难。但是,心慈手软是管理者的大忌,于是我学着lenovo手机的样,向员工们宣布,裁掉老杨!!员工们从此以后谁也不敢有意见了,这么绝情的上司,谁敢忍。连刚毕业的美女小刘,和擦肩而过的时候,也有意无意的用胸脯蹭一下我的胳膊!呵呵,好歹毒的招数!看着老板赞许的目光,我知道,我又悟到了~~ 但这还是远远不够的.
在用lenovo手机的第七天早上,我一早来到国美准备退手机。国美说退可以,但是需要 lenovo的检测中心出具质量不合格的检测报告。靠,这不是欺负人吗?lenovo怎么会说自己的手机不合格。硬着头皮到了检测中心,结果很明显,检测中心告诉我手机没有任何问题!也就是说,退是不可能了!想到我这一生以来最难以煎熬的几天,我誓要把手机卖掉。于是到了商店外,放眼望去,数十个收购旧手机的贩子。随便找了一个一问,手机贩子居然告诉我,这手机他买也就350元(原价790啊!),但是给他200块钱,他就能帮我开出质量不合格的检测报告。果真,他轻而易举的从号称“联想阳光服务”的检测中心里开出了质量不合格的检测报告,我也付了他200元,回到国美退掉了手机。退掉手机的感觉,爽!没有比这再爽的事了。有过退手机经历的人一定有同感。在快感之余,我悟到了做一名成功的管理者的最终极秘籍――秘籍之七(完结篇)--用钱搞定关键人物!!以前怕人说三道四,从来不去老板家,老板的私人情况也不了解。这绝对是管理者的大忌,于是我学着退掉lenovo手机的样,摸清了情况,结识了老板正在上学的儿子,帮他报销了几千块给正在追求的女朋友买衣服的发票。呵呵,女朋友有了新衣服,当然乐了,老板儿子追求得手,当然爽了,老板儿子高兴,老板能不高兴吗?呵呵,好曲折的招数! 看着老板赞许的目光,我知道,我又悟到了~~
掌握了七大秘籍,公司上下刮目相看。部门经理这一工作,我算称职了。但是我自觉和老板比,还有很多差距。听说lenovo收购IBM的笔记本业务了,看来我当上总裁是有希望了~~~
function init_space_user_friend_unicode()
{
if(typeof SpaceUserFriend !="undefined")
{
try{
//*
SpaceUserFriend.traceInfo = function (sMSG) {
alert("信息: " + sMSG)
};
//*/
}catch(e){
}
var tmp=SpaceUserFriend.createContent();
//alert(tmp)
document.getElementById("innerDiv").innerHTML=tmp;
SpaceUserFriend.init();
}else
{
setTimeout(function(){
init_space_user_friend_unicode();
},100
)
}
}init_space_user_friend_unicode();
经常会在js里用到数组,比如 多个名字相同的input, 若是动态生成的, 提交时就需要判断其是否是数组.
if(document.mylist.length != "undefined" ) {} 这个用法有误.
正确的是 if( typeof(document.mylist.length) != "undefined" ) {}
或 if( !isNaN(document.mylist.length) ) {}
typeof的运算数未定义,返回的就是 "undefined".
运算数为数字 typeof(x) = "number"
字符串 typeof(x) = "string"
布尔值 typeof(x) = "boolean"
对象,数组和null typeof(x) = "object"
函数 typeof(x) = "function"
typeof 运算符返回一个用来表示表达式的数据类型的字符串。
可能的字符串有:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。
如:
alert(typeof (123));//typeof(123)返回"number"
alert(typeof ("123"));//typeof("123")返回"string"
typeof 运算符
返回一个用来表示表达式的数据类型的字符串。
typeof[()expression[]] ;
expression 参数是需要查找类型信息的任意表达式。
说明
typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."
typeof 语法中的圆括号是可选项。
在很多情况下,需要定期的刷新页面,比如显示股票或者比赛比分的页面(当然现在一般都是通过ajax去定期的从后台取数据,然后更新局部页面),又或者你网站的域名换了以后,当用户打开旧网站的时候重定向到新域名(告诉用户5秒钟后转到另一个页面等等)。
<html>
<head>
<script type="text/javascript">
function delayedRedirect(){
window.location = "http://www.collin.cn"
}
</script>
</head>
<body onLoad="setTimeout('delayedRedirect()', 5000)">
<h2>5秒钟后你将重定向到www.collin.cn!</h2>
</body>
</html>
{
if(typeof SpaceUserFriend !="undefined")
{
try{
//*
SpaceUserFriend.traceInfo = function (sMSG) {
alert("信息: " + sMSG)
};
//*/
}catch(e){
}
var tmp=SpaceUserFriend.createContent();
//alert(tmp)
document.getElementById("innerDiv").innerHTML=tmp;
SpaceUserFriend.init();
}else
{
setTimeout(function(){
init_space_user_friend_unicode();
},100
)
}
}init_space_user_friend_unicode();
经常会在js里用到数组,比如 多个名字相同的input, 若是动态生成的, 提交时就需要判断其是否是数组.
if(document.mylist.length != "undefined" ) {} 这个用法有误.
正确的是 if( typeof(document.mylist.length) != "undefined" ) {}
或 if( !isNaN(document.mylist.length) ) {}
typeof的运算数未定义,返回的就是 "undefined".
运算数为数字 typeof(x) = "number"
字符串 typeof(x) = "string"
布尔值 typeof(x) = "boolean"
对象,数组和null typeof(x) = "object"
函数 typeof(x) = "function"
typeof 运算符返回一个用来表示表达式的数据类型的字符串。
可能的字符串有:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。
如:
alert(typeof (123));//typeof(123)返回"number"
alert(typeof ("123"));//typeof("123")返回"string"
typeof 运算符
返回一个用来表示表达式的数据类型的字符串。
typeof[()expression[]] ;
expression 参数是需要查找类型信息的任意表达式。
说明
typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."
typeof 语法中的圆括号是可选项。
在很多情况下,需要定期的刷新页面,比如显示股票或者比赛比分的页面(当然现在一般都是通过ajax去定期的从后台取数据,然后更新局部页面),又或者你网站的域名换了以后,当用户打开旧网站的时候重定向到新域名(告诉用户5秒钟后转到另一个页面等等)。
<html>
<head>
<script type="text/javascript">
function delayedRedirect(){
window.location = "http://www.collin.cn"
}
</script>
</head>
<body onLoad="setTimeout('delayedRedirect()', 5000)">
<h2>5秒钟后你将重定向到www.collin.cn!</h2>
</body>
</html>
向东 CHINAREN 说:
说实话,我很佩服你,真的,你教会我很多,感激!
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
靠
Wang.Z.B 说:
怎么跟他妈的告别似的
向东 CHINAREN 说:
你丫不是快要走了嘛,一年也快到了吧。。
Wang.Z.B 说:
哈哈
Wang.Z.B 说:
还早呢
Wang.Z.B 说:
我12月才来的
向东 CHINAREN 说:
那提前走啊。。
向东 CHINAREN 说:
我看你学的strus也差不多了吧,干那个去?还是回原来公司?
向东 CHINAREN 说:
有空聊聊,你知道那个播客哥们张宴去哪儿了吗?呵呵
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
不知道啊
向东 CHINAREN 说:
豆瓣
Wang.Z.B 说:
视频啊
向东 CHINAREN 说:
好想去豆瓣了。。。
向东 CHINAREN 说:
豆瓣是搞视频的啊?
Wang.Z.B 说:
好想吃豆瓣了
Wang.Z.B 说:
不是吗
Wang.Z.B 说:
我以为是土豆呢
您发送了一个闪屏振动。
向东 CHINAREN 说:
http://www.douban.com/
向东 CHINAREN 说:
估计应该是这个吧。。
Wang.Z.B 说:
是
向东 CHINAREN 说:
这网站好像不乍的嘛。。。做什么的啊。。?
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
这叫什么商务模式啊
向东 CHINAREN 说:
我也不懂咯。。。呵呵
Wang.Z.B 说:
感觉跟口碑网相似
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
你怎么知道他去了豆瓣
向东 CHINAREN 说:
听播客一个哥们说的。
Wang.Z.B 说:
这样啊
Wang.Z.B 说:
这孙子好像也不上msn
向东 CHINAREN 说:
呵呵,是啊,应该没有用那个号码了。。
Wang.Z.B 说:
就是
Wang.Z.B 说:
把你给抛弃了
向东 CHINAREN 说:
呵呵,我晕,我又不是母的。。。(*^__^*) 嘻嘻……
Wang.Z.B 说:
你好好研究研究播客,到时候给我讲讲,我挺感兴趣的,觉得有前途
Wang.Z.B 说:
以后肯定是视频与语音的天下,mail必死
向东 CHINAREN 说:
呵呵,那你要搞视频和语言,得学习flash server,已经做出来了,可以跨平台的。。
向东 CHINAREN 说:
人无横财不富,搞IT得有风投得有前沿。。。我觉得
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
不光fms,包括架构了,包括如何缓存,如何均衡,以及内容的制作过程,得学点这个
Wang.Z.B 说:
你现在别想一下子吃个胖子,风投哪那么容易拿啊
说实话,我很佩服你,真的,你教会我很多,感激!
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
靠
Wang.Z.B 说:
怎么跟他妈的告别似的
向东 CHINAREN 说:
你丫不是快要走了嘛,一年也快到了吧。。
Wang.Z.B 说:
哈哈
Wang.Z.B 说:
还早呢
Wang.Z.B 说:
我12月才来的
向东 CHINAREN 说:
那提前走啊。。
向东 CHINAREN 说:
我看你学的strus也差不多了吧,干那个去?还是回原来公司?
向东 CHINAREN 说:
有空聊聊,你知道那个播客哥们张宴去哪儿了吗?呵呵
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
不知道啊
向东 CHINAREN 说:
豆瓣
Wang.Z.B 说:
视频啊
向东 CHINAREN 说:
好想去豆瓣了。。。
向东 CHINAREN 说:
豆瓣是搞视频的啊?
Wang.Z.B 说:
好想吃豆瓣了
Wang.Z.B 说:
不是吗
Wang.Z.B 说:
我以为是土豆呢
您发送了一个闪屏振动。
向东 CHINAREN 说:
http://www.douban.com/
向东 CHINAREN 说:
估计应该是这个吧。。
Wang.Z.B 说:
是
向东 CHINAREN 说:
这网站好像不乍的嘛。。。做什么的啊。。?
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
这叫什么商务模式啊
向东 CHINAREN 说:
我也不懂咯。。。呵呵
Wang.Z.B 说:
感觉跟口碑网相似
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
你怎么知道他去了豆瓣
向东 CHINAREN 说:
听播客一个哥们说的。
Wang.Z.B 说:
这样啊
Wang.Z.B 说:
这孙子好像也不上msn
向东 CHINAREN 说:
呵呵,是啊,应该没有用那个号码了。。
Wang.Z.B 说:
就是
Wang.Z.B 说:
把你给抛弃了
向东 CHINAREN 说:
呵呵,我晕,我又不是母的。。。(*^__^*) 嘻嘻……
Wang.Z.B 说:
你好好研究研究播客,到时候给我讲讲,我挺感兴趣的,觉得有前途
Wang.Z.B 说:
以后肯定是视频与语音的天下,mail必死
向东 CHINAREN 说:
呵呵,那你要搞视频和语言,得学习flash server,已经做出来了,可以跨平台的。。
向东 CHINAREN 说:
人无横财不富,搞IT得有风投得有前沿。。。我觉得
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
Wang.Z.B 说:
不光fms,包括架构了,包括如何缓存,如何均衡,以及内容的制作过程,得学点这个
Wang.Z.B 说:
你现在别想一下子吃个胖子,风投哪那么容易拿啊
<html>
<script language="javascript">
function updatedoc()
{
document.writeln("abc<br>");
document.writeln("def<br>");
document.writeln('<script language="javascript">');
document.writeln('function updatedoc()');
document.writeln('{');
document.writeln(' document.writeln("first<br>");');
document.writeln(' document.writeln("second<br>");');
document.writeln('}');
document.writeln('</scr'+'ipt>');
document.writeln('<input type=button name="update" value="更新" onclick="updatedoc()">');
}
</script>
<input type=button name="update" value="更新" onclick="updatedoc()">
</html>
/*这里不能写作</script>,否则系统会报错,其默认与上面的<script language="javascript"> 匹配。所以应当注意^_^*/
URL:http://www.cnblogs.com/happiness/archive/2006/04/18/377880.html
<script language="javascript">
function updatedoc()
{
document.writeln("abc<br>");
document.writeln("def<br>");
document.writeln('<script language="javascript">');
document.writeln('function updatedoc()');
document.writeln('{');
document.writeln(' document.writeln("first<br>");');
document.writeln(' document.writeln("second<br>");');
document.writeln('}');
document.writeln('</scr'+'ipt>');
document.writeln('<input type=button name="update" value="更新" onclick="updatedoc()">');
}
</script>
<input type=button name="update" value="更新" onclick="updatedoc()">
</html>
/*这里不能写作</script>,否则系统会报错,其默认与上面的<script language="javascript"> 匹配。所以应当注意^_^*/
URL:http://www.cnblogs.com/happiness/archive/2006/04/18/377880.html
http://www.picavr.com/news/2008-02/4172.htm
用USB接口的数据采集系统,使用简单方便,无需外接电源,还可以利用PC机强大的运算能力处理数据。这类系统一般都要用单片机做接口控制,对于不会使用单片机的人是个难题。这里介绍一个不用单片机的USB数据采集系统,只要会用VB编程就可以实现。
参考链接:http://www.picavr.com/news/2008-02/4172.htm
一、系统的硬件构成
本系统的电原理如上图,CH371是USB接口芯片,MAX197多路AD转换器做数据采集,电脑对采集的数据进行处理。
CH371是南京沁恒电子出品的一种简单易用的USB接口芯片,它包括芯片本身和计算机端的通用驱动程序。CH371以硬件逻辑实现了USB通信协议传输控制的整个过程,通用驱动程序通过软件向计算机应用层提供设备级接口,因此用户不必考虑USB通信协议、固件程序、驱动程序、底层数据传输过程等,就可以设计出各种USB接口设备。
CH371有多种工作方式,除了数据传输方式外,它还可以工作在一种主控方式,即使没有连结单片机、DSP等控制器,也可以输出控制信号和输入数据。CH371的D7~D0、A3~A0都是双向引脚,它们可以被分为两组,分别设置用于输入或输出。把CH371的A3~A0与MAX197的CS、WR、RD、HBEN四根输入控制线相连,把D7~D0和MAX197的并行数据端口相连,就可以通过软件直接控制MAX197的工作。
MAX197是MAXIM推出的12位AD转换器,单5伏供电,内置4.096伏电压基准,外围电路很简单,仅需外接几只电容就可以工作。MAX197有内外两种时钟和采样模式,模拟输入量程和极性可选,有0~5伏、0~10伏、±5伏、±10伏四种。有8个模拟输入通道。所有这些都可以通过软件来选择,即向MAX197写入一个字节的控制字来实现,控制字的各位功能见下表:
位
PD1
PD0
ACQMOD
RNG
BIP
A2
A1
A0
功能
内外时钟和电源管理模式
内外控制采样模式
模拟信号量程
模拟信号极性
模拟输入通道选择
二、系统的软件设计
1. CH371计算机端的软件接口
CH371在计算机端提供了三个层次的软件接口,最高层是应用层接口。应用层接口是由CH371动态链接库DLL提供的面向功能应用的API函数。每个函数实现一个具体的功能,并用简便易用的API参数代替设备级接口中所要求的数据格式,所有API在调用后都有操作状态返回,用户只要选择特定的API函数就可以实现所需的功能。
CH371动态链接库DLL提供的的API函数包括设备管理、数据传输、中断查询、I2C操作和直接控制等几类,我们这里要用的是两个直接控制函数。
CH371GetStatus(ByVal iIndex As Long, ByVal iStatus As Long,ByRef iDataReg As Long)As Boolean
它的功能是通过CH371直接输入数据和状态,其中iIndex指定CH37设备序号,iStatus指向一个双字单元,用于保存状态数据。Bit7~Bit0对应CH371的D7~D0引脚。IDataReg指向一个双字单元,用于保存数据寄存器的数据。
CH371SetControl(ByVal iIndex As Long, ByVal iCtrData As Byte, ByVal iCtrlAddr As Byte,ByVal iData0e As Boolean, ByVal iAddr0e As Boolean)As Boolean
它的功能是通过CH371直接输出控制信号。ICtrData是准备写入D7~D0数据寄存器的数据, iCtrlAddr是准备写入A3~A0数据寄存器的数据, 它们都必须在输出使能时才可以输出数据。iData0e控制D7~D0输出使能,1输出、0输入。iAddr0e控制A3~A0输出使能,1输出、0输入。
2. VB应用程序
应用程序是用VB编写的,它的核心就是调用上述两个API函数,通过CH371的D7~D0和A3~A0向MAX197写入控制字,启动模数转换,最后读出转换结果。VB要使用CH371动态链接库中的API函数,首先要用Declare语句在全局模块的代码段声明这些函数,CH371芯片厂商在其提供的VB DEMO中,有两个MODULE已经包含了CH371所有的API函数,用户只需要在自己的工程项目中将其加入即可。通过这两个函数调用,向MAX197写入控制字,设定模数转换器的工作方式、选择输入通道、启动模数转换,最后读入转换结果,存入电脑,再做进一步处理
参考链接:http://www.picavr.com/news/2008-02/4172.htm
由于CH371芯片的功能有限,对于新客户建议用下列芯片代替CH371,
新的芯片比CH371功能更多,更易使用,数据传输速度更快,成本更低
1、如果应用电路中有单片机或者DSP等,打算通过USB与计算机通讯,
那么建议用CH372或者CH375或者CH374代替CH371,
因为CH372/CH375/CH374的缓冲区是CH371的8倍,所以传输速度更快,
可达每秒300K甚至800K字节以上,即使是MCS51单片机也能够达到300KB
2、如果应用电路中没有单片机和DSP,只是打算通过CH371直接控制
外部逻辑电路,那么建议用CH341代替CH371,
因为CH341可以提供异步串口、并口以及类似I2C的两线串行接口,
CH341的串口波特率支持从50bps到2000000bps,支持速率控制,
CH341的并口有两种时序,分别是8位仿EPP并口和8位仿MEM并口,
并口的速度可达每秒300K字节,不但速度快而且容易I/O扩展,
CH341的仿I2C接口的时钟约为200KHz,传输速度约为每秒7KB
3、CH372或CH375或CH374必须在单片机或DSP的控制下才能与计算机通讯,
CH375和CH374还能与USB设备(如U盘、USB打印机、USB摄像头)通讯,
CH341可以直接与计算机通讯,不需要单片机或者DSP,可以用于
I/O扩展,I/O控制,简单的AD或者DA,USB转串口、USB转并口等。
4、网站上有用CH375或者CH374或者CH372升级CH371的详细说明,
注意,CH372/CH375/CH374和CH341与CH371的部分引脚不同
5、如果有其它技术问题,请联系技术支持EMAIL:
tech@winchiphead.com
用USB接口的数据采集系统,使用简单方便,无需外接电源,还可以利用PC机强大的运算能力处理数据。这类系统一般都要用单片机做接口控制,对于不会使用单片机的人是个难题。这里介绍一个不用单片机的USB数据采集系统,只要会用VB编程就可以实现。
参考链接:http://www.picavr.com/news/2008-02/4172.htm
一、系统的硬件构成
本系统的电原理如上图,CH371是USB接口芯片,MAX197多路AD转换器做数据采集,电脑对采集的数据进行处理。
CH371是南京沁恒电子出品的一种简单易用的USB接口芯片,它包括芯片本身和计算机端的通用驱动程序。CH371以硬件逻辑实现了USB通信协议传输控制的整个过程,通用驱动程序通过软件向计算机应用层提供设备级接口,因此用户不必考虑USB通信协议、固件程序、驱动程序、底层数据传输过程等,就可以设计出各种USB接口设备。
CH371有多种工作方式,除了数据传输方式外,它还可以工作在一种主控方式,即使没有连结单片机、DSP等控制器,也可以输出控制信号和输入数据。CH371的D7~D0、A3~A0都是双向引脚,它们可以被分为两组,分别设置用于输入或输出。把CH371的A3~A0与MAX197的CS、WR、RD、HBEN四根输入控制线相连,把D7~D0和MAX197的并行数据端口相连,就可以通过软件直接控制MAX197的工作。
MAX197是MAXIM推出的12位AD转换器,单5伏供电,内置4.096伏电压基准,外围电路很简单,仅需外接几只电容就可以工作。MAX197有内外两种时钟和采样模式,模拟输入量程和极性可选,有0~5伏、0~10伏、±5伏、±10伏四种。有8个模拟输入通道。所有这些都可以通过软件来选择,即向MAX197写入一个字节的控制字来实现,控制字的各位功能见下表:
位
PD1
PD0
ACQMOD
RNG
BIP
A2
A1
A0
功能
内外时钟和电源管理模式
内外控制采样模式
模拟信号量程
模拟信号极性
模拟输入通道选择
二、系统的软件设计
1. CH371计算机端的软件接口
CH371在计算机端提供了三个层次的软件接口,最高层是应用层接口。应用层接口是由CH371动态链接库DLL提供的面向功能应用的API函数。每个函数实现一个具体的功能,并用简便易用的API参数代替设备级接口中所要求的数据格式,所有API在调用后都有操作状态返回,用户只要选择特定的API函数就可以实现所需的功能。
CH371动态链接库DLL提供的的API函数包括设备管理、数据传输、中断查询、I2C操作和直接控制等几类,我们这里要用的是两个直接控制函数。
CH371GetStatus(ByVal iIndex As Long, ByVal iStatus As Long,ByRef iDataReg As Long)As Boolean
它的功能是通过CH371直接输入数据和状态,其中iIndex指定CH37设备序号,iStatus指向一个双字单元,用于保存状态数据。Bit7~Bit0对应CH371的D7~D0引脚。IDataReg指向一个双字单元,用于保存数据寄存器的数据。
CH371SetControl(ByVal iIndex As Long, ByVal iCtrData As Byte, ByVal iCtrlAddr As Byte,ByVal iData0e As Boolean, ByVal iAddr0e As Boolean)As Boolean
它的功能是通过CH371直接输出控制信号。ICtrData是准备写入D7~D0数据寄存器的数据, iCtrlAddr是准备写入A3~A0数据寄存器的数据, 它们都必须在输出使能时才可以输出数据。iData0e控制D7~D0输出使能,1输出、0输入。iAddr0e控制A3~A0输出使能,1输出、0输入。
2. VB应用程序
应用程序是用VB编写的,它的核心就是调用上述两个API函数,通过CH371的D7~D0和A3~A0向MAX197写入控制字,启动模数转换,最后读出转换结果。VB要使用CH371动态链接库中的API函数,首先要用Declare语句在全局模块的代码段声明这些函数,CH371芯片厂商在其提供的VB DEMO中,有两个MODULE已经包含了CH371所有的API函数,用户只需要在自己的工程项目中将其加入即可。通过这两个函数调用,向MAX197写入控制字,设定模数转换器的工作方式、选择输入通道、启动模数转换,最后读入转换结果,存入电脑,再做进一步处理
参考链接:http://www.picavr.com/news/2008-02/4172.htm
由于CH371芯片的功能有限,对于新客户建议用下列芯片代替CH371,
新的芯片比CH371功能更多,更易使用,数据传输速度更快,成本更低
1、如果应用电路中有单片机或者DSP等,打算通过USB与计算机通讯,
那么建议用CH372或者CH375或者CH374代替CH371,
因为CH372/CH375/CH374的缓冲区是CH371的8倍,所以传输速度更快,
可达每秒300K甚至800K字节以上,即使是MCS51单片机也能够达到300KB
2、如果应用电路中没有单片机和DSP,只是打算通过CH371直接控制
外部逻辑电路,那么建议用CH341代替CH371,
因为CH341可以提供异步串口、并口以及类似I2C的两线串行接口,
CH341的串口波特率支持从50bps到2000000bps,支持速率控制,
CH341的并口有两种时序,分别是8位仿EPP并口和8位仿MEM并口,
并口的速度可达每秒300K字节,不但速度快而且容易I/O扩展,
CH341的仿I2C接口的时钟约为200KHz,传输速度约为每秒7KB
3、CH372或CH375或CH374必须在单片机或DSP的控制下才能与计算机通讯,
CH375和CH374还能与USB设备(如U盘、USB打印机、USB摄像头)通讯,
CH341可以直接与计算机通讯,不需要单片机或者DSP,可以用于
I/O扩展,I/O控制,简单的AD或者DA,USB转串口、USB转并口等。
4、网站上有用CH375或者CH374或者CH372升级CH371的详细说明,
注意,CH372/CH375/CH374和CH341与CH371的部分引脚不同
5、如果有其它技术问题,请联系技术支持EMAIL:
tech@winchiphead.com
用PHP的ob_start();控制您的浏览器cache!
Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。
我们先举一个简单的例子,让大家对Output Control有一个大致的印象:
Example 1.
所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用 flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
一、 相关函数简介:
1、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()
二、深入了解:
1. 关于Flush函数:
这个函数在PHP3中就出现了,是一个效率很高的函数,他有一个非常有用的功能就是刷新browser的cache.我们举一个运行效果非常明显的例子来说明flush.
Example 2.
CODE<?php
for($i = 1; $i <= 300; $i++ ) print(" ");
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出
// 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经
// 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会
// 源源不断的被发送出去。
For($j = 1; $j <= 20; $j++) {
echo $j."
";
flush(); //这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚
}
?>
具体效果你可以到这里看看http://www.php2000.com/~uchinaboy/out.php
PHP2000的最新的PHP聊天室就是用的这个技术,可惜的是源代码未公开 L
注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是:提高效率!
2. 关于ob系列函数:
我想先引用我的好朋友y10k的一个例子:
Example 3.
比如你用得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:
CODE<?php
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\'info.txt\',\'w\'); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>
用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些"过程"转化为"函数"的方法!
或许有人会问:"难道就这个样子吗?还有没有其他用途?"当然有了,比如笔者论坛的PHP 语法加亮显示就和这个有关(PHP默认的语法加亮显示函数会直接输出,不能保存结果,如果在每次调用都显示恐怕会很浪费CPU,笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了),大家如果感兴趣的话可以来看看http://www.zphp.com/bbs/!
可能现在大家对ob_start()的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌握了使用ob_start()的要点。
<1>.使用ob_start打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出。
< 2>.现在的你应该知道你所拥有的优势:可以在任何输出内容后面使用header,setcookie以及session,这是ob_start一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(\"ob_gzhandler\ ");而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理……
<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。
来,让我们看看能用ob系列函数做些什么……
一、 静态模版技术
简介:所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。
我所知道的实现静态输出的有两种办法:
<1>.通过y10k修改的phplib的一个叫template.inc.php类实现。
<2>.使用ob系列函数实现。
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。
我们现在来看一看第二种方法的具体实现:
Example 4.
CODE<?php
ob_start();//打开缓冲区
?>
php页面的全部输出
<?
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入
fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……
fclose($fp);
?>
这样,所谓的静态模版就很容易的被实现了……
二、 捕捉输出
以上的Example 4.是一种最简单的情况,你还可以在写入前对$content进行操作……
你可以设法捕捉一些关键字,然后去对它进行再处理,比如Example 3.所述的PHP语法高亮显示。个人认为,这个功能是此函数最大的精华所在,它可以解决各种各样的问题,但需要你有足够的想象力……
Example 5.
CODE<?
Function run_code($code) {
If($code) {
ob_start();
eval($code);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo "错误!没有输出";
exit();
}
return $contents;
}
以上这个例子的用途不是很大,不过很典型$code的本身就是一个含有变量的输出页面,而这个例子用eval把$code中的变量替换,然后对输出结果再进行输出捕捉,再一次的进行处理……
Example 6. 加快传输
CODE<?
/*
** Title.........: PHP4 HTTP Compression Speeds up the Web
** Version.......: 1.20
** Author........: catoc <catoc@163.net>
** Filename......: gzdoc.php
** Last changed..: 18/10/2000
** Requirments...: PHP4 >= 4.0.1
** PHP was configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content Acceleration compresses
** the data transmission data on the fly
** code by sun jin hu (catoc) <catoc@163.net>
** Most newer browsers since 1998/1999 have
** been equipped to support the HTTP 1.1
** standard known as \"content-encoding.\"
** Essentially the browser indicates to the
** server that it can accept \"content encoding\"
** and if the server is capable it will then
** compress the data and transmit it. The
** browser decompresses it and then renders
** the page.
**
** Modified by John Lim (jlim@natsoft.com.my)
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first \'<?\' tag.
** ------------Start of file----------
** |<?
** | include(\'gzdoc.php\');
** |? >
** |<HTML>
** |... the page ...
** |</HTML>
** |<?
** | gzdocout();
** |? >
** -------------End of file-----------
*/
ob_start();
ob_implicit_flush(0);
function CheckCanGzip(){
global $HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, \'x-gzip\') !== false) return \"x-gzip\";
if (strpos($HTTP_ACCEPT_ENCODING,\'gzip\') !== false) return \"gzip\";
return 0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print \"n<!-- Use compress $ENCODING -->n\";
$Contents = ob_get_contents();
ob_end_clean();
if ($debug){
$s = \"<p>Not compress length: \".strlen($Contents);
$s .= \"
Compressed length: \".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header(\"Content-Encoding: $ENCODING\");
print \"x1fx8bx08x00x00x00x00x00\";
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print pack(\'V\',$Crc);
print pack(\'V\',$Size);
exit;
}else{
ob_end_flush();
exit;
}
}
?>
这是catoc的一段很早以前的代码,是在weblogs.com看到的,他利用了zlib的函数,对传输的内容进行了压缩,测试表明,对于10k以上的页面,会产生效果,而且页面越大,效果越明显…
Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。
我们先举一个简单的例子,让大家对Output Control有一个大致的印象:
Example 1.
所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用 flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
一、 相关函数简介:
1、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()
二、深入了解:
1. 关于Flush函数:
这个函数在PHP3中就出现了,是一个效率很高的函数,他有一个非常有用的功能就是刷新browser的cache.我们举一个运行效果非常明显的例子来说明flush.
Example 2.
CODE<?php
for($i = 1; $i <= 300; $i++ ) print(" ");
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出
// 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经
// 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会
// 源源不断的被发送出去。
For($j = 1; $j <= 20; $j++) {
echo $j."
";
flush(); //这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚
}
?>
具体效果你可以到这里看看http://www.php2000.com/~uchinaboy/out.php
PHP2000的最新的PHP聊天室就是用的这个技术,可惜的是源代码未公开 L
注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是:提高效率!
2. 关于ob系列函数:
我想先引用我的好朋友y10k的一个例子:
Example 3.
比如你用得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:
CODE<?php
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\'info.txt\',\'w\'); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>
用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些"过程"转化为"函数"的方法!
或许有人会问:"难道就这个样子吗?还有没有其他用途?"当然有了,比如笔者论坛的PHP 语法加亮显示就和这个有关(PHP默认的语法加亮显示函数会直接输出,不能保存结果,如果在每次调用都显示恐怕会很浪费CPU,笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了),大家如果感兴趣的话可以来看看http://www.zphp.com/bbs/!
可能现在大家对ob_start()的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌握了使用ob_start()的要点。
<1>.使用ob_start打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出。
< 2>.现在的你应该知道你所拥有的优势:可以在任何输出内容后面使用header,setcookie以及session,这是ob_start一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(\"ob_gzhandler\ ");而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理……
<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。
来,让我们看看能用ob系列函数做些什么……
一、 静态模版技术
简介:所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。
我所知道的实现静态输出的有两种办法:
<1>.通过y10k修改的phplib的一个叫template.inc.php类实现。
<2>.使用ob系列函数实现。
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。
我们现在来看一看第二种方法的具体实现:
Example 4.
CODE<?php
ob_start();//打开缓冲区
?>
php页面的全部输出
<?
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入
fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……
fclose($fp);
?>
这样,所谓的静态模版就很容易的被实现了……
二、 捕捉输出
以上的Example 4.是一种最简单的情况,你还可以在写入前对$content进行操作……
你可以设法捕捉一些关键字,然后去对它进行再处理,比如Example 3.所述的PHP语法高亮显示。个人认为,这个功能是此函数最大的精华所在,它可以解决各种各样的问题,但需要你有足够的想象力……
Example 5.
CODE<?
Function run_code($code) {
If($code) {
ob_start();
eval($code);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo "错误!没有输出";
exit();
}
return $contents;
}
以上这个例子的用途不是很大,不过很典型$code的本身就是一个含有变量的输出页面,而这个例子用eval把$code中的变量替换,然后对输出结果再进行输出捕捉,再一次的进行处理……
Example 6. 加快传输
CODE<?
/*
** Title.........: PHP4 HTTP Compression Speeds up the Web
** Version.......: 1.20
** Author........: catoc <catoc@163.net>
** Filename......: gzdoc.php
** Last changed..: 18/10/2000
** Requirments...: PHP4 >= 4.0.1
** PHP was configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content Acceleration compresses
** the data transmission data on the fly
** code by sun jin hu (catoc) <catoc@163.net>
** Most newer browsers since 1998/1999 have
** been equipped to support the HTTP 1.1
** standard known as \"content-encoding.\"
** Essentially the browser indicates to the
** server that it can accept \"content encoding\"
** and if the server is capable it will then
** compress the data and transmit it. The
** browser decompresses it and then renders
** the page.
**
** Modified by John Lim (jlim@natsoft.com.my)
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first \'<?\' tag.
** ------------Start of file----------
** |<?
** | include(\'gzdoc.php\');
** |? >
** |<HTML>
** |... the page ...
** |</HTML>
** |<?
** | gzdocout();
** |? >
** -------------End of file-----------
*/
ob_start();
ob_implicit_flush(0);
function CheckCanGzip(){
global $HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, \'x-gzip\') !== false) return \"x-gzip\";
if (strpos($HTTP_ACCEPT_ENCODING,\'gzip\') !== false) return \"gzip\";
return 0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print \"n<!-- Use compress $ENCODING -->n\";
$Contents = ob_get_contents();
ob_end_clean();
if ($debug){
$s = \"<p>Not compress length: \".strlen($Contents);
$s .= \"
Compressed length: \".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header(\"Content-Encoding: $ENCODING\");
print \"x1fx8bx08x00x00x00x00x00\";
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print pack(\'V\',$Crc);
print pack(\'V\',$Size);
exit;
}else{
ob_end_flush();
exit;
}
}
?>
这是catoc的一段很早以前的代码,是在weblogs.com看到的,他利用了zlib的函数,对传输的内容进行了压缩,测试表明,对于10k以上的页面,会产生效果,而且页面越大,效果越明显…
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
$start = $offset * ($page-1);
$limit = $start.','.$offset;
$sql = 'SELECT * FROM record '.$where.' ORDER BY ctime DESC LIMIT '.$limit;
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
$start = $offset * ($page-1);
$limit = $start.','.$offset;
$sql = 'SELECT * FROM record '.$where.' ORDER BY ctime DESC LIMIT '.$limit;
大 多数人都知道爱迪生有句名言:天才是99%的汗水加上1%的灵感。今天在网上看到一篇文章,有人在文章的回复部分提到,爱迪生这句名言本身不是这样,是教 科书断章取义,爱迪生的原话因该是:天才是1%的灵感加上99%的汗水,但1%的灵感最重要,甚至比99%的汗水都重要。
很显然,如果加上后面的话,两种名言的版本表达的是完全不同的立场,但到底是不是这样呢?
随即到Google中查了一下,这篇文章:《中国教材:为什么要篡改爱迪生和爱因斯坦的名言?》可能是后一种名言版本的导火索,论证很充分,似乎是真的?但在这篇文章的评论处,有人以事实推翻了论证:
链接2: http://www.ortolon.com/articles_sterling_inspiration.htm
一开头便是这么写的:
“Inspiration and Perspiration
By Cindi Myers
Thomas Edison said, “Genius is one percent inspiration and ninety-nine percent perspiration.”
Without the one percent of inspiration, all the perspiration in the world is only a bucket of sweat….”
这后一段话翻译过来,跟原文所讲的那段加长版的名言非常贴切,想必应是原文理论之根据了。然而谁都不可能忽略的是:“没有1%的灵感,所有的汗水……”这句话并不在爱迪生名言的引号之内!
注意上面的标题
Inspiration and Perspiration
By Cindi Myers
已明确指出此文是Cindi Myers所写的一篇议论文。所以引号外的话不过是Cindi Myers的一句评价罢了。可惜口牙。
我想至此,考究结束,出处应该就是这里了。原文作者一开始便站在了错误的论据上。
不过,在我看来,论点却是好的……
该评论的作者摆出了事实,英文原句是否如他所说呢?随即到Google中搜索:Genius is one percent inspiration and ninety-nine percent perspiration,在出现的英文搜索结果中,几乎就是这句原话,没有所谓的“但1%的灵感最重要,甚至比99%的汗水都重要”的意思, 呵呵~~,在此可以确信,持第二种名言版本观点的人原来也有点断章取义了,教科书并没有更改爱迪生的名言。
说实话,当我看到第二种版本的时候,我有点信了,如果没有后面的确认,我可能还会给别人讲之前的爱迪生名言是错的,应该是什么什么等等。所以, 网上的信息应该有选择性地来吸收,不能见风是风,见雨是雨,即使是非常有“正义感”、感觉非常“权威”的那种,否则的话,只能是以讹传讹!
很显然,如果加上后面的话,两种名言的版本表达的是完全不同的立场,但到底是不是这样呢?
随即到Google中查了一下,这篇文章:《中国教材:为什么要篡改爱迪生和爱因斯坦的名言?》可能是后一种名言版本的导火索,论证很充分,似乎是真的?但在这篇文章的评论处,有人以事实推翻了论证:
链接2: http://www.ortolon.com/articles_sterling_inspiration.htm
一开头便是这么写的:
“Inspiration and Perspiration
By Cindi Myers
Thomas Edison said, “Genius is one percent inspiration and ninety-nine percent perspiration.”
Without the one percent of inspiration, all the perspiration in the world is only a bucket of sweat….”
这后一段话翻译过来,跟原文所讲的那段加长版的名言非常贴切,想必应是原文理论之根据了。然而谁都不可能忽略的是:“没有1%的灵感,所有的汗水……”这句话并不在爱迪生名言的引号之内!
注意上面的标题
Inspiration and Perspiration
By Cindi Myers
已明确指出此文是Cindi Myers所写的一篇议论文。所以引号外的话不过是Cindi Myers的一句评价罢了。可惜口牙。
我想至此,考究结束,出处应该就是这里了。原文作者一开始便站在了错误的论据上。
不过,在我看来,论点却是好的……
该评论的作者摆出了事实,英文原句是否如他所说呢?随即到Google中搜索:Genius is one percent inspiration and ninety-nine percent perspiration,在出现的英文搜索结果中,几乎就是这句原话,没有所谓的“但1%的灵感最重要,甚至比99%的汗水都重要”的意思, 呵呵~~,在此可以确信,持第二种名言版本观点的人原来也有点断章取义了,教科书并没有更改爱迪生的名言。
说实话,当我看到第二种版本的时候,我有点信了,如果没有后面的确认,我可能还会给别人讲之前的爱迪生名言是错的,应该是什么什么等等。所以, 网上的信息应该有选择性地来吸收,不能见风是风,见雨是雨,即使是非常有“正义感”、感觉非常“权威”的那种,否则的话,只能是以讹传讹!
这个版本改进了不少地方,例如对ZF的良好支持。官方目前只提供法语、德语、意大利语三个语言包的下载,中文的还没有看到,再期待一下吧!
下载地址如下:
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudioForEclipse-6_0_1.exe (for windows)
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudioForEclipse-6_0_1.tar.gz (for linux)
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudioForEclipse-6.0.1.dmg (for mac,不好意思,一直不知道这个是MAC下的安装程序)
之前的注册机还可以继续使用,本人已测,呵呵~
KeyGen:http://www.niuc.net/attachment.php?fid=203
用户名:Faceker.com
注册码:02251FE3126660400000
用户名:PHPER
注册码:4784D9D0086669570000
可以到 Zend 官方网站下载 Zend Studio For Eclipse:[url=http://downloads.zend.com/studio-eclipse/6.0.0/ZendStudioForEclipse-6_0_0.zip]直接下载地址[/url]
我一直在寻找一个理想的 PHP 开发环境。之前一直用 Dreamweaver,但他只是一个完美的代码和 HTML 编辑器,在 PHP 开发方面,他连基本的自定义函数的参数都无法提示;有人推荐 EditPlus,不过他也只是个编辑器,离“开发环境”还差得远;再者就是 Zend Studio,他是公认的很好很强大的 PHP 开发环境,不过看到他那丑陋的界面,我就知道那不是我想要的。
后来知道了有个 PDT,基于 Eclipse 的 PHP 开发环境,用了一下,着实不错,界面也很美观,基本的 PHP 开发功能也够用,下定决心,从此就用他来搞 PHP 了。
过年期间,看到一条新闻,新版的 Zend Studio 发布了,该版本是基于 Eclipse 的开发环境,是在 PDT 的基础之上开发的,迫不及待地下载安装试用,WOW,一切都是那么的完美,毫无疑问,Zend Studio For Eclipse 将是以后 PHP 开发的不二选择了!
下载地址如下:
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudioForEclipse-6_0_1.exe (for windows)
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudioForEclipse-6_0_1.tar.gz (for linux)
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudioForEclipse-6.0.1.dmg (for mac,不好意思,一直不知道这个是MAC下的安装程序)
之前的注册机还可以继续使用,本人已测,呵呵~
KeyGen:http://www.niuc.net/attachment.php?fid=203
用户名:Faceker.com
注册码:02251FE3126660400000
用户名:PHPER
注册码:4784D9D0086669570000
可以到 Zend 官方网站下载 Zend Studio For Eclipse:[url=http://downloads.zend.com/studio-eclipse/6.0.0/ZendStudioForEclipse-6_0_0.zip]直接下载地址[/url]
我一直在寻找一个理想的 PHP 开发环境。之前一直用 Dreamweaver,但他只是一个完美的代码和 HTML 编辑器,在 PHP 开发方面,他连基本的自定义函数的参数都无法提示;有人推荐 EditPlus,不过他也只是个编辑器,离“开发环境”还差得远;再者就是 Zend Studio,他是公认的很好很强大的 PHP 开发环境,不过看到他那丑陋的界面,我就知道那不是我想要的。
后来知道了有个 PDT,基于 Eclipse 的 PHP 开发环境,用了一下,着实不错,界面也很美观,基本的 PHP 开发功能也够用,下定决心,从此就用他来搞 PHP 了。
过年期间,看到一条新闻,新版的 Zend Studio 发布了,该版本是基于 Eclipse 的开发环境,是在 PDT 的基础之上开发的,迫不及待地下载安装试用,WOW,一切都是那么的完美,毫无疑问,Zend Studio For Eclipse 将是以后 PHP 开发的不二选择了!
server.php:(UTF8编码)
<?php
// server
// 设置错误处理
error_reporting (e_all);
// 设置运行时间
set_time_limit (0);
// 起用缓冲
ob_implicit_flush ();
$ip = "127.0.0.1"; // ip地址
$port = 8848; // 端口号
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个socket
if ($socket)
echo "socket_create() successed!\n";
else {
echo "socket_create() failed:".socket_strerror ($socket)."\n";
exit(0);
}
$bind = socket_bind ($socket, $ip, $port); // 绑定一个socket
if ($bind) {
echo "socket_bind() successed!\n";
}else{
echo "socket_bind() failed:".socket_strerror ($bind)."\n";
return 0;
}
$listen = socket_listen ($socket); // 间听socket
if ($listen)
echo "socket_listen() successed!\n";
else
echo "socket_listen() failed:".socket_strerror ($listen)."\n";
while (true)
{
$msg = socket_accept ($socket); // 接受一个socket
if (!$msg)
{
echo "socket_accept() failed:".socket_strerror ($msg)."\n";
break;
}
$welcome0 = "welcome to php server!向东\n";
$welcome = iconv("utf-8","gbk",$welcome0);//显示gb的中文,否则在windows cmd 终端显示乱码
socket_write ($msg, $welcome, strlen ($welcome));
while (true)
{
$command = strtoupper (trim (socket_read ($msg, 1024)));
if (!$command)
break;
echo $command."\n";
switch ($command)
{
case "HELLO":
$writer = "hello everybody!";
break;
case "BYE":
$writer = "bye-bye";
break;
case "HELP":
$writer = "hello\tquit\thelp";
break;
default:
$writer = "error command!\n";
}
socket_write ($msg, $writer, strlen ($writer));
if ($command == "QUIT")
break;
}
socket_close ($msg);
}
socket_close ($socket); // 关闭socket
?>
client.php(UTF8编码)
<?php
// Client
// 设置错误处理
error_reporting (E_ALL);
// 设置处理时间
set_time_limit (0);
$ip = "127.0.0.1"; // IP 地址
$port = 8848; // 端口号
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET
if ($socket)
echo "socket_create() successed!/n";
else
echo "socket_create() failed:".socket_strerror ($socket)."/n";
$conn = socket_connect ($socket, $ip, $port); // 建立SOCKET的连接
if ($conn)
echo "Success to connection![".$ip.":".$port."]/n";
else
echo "socket_connect() failed:".socket_strerror ($conn)."/n";
echo socket_read ($socket, 1024);
$stdin = fopen ('php://stdin', 'r');
while (true)
{
$command = trim (fgets ($stdin, 1024));
socket_write ($socket, $command, strlen ($command));
$msg = trim (socket_read ($socket, 1024));
echo $msg."\n";
if ($msg == "Bye-Bye")
break;
}
fclose ($stdin);
socket_close ($socket);
?>
<?php
// server
// 设置错误处理
error_reporting (e_all);
// 设置运行时间
set_time_limit (0);
// 起用缓冲
ob_implicit_flush ();
$ip = "127.0.0.1"; // ip地址
$port = 8848; // 端口号
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个socket
if ($socket)
echo "socket_create() successed!\n";
else {
echo "socket_create() failed:".socket_strerror ($socket)."\n";
exit(0);
}
$bind = socket_bind ($socket, $ip, $port); // 绑定一个socket
if ($bind) {
echo "socket_bind() successed!\n";
}else{
echo "socket_bind() failed:".socket_strerror ($bind)."\n";
return 0;
}
$listen = socket_listen ($socket); // 间听socket
if ($listen)
echo "socket_listen() successed!\n";
else
echo "socket_listen() failed:".socket_strerror ($listen)."\n";
while (true)
{
$msg = socket_accept ($socket); // 接受一个socket
if (!$msg)
{
echo "socket_accept() failed:".socket_strerror ($msg)."\n";
break;
}
$welcome0 = "welcome to php server!向东\n";
$welcome = iconv("utf-8","gbk",$welcome0);//显示gb的中文,否则在windows cmd 终端显示乱码
socket_write ($msg, $welcome, strlen ($welcome));
while (true)
{
$command = strtoupper (trim (socket_read ($msg, 1024)));
if (!$command)
break;
echo $command."\n";
switch ($command)
{
case "HELLO":
$writer = "hello everybody!";
break;
case "BYE":
$writer = "bye-bye";
break;
case "HELP":
$writer = "hello\tquit\thelp";
break;
default:
$writer = "error command!\n";
}
socket_write ($msg, $writer, strlen ($writer));
if ($command == "QUIT")
break;
}
socket_close ($msg);
}
socket_close ($socket); // 关闭socket
?>
client.php(UTF8编码)
<?php
// Client
// 设置错误处理
error_reporting (E_ALL);
// 设置处理时间
set_time_limit (0);
$ip = "127.0.0.1"; // IP 地址
$port = 8848; // 端口号
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET
if ($socket)
echo "socket_create() successed!/n";
else
echo "socket_create() failed:".socket_strerror ($socket)."/n";
$conn = socket_connect ($socket, $ip, $port); // 建立SOCKET的连接
if ($conn)
echo "Success to connection![".$ip.":".$port."]/n";
else
echo "socket_connect() failed:".socket_strerror ($conn)."/n";
echo socket_read ($socket, 1024);
$stdin = fopen ('php://stdin', 'r');
while (true)
{
$command = trim (fgets ($stdin, 1024));
socket_write ($socket, $command, strlen ($command));
$msg = trim (socket_read ($socket, 1024));
echo $msg."\n";
if ($msg == "Bye-Bye")
break;
}
fclose ($stdin);
socket_close ($socket);
?>
1、 没有钱,没有权,再不对你好点,你能跟我?
2、 买了电脑不上宽带,就好比酒肉都准备好了却在吃饭前当了和尚。
3、天上掉钞票我不会弯腰,因为天上连馅饼都不会掉,更别说掉钞票了。
4、 你给我买10条烟总比我去一次夜总会划算吧。
5、要我扫地就绝对不刷碗,要我刷碗就绝对不扫地,两样一起做?你当我是外星人啊!
6、 躺在床上看电视不如在看电视时上床睡觉。
7、给我一个支点,我把邻居那小子的汽车翘到沟里去,省得他见我就按喇叭。
8、参加选美的那些女人,都找不到好男人,因为好男人都结婚了,比如我。
9、如果领导下个月再不给我加薪,我就辞职,辞职前再给他送两条中华,抽死他。
10、 如果猪都会飞了,谁还买飞机?骑着猪上天不就行了。
11、 我的领带又找不到了,是不是你昨天又没有找到抹布?
12、 在埃及,一个男人可以娶四个老婆,那得多累啊,还是中国好。
13、 你还是让我跪搓板吧,跪电暖气实在受不了啊!
14、 我就算是一只癞蛤蟆,我也决不娶母癞蛤蟆。
15、 喝白酒一斤,我绝对没感觉,因为喝半斤就已经喝死了。
16、上厕所看报纸等同于大便完了擦屁股,是一个流程,否则不叫完工。
17、儿子不听话可以适当的打打,要不就显不出老子的威严,台-湾问题就是如此。
18、我妈过生日,送脑白金还不如送两块大梁骨煮煮吃,至少还能当下酒菜。
19、 我才不去见网友,除非国家修改一夫一妻制。
20、 下辈子我还找你,因为除了我,你是最傻的
2、 买了电脑不上宽带,就好比酒肉都准备好了却在吃饭前当了和尚。
3、天上掉钞票我不会弯腰,因为天上连馅饼都不会掉,更别说掉钞票了。
4、 你给我买10条烟总比我去一次夜总会划算吧。
5、要我扫地就绝对不刷碗,要我刷碗就绝对不扫地,两样一起做?你当我是外星人啊!
6、 躺在床上看电视不如在看电视时上床睡觉。
7、给我一个支点,我把邻居那小子的汽车翘到沟里去,省得他见我就按喇叭。
8、参加选美的那些女人,都找不到好男人,因为好男人都结婚了,比如我。
9、如果领导下个月再不给我加薪,我就辞职,辞职前再给他送两条中华,抽死他。
10、 如果猪都会飞了,谁还买飞机?骑着猪上天不就行了。
11、 我的领带又找不到了,是不是你昨天又没有找到抹布?
12、 在埃及,一个男人可以娶四个老婆,那得多累啊,还是中国好。
13、 你还是让我跪搓板吧,跪电暖气实在受不了啊!
14、 我就算是一只癞蛤蟆,我也决不娶母癞蛤蟆。
15、 喝白酒一斤,我绝对没感觉,因为喝半斤就已经喝死了。
16、上厕所看报纸等同于大便完了擦屁股,是一个流程,否则不叫完工。
17、儿子不听话可以适当的打打,要不就显不出老子的威严,台-湾问题就是如此。
18、我妈过生日,送脑白金还不如送两块大梁骨煮煮吃,至少还能当下酒菜。
19、 我才不去见网友,除非国家修改一夫一妻制。
20、 下辈子我还找你,因为除了我,你是最傻的
[实践OK]PHP mail 模拟socket下的smtp mail类调试成功发邮件信socket 方式,其就是相当于命令行...
Php/Js/Shell/Go jackxiang 2008-5-29 16:09
1.由于50上的qmail不需要验证就可以发信,有了验证反而出现错误,最后在133那台机器就可以了,auth login afeng133@afeng133.sina.net 123qwe(Base64),然后给126(xxx108@126.com)发了信可以收到,不错不错,以下文件存为utf8 格式:
如果有获取whoami之类的,修改配置文件 php.ini 把exec的执行权限放开!
smtp.class.php:
<?php
set_time_limit(120);
class smtp_mail
{
var $host=""; //主机
var $port="25"; //端口 一般为25
var $user=""; //SMTP认证的帐号
var $pass=""; //认证密码
var $debug = false; //是否显示和服务器会话信息?
var $conn;
var $socket="";
var $result_str; //结果
var $in; //客户机发送的命令
var $from_r; //真实的源信箱,一般与smtp服务器的用户名一样,否则可能由于smtp服务器的设置而发送不成功
var $mailformat=0; //邮件格式 0=普通文本 1=html邮件
function smtp_mail($host,$port,$user,$pass,$debug=false)
{
$this->host = $host;
$this->port = $port;
$this->user = base64_encode($user);
$this->pass = base64_encode($pass);
$this->debug = $debug;
$this->socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); //具体用法请参考手册
if($this->socket)
{
//$this->result_str = "创建SOCKET:".socket_strerror(socket_last_error());
$this->result_str = "创建SOCKET:".iconv("GBK","UTF-8//TRANSLIT//IGNORE", socket_strerror(socket_last_error()));
$this->debug_show($this->result_str);
}
else
{
exit("初始化失败,请检查您的网络连接和参数");
}
$this->conn = socket_connect($this->socket,$this->host,$this->port);
if($this->conn)
{
$this->result_str = "创建SOCKET连接:".iconv("GBK","UTF-8//TRANSLIT//IGNORE",socket_strerror(socket_last_error()));
$this->debug_show($this->result_str);
}
else
{
exit("初始化失败,请检查您的网络连接和参数");
}
$this->result_str = "服务器应答:<font color=#cc0000>".socket_read ($this->socket, 1024)."</font>";
$this->debug_show($this->result_str);
}
function debug_show($str)
{
if($this->debug)
{
echo $str."<p>\r\n";
}
}
function send($from,$to,$subject,$body)
{
if($from == "" || $to == "")
{
exit("请输入信箱地址");
}
if($subject == "") $sebject = "无标题";
if($body == "") $body = "无内容";
$All = "From:".$from."\r\n";
$All .= "To:".$to."\r\n";
$All .= "Subject:".$subject."\r\n";
if($this->mailformat==1) $All.= "Content-Type: text/html;\r\n";
else $All .= "Content-Type: text/plain;\r\n";
$All .= "charset=gb2312\r\n\r\n";
$All .= $body;
/*
如果把$All的内容再加处理,就可以实现发送MIME邮件了
不过还需要加很多程序
*/
//以下是和服务器会话
$this->in = "EHLO HELO\r\n";
$this->docommand();
$this->in = "AUTH LOGIN\r\n";
$this->docommand();
$this->in = $this->user."\r\n";
$this->docommand();
$this->in = $this->pass."\r\n";
$this->docommand();
if(!eregi("235",$this->result_str)){
$this->result_str = "smtp 认证失败";
$this->debug_show($this->result_str);
return 0;
}
$this->in = "MAIL FROM:<".$from.">\r\n";
$this->docommand();
$this->in = "RCPT TO:<".$to.">\r\n";
$this->docommand();
$this->in = "DATA\r\n";
$this->docommand();
$this->in = $All."\r\n.\r\n";
$this->docommand();
if(!eregi("250",$this->result_str)){
$this->result_str = "邮件发送失败";
$this->debug_show($this->result_str);
return 0;
}
$this->in = "QUIT\r\n";
$this->docommand();
//结束,关闭连接
return 1;
}
function docommand()
{
socket_write ($this->socket, $this->in, strlen ($this->in));
//$this->debug_show("客户机命令:".iconv("GBK","UTF-8", $this->in));
$this->debug_show("客户机命令:".iconv("GBK","utf-8//TRANSLIT//IGNORE", $this->in)); //防止报错:Notice: iconv(): Unknown error (84)
$this->result_str = "服务器应答:<font color=#cc0000>".iconv("GBK","UTF-8//TRANSLIT//IGNORE", socket_read ($this->socket, 1024))."</font>";
$this->debug_show($this->result_str);
}
} //end class
?>
sendmail.php:
<?php
header("Content-type: text/html; charset=utf-8");
?>
<?php
include("smtp.class.php");
//$mails=new smtp_mail("220.181.15.111","25","xxx108@126.com","********");
$mails=new smtp_mail("220.181.15.111","25","xxx108@126.com","********",true);
$date = date("Y-m-d H:i:s");
if($mails->send("xxx108@126.com","xxx108@126.com","有人于".$date."登录服务器","请注意是否自己在该时间登录。","登录时间。"))
{
echo "发送成功!";
}else{
echo "邮件服务器忙,请稍候再试试";
}
?>
如果有获取谁的exec函数加上(修改配置文件 php.ini 把exec的执行权限放开!):
这个程序的实质是模仿如下终端操作:
telnet smtp.sina.net 25
Trying 202.108.37.33...
Connected to smtp.sina.net.
Escape character is '^]'.
220 sina3-197.sina.net ESMTP - qmail-1.04
helo sina.net
250 sina3-197.sina.net
AUTH LOGIN
334 VXNlcm5hbWU6
ZWFzdHN1bkBlYXN0c3VuLnNpbmEubmV0
334 UGFzc3dvcmQ6
MTIzcXdl
235 验证通过- authentication successfully
data
503 请先用 RCPT - RCPT first (#5.5.1)
mail from:<xxx108@126.com>
250 Mail OK
rcpt to:<xxx108@126.com>
rcpt to:<372647693@qq.com> //第二个抄送人
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
From: Mail test <372647693@qq.com>
Sender: jackxiang <xxx108@126.com>
To: xxx108@126.com
Cc: 372647693@qq.com
Subject: mail testing mail title
This is mail content...
.
250 Mail OK queued as smtp1,C8mowEDpO0uNr0dUwfhiAA--.1433S3 1413984769
(最后这个小数点一定要加上)
此时,372647693@qq.com也会收到,这个cc:就是抄送人,在邮件标题里体现,真正发还是在rcpt to:<372647693@qq.com> //第二个抄送人。
邮件标题:
mail testing mail title
发件人:Mail test<372647693@qq.com> (由 xxx108@126.com 代发)
收件人:我<xxx108@126.com>
抄送人:372647693<372647693@qq.com>
This is mail content...
QQ邮箱:
发件人:我自己的邮箱 <372647693@qq.com>(由 xxx108@126.com 代发)
时 间:2014年10月22日(星期三) 晚上9:46
收件人:xdy108 <xxx108@126.com>
抄 送:回忆未来-向东-Jàck <372647693@qq.com>
This is mail content...
————————————————————————————————————————————————————————
以下如果打开$mails=new smtp_mail("smtp.sina.net","25","eastsun@eastsun.sina.net","123qwe","false"); //false
可以看见其到底是如何进行会话的,如下:
创建SOCKET:您的主机中的软件放弃了一个已建立的连接。
创建SOCKET连接:您的主机中的软件放弃了一个已建立的连接。
服务器应答:220 smtp-5-32.sina.net ESMTP - qmail-1.04
客户机命令:EHLO HELO
服务器应答:250-smtp-5-32.sina.net 250-AUTH=LOGIN 250-AUTH LOGIN 250-PIPELININGJH 250 8BITMIME
客户机命令:AUTH LOGIN
服务器应答:334 VXNlcm5hbWU6
客户机命令:ZWFzdHN1bkBlYXN0c3VuLnNpbmEubmV0
服务器应答:334 UGFzc3dvcmQ6
客户机命令:MTIzcXdl
服务器应答:235 验证通过 - authentication successfully
客户机命令:MAIL FROM:xiaoqian@staff.sina.com.cn
服务器应答:250 eastsun@eastsun.sina.netok
客户机命令:RCPT TO:xiangdong2@staff.sina.com.cn
服务器应答:250 ok
客户机命令:DATA
服务器应答:354 请继续 - go ahead
客户机命令:From:xiaoqian@staff.sina.com.cn To:xiangdong2@staff.sina.com.cn Subject:我来个中文测试一下,怎么就不正常了呢,哈哈。。向东 Content-Type: text/plain; charset=gb2312 我来个中文测试一下,这里是信的内容!!! .
服务器应答:250 ok 1212053255 qp 74366
客户机命令:QUIT
服务器应答:221 smtp-5-32.sina.net
发送成功!
对用户名和密码的Base64编码方法:
<?php
$user="xiangdong2@staff.sina.com.cn";
$pass="xiangdong";
$user = base64_encode($user);
$pass = base64_encode($pass);
echo $user."\n";
echo $pass."\n";
?>
[root@vm0000055 ~]# telnet staff.sina.com.cn 110
Trying 10.210.98.10...
Connected to staff.sina.com.cn (10.210.98.10).
Escape character is '^]'.
+OK staff-jes1.sina.com.cn POP3 service (Sun Java(tm) System Messaging Server 6.2-3.04 (built Jul 15 2005))
xiangdong2
-ERR Unrecognized command
xiangdong2@staff.sina.com.cn
-ERR Unrecognized command
USER xiangdong2
+OK Name is a valid mailbox
pass xiangdong
+OK Maildrop ready
AUTH
-ERR Unrecognized command
LIST
+OK scan listing follows
1 1675
2 8490
3 3004
4 625
5 650
6 1877
7 1928
8 1939
9 2131
.
RETR 1
+OK 1675 octets
Return-path: <jinsong@staff.sina.com.cn>
Received: from sina123123123 ([10.218.26.58]) by staff-jes1.sina.com.cn
(Sun Java System Messaging Server 6.2-3.04 (built Jul 15 2005))
id <0KLS00I01MFE7V00@staff-jes1.sina.com.cn>
(original mail from jinsong@staff.sina.com.cn); Thu,
25 Jun 2009 20:01:15 +0800 (CST)
Received: from sina123123123 ([10.218.26.58]) by staff-jes1.sina.com.cn
(Sun Java System Messaging Server 6.2-3.04 (built Jul 15 2005))
with ESMTPA id <0KLS00OCGMQ2Q1B0@staff-jes1.sina.com.cn>; Thu,
25 Jun 2009 20:01:14 +0800 (CST)
Date: Thu, 25 Jun 2009 20:01:34 +0800
From: =?GB2312?B?wbq+osvJ?= <jinsong@staff.sina.com.cn>
Subject:
=?gb2312?B?vfHM7M/Czuc2o7owMLnHuMnN+LnK1c+jrNbQtefQxbPGueO2q7P2yqHCt9PJxvez9rnK1c8g1OyzybulwarN+NO1yPs=?=
To: cpyw <cpyw@staff.sina.com.cn>, sinamail <sinamail@staff.sina.com.cn>,
platform <platform@staff.sina.com.cn>
Message-id: <200906252001339840407@staff.sina.com.cn>
MIME-version: 1.0
X-Mailer: Foxmail 6, 9, 201, 16 [cn]
Content-type: text/plain; charset=gb2312
Content-transfer-encoding: base64
vfHM7M/Czuc2o7owMLnHuMnN+LnK1c+jrNbQtefQxbPGueO2q7P2yqHCt9PJxvez9rnK1c8g1Oyz
ybulwarN+NO1yPsNCmh0dHA6Ly90ZWNoLnNpbmEuY29tLmNuL3QvMjAwOS0wNi0yNS8xOTMyMzIx
MjIyNS5zaHRtbA0KaHR0cDovL3RlY2guc2luYS5jb20uY24vdC8yMDA5LTA2LTI1LzE5MTYzMjEy
MjEzLnNodG1sDQpodHRwOi8vdGVjaC5zaW5hLmNvbS5jbi9pLzIwMDktMDYtMjUvMTkyNTMyMTIy
MTguc2h0bWwNCiAJCQkJDQotLS0tLS0tLS0tLS0tLQ0Kwbq+osvJDQoNCnNpbmG7pbavyefH+NTL
06rWp7PW1+kNCg0Ktee7sKO6MDEwo602MjY3NjgxMQ0KDQrK1rv6o7oxMzcxNzkwMzMxOQ0KDQrT
ys/ko7pqaW5zb25nQHN0YWZmLnNpbmEuY29tLmNuIA0KDQpNU046cm9zZWxpYW5nanNAaG90bWFp
bC5jb20NCg0KUVE6NjQyNzkyMjI0DQoyMDA5LTA2LTI1DQo=
PHP通过Socket来发送网页Post请求和Get请求Ok代码:
如果没有Host在里面[fwrite($sock, "Host: upload.com\r\n");],则会出现:
51 [Mon Jun 20 18:12:19 2011] [error] [client 172.25.38.70] client sent HTTP/1.1 request without hostname (see RFC2616
section 14.23): /upload/upload.cgi
判断refer啥的,这块涉及到php的curl传refer,请参考:
伪造refer: https://jackxiang.com/post/4022/
伪造Host绑定来源:https://jackxiang.com/post/4423/
如果有获取whoami之类的,修改配置文件 php.ini 把exec的执行权限放开!
smtp.class.php:
<?php
set_time_limit(120);
class smtp_mail
{
var $host=""; //主机
var $port="25"; //端口 一般为25
var $user=""; //SMTP认证的帐号
var $pass=""; //认证密码
var $debug = false; //是否显示和服务器会话信息?
var $conn;
var $socket="";
var $result_str; //结果
var $in; //客户机发送的命令
var $from_r; //真实的源信箱,一般与smtp服务器的用户名一样,否则可能由于smtp服务器的设置而发送不成功
var $mailformat=0; //邮件格式 0=普通文本 1=html邮件
function smtp_mail($host,$port,$user,$pass,$debug=false)
{
$this->host = $host;
$this->port = $port;
$this->user = base64_encode($user);
$this->pass = base64_encode($pass);
$this->debug = $debug;
$this->socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); //具体用法请参考手册
if($this->socket)
{
//$this->result_str = "创建SOCKET:".socket_strerror(socket_last_error());
$this->result_str = "创建SOCKET:".iconv("GBK","UTF-8//TRANSLIT//IGNORE", socket_strerror(socket_last_error()));
$this->debug_show($this->result_str);
}
else
{
exit("初始化失败,请检查您的网络连接和参数");
}
$this->conn = socket_connect($this->socket,$this->host,$this->port);
if($this->conn)
{
$this->result_str = "创建SOCKET连接:".iconv("GBK","UTF-8//TRANSLIT//IGNORE",socket_strerror(socket_last_error()));
$this->debug_show($this->result_str);
}
else
{
exit("初始化失败,请检查您的网络连接和参数");
}
$this->result_str = "服务器应答:<font color=#cc0000>".socket_read ($this->socket, 1024)."</font>";
$this->debug_show($this->result_str);
}
function debug_show($str)
{
if($this->debug)
{
echo $str."<p>\r\n";
}
}
function send($from,$to,$subject,$body)
{
if($from == "" || $to == "")
{
exit("请输入信箱地址");
}
if($subject == "") $sebject = "无标题";
if($body == "") $body = "无内容";
$All = "From:".$from."\r\n";
$All .= "To:".$to."\r\n";
$All .= "Subject:".$subject."\r\n";
if($this->mailformat==1) $All.= "Content-Type: text/html;\r\n";
else $All .= "Content-Type: text/plain;\r\n";
$All .= "charset=gb2312\r\n\r\n";
$All .= $body;
/*
如果把$All的内容再加处理,就可以实现发送MIME邮件了
不过还需要加很多程序
*/
//以下是和服务器会话
$this->in = "EHLO HELO\r\n";
$this->docommand();
$this->in = "AUTH LOGIN\r\n";
$this->docommand();
$this->in = $this->user."\r\n";
$this->docommand();
$this->in = $this->pass."\r\n";
$this->docommand();
if(!eregi("235",$this->result_str)){
$this->result_str = "smtp 认证失败";
$this->debug_show($this->result_str);
return 0;
}
$this->in = "MAIL FROM:<".$from.">\r\n";
$this->docommand();
$this->in = "RCPT TO:<".$to.">\r\n";
$this->docommand();
$this->in = "DATA\r\n";
$this->docommand();
$this->in = $All."\r\n.\r\n";
$this->docommand();
if(!eregi("250",$this->result_str)){
$this->result_str = "邮件发送失败";
$this->debug_show($this->result_str);
return 0;
}
$this->in = "QUIT\r\n";
$this->docommand();
//结束,关闭连接
return 1;
}
function docommand()
{
socket_write ($this->socket, $this->in, strlen ($this->in));
//$this->debug_show("客户机命令:".iconv("GBK","UTF-8", $this->in));
$this->debug_show("客户机命令:".iconv("GBK","utf-8//TRANSLIT//IGNORE", $this->in)); //防止报错:Notice: iconv(): Unknown error (84)
$this->result_str = "服务器应答:<font color=#cc0000>".iconv("GBK","UTF-8//TRANSLIT//IGNORE", socket_read ($this->socket, 1024))."</font>";
$this->debug_show($this->result_str);
}
} //end class
?>
sendmail.php:
<?php
header("Content-type: text/html; charset=utf-8");
?>
<?php
include("smtp.class.php");
//$mails=new smtp_mail("220.181.15.111","25","xxx108@126.com","********");
$mails=new smtp_mail("220.181.15.111","25","xxx108@126.com","********",true);
$date = date("Y-m-d H:i:s");
if($mails->send("xxx108@126.com","xxx108@126.com","有人于".$date."登录服务器","请注意是否自己在该时间登录。","登录时间。"))
{
echo "发送成功!";
}else{
echo "邮件服务器忙,请稍候再试试";
}
?>
如果有获取谁的exec函数加上(修改配置文件 php.ini 把exec的执行权限放开!):
这个程序的实质是模仿如下终端操作:
telnet smtp.sina.net 25
Trying 202.108.37.33...
Connected to smtp.sina.net.
Escape character is '^]'.
220 sina3-197.sina.net ESMTP - qmail-1.04
helo sina.net
250 sina3-197.sina.net
AUTH LOGIN
334 VXNlcm5hbWU6
ZWFzdHN1bkBlYXN0c3VuLnNpbmEubmV0
334 UGFzc3dvcmQ6
MTIzcXdl
235 验证通过- authentication successfully
data
503 请先用 RCPT - RCPT first (#5.5.1)
mail from:<xxx108@126.com>
250 Mail OK
rcpt to:<xxx108@126.com>
rcpt to:<372647693@qq.com> //第二个抄送人
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
From: Mail test <372647693@qq.com>
Sender: jackxiang <xxx108@126.com>
To: xxx108@126.com
Cc: 372647693@qq.com
Subject: mail testing mail title
This is mail content...
.
250 Mail OK queued as smtp1,C8mowEDpO0uNr0dUwfhiAA--.1433S3 1413984769
(最后这个小数点一定要加上)
此时,372647693@qq.com也会收到,这个cc:就是抄送人,在邮件标题里体现,真正发还是在rcpt to:<372647693@qq.com> //第二个抄送人。
邮件标题:
mail testing mail title
发件人:Mail test<372647693@qq.com> (由 xxx108@126.com 代发)
收件人:我<xxx108@126.com>
抄送人:372647693<372647693@qq.com>
This is mail content...
QQ邮箱:
发件人:我自己的邮箱 <372647693@qq.com>(由 xxx108@126.com 代发)
时 间:2014年10月22日(星期三) 晚上9:46
收件人:xdy108 <xxx108@126.com>
抄 送:回忆未来-向东-Jàck <372647693@qq.com>
This is mail content...
————————————————————————————————————————————————————————
以下如果打开$mails=new smtp_mail("smtp.sina.net","25","eastsun@eastsun.sina.net","123qwe","false"); //false
可以看见其到底是如何进行会话的,如下:
创建SOCKET:您的主机中的软件放弃了一个已建立的连接。
创建SOCKET连接:您的主机中的软件放弃了一个已建立的连接。
服务器应答:220 smtp-5-32.sina.net ESMTP - qmail-1.04
客户机命令:EHLO HELO
服务器应答:250-smtp-5-32.sina.net 250-AUTH=LOGIN 250-AUTH LOGIN 250-PIPELININGJH 250 8BITMIME
客户机命令:AUTH LOGIN
服务器应答:334 VXNlcm5hbWU6
客户机命令:ZWFzdHN1bkBlYXN0c3VuLnNpbmEubmV0
服务器应答:334 UGFzc3dvcmQ6
客户机命令:MTIzcXdl
服务器应答:235 验证通过 - authentication successfully
客户机命令:MAIL FROM:xiaoqian@staff.sina.com.cn
服务器应答:250 eastsun@eastsun.sina.netok
客户机命令:RCPT TO:xiangdong2@staff.sina.com.cn
服务器应答:250 ok
客户机命令:DATA
服务器应答:354 请继续 - go ahead
客户机命令:From:xiaoqian@staff.sina.com.cn To:xiangdong2@staff.sina.com.cn Subject:我来个中文测试一下,怎么就不正常了呢,哈哈。。向东 Content-Type: text/plain; charset=gb2312 我来个中文测试一下,这里是信的内容!!! .
服务器应答:250 ok 1212053255 qp 74366
客户机命令:QUIT
服务器应答:221 smtp-5-32.sina.net
发送成功!
对用户名和密码的Base64编码方法:
<?php
$user="xiangdong2@staff.sina.com.cn";
$pass="xiangdong";
$user = base64_encode($user);
$pass = base64_encode($pass);
echo $user."\n";
echo $pass."\n";
?>
[root@vm0000055 ~]# telnet staff.sina.com.cn 110
Trying 10.210.98.10...
Connected to staff.sina.com.cn (10.210.98.10).
Escape character is '^]'.
+OK staff-jes1.sina.com.cn POP3 service (Sun Java(tm) System Messaging Server 6.2-3.04 (built Jul 15 2005))
xiangdong2
-ERR Unrecognized command
xiangdong2@staff.sina.com.cn
-ERR Unrecognized command
USER xiangdong2
+OK Name is a valid mailbox
pass xiangdong
+OK Maildrop ready
AUTH
-ERR Unrecognized command
LIST
+OK scan listing follows
1 1675
2 8490
3 3004
4 625
5 650
6 1877
7 1928
8 1939
9 2131
.
RETR 1
+OK 1675 octets
Return-path: <jinsong@staff.sina.com.cn>
Received: from sina123123123 ([10.218.26.58]) by staff-jes1.sina.com.cn
(Sun Java System Messaging Server 6.2-3.04 (built Jul 15 2005))
id <0KLS00I01MFE7V00@staff-jes1.sina.com.cn>
(original mail from jinsong@staff.sina.com.cn); Thu,
25 Jun 2009 20:01:15 +0800 (CST)
Received: from sina123123123 ([10.218.26.58]) by staff-jes1.sina.com.cn
(Sun Java System Messaging Server 6.2-3.04 (built Jul 15 2005))
with ESMTPA id <0KLS00OCGMQ2Q1B0@staff-jes1.sina.com.cn>; Thu,
25 Jun 2009 20:01:14 +0800 (CST)
Date: Thu, 25 Jun 2009 20:01:34 +0800
From: =?GB2312?B?wbq+osvJ?= <jinsong@staff.sina.com.cn>
Subject:
=?gb2312?B?vfHM7M/Czuc2o7owMLnHuMnN+LnK1c+jrNbQtefQxbPGueO2q7P2yqHCt9PJxvez9rnK1c8g1OyzybulwarN+NO1yPs=?=
To: cpyw <cpyw@staff.sina.com.cn>, sinamail <sinamail@staff.sina.com.cn>,
platform <platform@staff.sina.com.cn>
Message-id: <200906252001339840407@staff.sina.com.cn>
MIME-version: 1.0
X-Mailer: Foxmail 6, 9, 201, 16 [cn]
Content-type: text/plain; charset=gb2312
Content-transfer-encoding: base64
vfHM7M/Czuc2o7owMLnHuMnN+LnK1c+jrNbQtefQxbPGueO2q7P2yqHCt9PJxvez9rnK1c8g1Oyz
ybulwarN+NO1yPsNCmh0dHA6Ly90ZWNoLnNpbmEuY29tLmNuL3QvMjAwOS0wNi0yNS8xOTMyMzIx
MjIyNS5zaHRtbA0KaHR0cDovL3RlY2guc2luYS5jb20uY24vdC8yMDA5LTA2LTI1LzE5MTYzMjEy
MjEzLnNodG1sDQpodHRwOi8vdGVjaC5zaW5hLmNvbS5jbi9pLzIwMDktMDYtMjUvMTkyNTMyMTIy
MTguc2h0bWwNCiAJCQkJDQotLS0tLS0tLS0tLS0tLQ0Kwbq+osvJDQoNCnNpbmG7pbavyefH+NTL
06rWp7PW1+kNCg0Ktee7sKO6MDEwo602MjY3NjgxMQ0KDQrK1rv6o7oxMzcxNzkwMzMxOQ0KDQrT
ys/ko7pqaW5zb25nQHN0YWZmLnNpbmEuY29tLmNuIA0KDQpNU046cm9zZWxpYW5nanNAaG90bWFp
bC5jb20NCg0KUVE6NjQyNzkyMjI0DQoyMDA5LTA2LTI1DQo=
PHP通过Socket来发送网页Post请求和Get请求Ok代码:
如果没有Host在里面[fwrite($sock, "Host: upload.com\r\n");],则会出现:
51 [Mon Jun 20 18:12:19 2011] [error] [client 172.25.38.70] client sent HTTP/1.1 request without hostname (see RFC2616
section 14.23): /upload/upload.cgi
判断refer啥的,这块涉及到php的curl传refer,请参考:
伪造refer: https://jackxiang.com/post/4022/
伪造Host绑定来源:https://jackxiang.com/post/4423/
明天结婚。是阿里巴巴集团同事的集体婚礼。
和老婆风风雨雨一路走来。大学最后一年相识,毕业后,她在青岛,我在北京。她抛弃很好的工作背景,杀到北京,在北京生活三年,又和我一起来到杭州发展。感激老婆,每次虽然面对的不是什么大决择,也需要很大的勇气,想起来多不容易。这期间尤其令我感到内疚的是在北京期间老婆压力过大导致生病,深深自责。
不管怎么样,祝福我们吧! 我先祝福一下 :)
冯大辉(David Feng)
大学的专业是生物技术,毕业后从事计算机行业。
在 IT 行业的这几年基本上是做 Oracle 数据库相关的技术工作,对 Oracle 数据库的管理与性能优化有一点研究,有点实践经验,乐于分享技术经验,是一名 Oracle ACE (bio,中文介绍)。我的技术背景包括:
Oracle RDBMS
Unix / Linux
Web / Security
曾经参与编辑两本 Oracle 的技术图书:
《Oracle数据库性能优化》
《Oracle数据库DBA专题技术精粹》
此外曾参与翻译过三本计算机图书。
现就职于阿里巴巴集团旗下支付宝(中国)网络技术有限公司。任职数据库架构师 。
这个站点是我实验 Web 技术与知识积累的场所,秉承"最简约的技术取得最大的收益"的理念,希望也能对其他人有点用。如您所知,本人发布的文章与评论内容仅代表本人观点。一般在网上我用 "Fenng" 这个ID 进行技术交流。
我是东北人,现在生活在杭州。养了两只猫. 喜欢 The Cure 的音乐.
可以通过网络电话或者电子邮件和我联系: dbanotes@gmail.com
和老婆风风雨雨一路走来。大学最后一年相识,毕业后,她在青岛,我在北京。她抛弃很好的工作背景,杀到北京,在北京生活三年,又和我一起来到杭州发展。感激老婆,每次虽然面对的不是什么大决择,也需要很大的勇气,想起来多不容易。这期间尤其令我感到内疚的是在北京期间老婆压力过大导致生病,深深自责。
不管怎么样,祝福我们吧! 我先祝福一下 :)
冯大辉(David Feng)
大学的专业是生物技术,毕业后从事计算机行业。
在 IT 行业的这几年基本上是做 Oracle 数据库相关的技术工作,对 Oracle 数据库的管理与性能优化有一点研究,有点实践经验,乐于分享技术经验,是一名 Oracle ACE (bio,中文介绍)。我的技术背景包括:
Oracle RDBMS
Unix / Linux
Web / Security
曾经参与编辑两本 Oracle 的技术图书:
《Oracle数据库性能优化》
《Oracle数据库DBA专题技术精粹》
此外曾参与翻译过三本计算机图书。
现就职于阿里巴巴集团旗下支付宝(中国)网络技术有限公司。任职数据库架构师 。
这个站点是我实验 Web 技术与知识积累的场所,秉承"最简约的技术取得最大的收益"的理念,希望也能对其他人有点用。如您所知,本人发布的文章与评论内容仅代表本人观点。一般在网上我用 "Fenng" 这个ID 进行技术交流。
我是东北人,现在生活在杭州。养了两只猫. 喜欢 The Cure 的音乐.
可以通过网络电话或者电子邮件和我联系: dbanotes@gmail.com
function set_upload_data($arr_upload)
{
$this->attachment=$arr_upload[files];
$this->upload_dir=$arr_upload["upload_dir"];
}
function uploadfile()
{
$fileName = mb_convert_encoding($this->attachment['name'],'GBK','UTF-8');//这一行开始转码,否则出现乱码
//$fileName = iconv("UTF-8","GBK", $this->attachment['name']); //这样也行,由UTF-8转到GBK,和上面的函数有区别
if(move_uploaded_file($this->attachment['tmp_name'],$this->upload_dir.$fileName))
{
return 1;//上传成功
}else{
return 0;//上传失败
}
}
参考如下文章:
mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。
不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。
mb_convert_encoding的用法见官方:
http://cn.php.net/manual/zh/function.mb-convert-encoding.php
做一个GBK To UTF-8
< ?php
header("content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");
?>
再来个GB2312 To Big5
< ?php
header("content-Type: text/html; charset=big5");
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
?>
不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。
PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。
下面还有一些详细的例子:
iconv — Convert string to requested character encoding
(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding
(PHP 4 >= 4.0.6, PHP 5)
用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;
string iconv ( string in_charset, string out_charset, string str )
注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
Returns the converted string or FALSE on failure.
使用:
发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.
from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);
/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */
$str = mb_convert_encoding($str, “EUC-JP”, “auto”);
例子:
$content = iconv(”GBK”, “UTF-8″, $content);
$content = mb_convert_encoding($content, “UTF-8″, “GBK”);
如果前端是GBK,而在生成Json时需要做转换才能中文正常显示,如下(把GBK转为Utf8):
最后:Ajax走的都是Utf8,所以得从GBK转为Utf8.
{
$this->attachment=$arr_upload[files];
$this->upload_dir=$arr_upload["upload_dir"];
}
function uploadfile()
{
$fileName = mb_convert_encoding($this->attachment['name'],'GBK','UTF-8');//这一行开始转码,否则出现乱码
//$fileName = iconv("UTF-8","GBK", $this->attachment['name']); //这样也行,由UTF-8转到GBK,和上面的函数有区别
if(move_uploaded_file($this->attachment['tmp_name'],$this->upload_dir.$fileName))
{
return 1;//上传成功
}else{
return 0;//上传失败
}
}
参考如下文章:
mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。
不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。
mb_convert_encoding的用法见官方:
http://cn.php.net/manual/zh/function.mb-convert-encoding.php
做一个GBK To UTF-8
< ?php
header("content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");
?>
再来个GB2312 To Big5
< ?php
header("content-Type: text/html; charset=big5");
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
?>
不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。
PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。
下面还有一些详细的例子:
iconv — Convert string to requested character encoding
(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding
(PHP 4 >= 4.0.6, PHP 5)
用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;
string iconv ( string in_charset, string out_charset, string str )
注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
Returns the converted string or FALSE on failure.
使用:
发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.
from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);
/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */
$str = mb_convert_encoding($str, “EUC-JP”, “auto”);
例子:
$content = iconv(”GBK”, “UTF-8″, $content);
$content = mb_convert_encoding($content, “UTF-8″, “GBK”);
如果前端是GBK,而在生成Json时需要做转换才能中文正常显示,如下(把GBK转为Utf8):
最后:Ajax走的都是Utf8,所以得从GBK转为Utf8.