传工信部将合并科技部—前期调研已展开

新一轮大部制改革的调研工作正悄然展开。这一次,命运面临改变的是科技部。

“前期讨论的焦点是科技部的撤并问题,调研中有人主张将科技部的一部分职能并入工信部,更为激进的方案是撤销科技部,将其现有职能并入相关部委。”5月17日,一位接近工信部、参与调研的人士向《华夏时报》记者透露。

上述人士称,激进的方案认为科技部没有单独成立的必要,其职能与工信部、发改委、农业部、教育部一直有交叉,而且做的都是“擦边球”的工作,应该将科技部经济领域的科研规划和管理方面的职能并入工信部。

记者采访工信部、科技部等多个信息源显示,这一说法并非空穴来风,事实上一些前期工作已经展开了。

工信部将迎新“客人”

位于西长安街13号的工信部,正在大兴土木,预计明年年底前,又一座长安街上的标志性建筑将拔地而起,与著名的西单图书大厦遥相呼应。

以前在工信部大院内办公的司局,现在已经“兵分多处”:中小企业司、节能与综合利用司、产业司、规划司寄居在旁边的民航大厦,原材料司、运行局、装备司、消费品司则远迁至万寿路办公区,通讯司和电信局也搬到了联通东业务楼里。

“大院里的3栋办公楼都拆了,连食堂都没留,是今年年初开始动工的。”工信部消费品司的一位官员告诉记者。

据这位官员介绍,消费品司曾驻在大院内一座类似“筒子楼”的4层小楼里面,没有电梯,要步行上下楼,线路老化,宽带升级都成问题,外面的人来工信部都半开玩笑地说,“工信部只有工业没有信息化。”

但这种情况在不久的将来就会改变,明年底建成的办公大楼不仅可以实现24小时的无线上网,而且集成了物联网等高新科学技术,更为重要的是,除了上面“背井离乡”的几个司局要“回迁”,这座崭新的大楼还将迎来新的“客人”——科技部。

“如果大部制改革的可行性方案获得国务院通过,也就是科技部经济领域的科研规划和管理方面的职能划入工信部,那么就意味着科技部大部分人马将进入工信部,工信部的名称也将会有所变化,由现在的‘工业和信息化部’改成‘工业和信息技术部’,实现‘工业、科技、信息化’三者的合力。”上述参与调研的人士透露。

一位研究机构改革的社科院专家也认为,有必要对上层建筑进行一次调整,使其更适合调结构转方式这个经济基础,在国家机构层面,把科技和工业紧密地结合在一起,使这个新成立的部能有的放矢、更有效率地发挥作用,真正使科技起引领作用,很好地使产学研结合,有利于科技成果更快地实现产业化。

而主张撤销科技部的方案建议:将科技部的高新技术发展及产业化司、发展计划司和社会发展科技司的大部分职能划归工信部,农村科技司并入农业部,基础研究司、国际合作司以及科研条件与财务司一同归并教育司。

两部委的分歧

事实上,国务院主管国家科技工作的部门曾经历过不止一次的撤销。

记者查阅资料发现,科技部的前身,最早是1956年成立的国家技术委员会,1958年被撤销后设立科学技术委员会,1970年,该机构又被撤销,直到1977年才恢复,而到了1998年,该机构更名为科技部。

“每次撤销的原因都不一样,但再度成立科学技术委员会的可能性不大,因为从改革的方向来看,部委的数量将进一步压缩,成立新部门几无可能;而且,权力下放到各个部委也是大势所趋,需要做的是,权力分配要更加合理。”上述参与调研的人士称。

事实上,科技部与工信部在一些相关问题上确有分歧。

矛盾首先体现在新能源发展路线上。2008年大部制改革之前,科技部一直都是推动中国新能源车发展的主要力量,“十五”期间,科技部为扶持企业搞新能源车的研发,拿出了8个亿的资金给企业进行相关技术的研发,在“十一五”期间,科技部则规划继续向节能和新能源汽车重大专项课题,投入资金11亿元。

但是大部制改革后,主管汽车产业的工信部开始介入,上述装备司的官员说,2009年工信部便启动了新能源汽车产品标准、试验方法等一系列工作。

这无疑触动了科技部的“老大”地位。不仅如此,两部委在发展新能源汽车的路线上也存在分歧。科技部部长万钢主张“自主为先”:现在最主要的任务是不能放弃新能源汽车的主导权,也就是不放弃对新能源车研发资金的分配权。而工信部更支持外资企业。

无独有偶,在光伏产业发展上,两部委也出现了较大的分歧。

“工信部认为目前光伏产业存在过剩问题,但科技部却唱反调,说如果以高端产能而论,并不存在过剩,尽管两大部委论述的前提条件不同,但也没有必要在这个大家都明白的问题上公开较真。”一家生产多晶硅企业的负责人对记者说。

更有意思的是,两部委有各自主导的“光伏产业联盟”。2010年,工信部汇聚22家龙头企业成立了中国光伏产业联盟,主攻标准体系的建设、技术创新平台的搭建、专利的梳理与体系建设、产业推广等四大重点领域。而在2009年,科技部就已经设立了多晶硅技术创新联盟,涵盖11家企业及院校,职能任务也基本重叠。

上述参与调研的人士说,两大产业联盟存在对撞,企业也增加了与政府沟通的成本,或许新一轮大部制改革能提供一个不错的解决思路。

发表在 互联网 | 标签为 , , , , | 留下评论

大学考试网因涉嫌侵权突然关闭 大学生组团维权

昨日,常州市钟楼区公安分局召开新闻发布会,通报该分局侦破了一起考试网站涉嫌侵犯知识产权的案例。该案的主角是一位考研未果的大学生张某,他创办了“大学考试网”后“买鸡下蛋”,通过上载其他较知名培训机构的考研视频,出售给网站会员牟利。钱的确是好赚,半年就弄了十几万,但他在去年底也意识到自己的行为已经违法,于今年3月底突然关闭网站,结果惹来祸端,引发会员集体维权。

该案被常州警方关注到后,日前将张某抓捕归案,此案仍在进一步审理中。

通讯员 费星玮

扬子晚报记者 张斌

花158元就可随便下载资料,结果网站突然关闭

各地大学生发现受骗后组团维权

今年3月底,一家名为“大学考试网”的网站突然关闭,结果惹怒了许多已经缴费成为会员但却享受不到相应服务的考研学生。小艾是重庆某大学学生,因为同学的极力推荐,全力准备研究生考试的他在3月中旬登录“大学考试网”,通过网银支付了158元成为该网站的VIP会员,享受包年服务。开始,小艾感觉网站挺好的,英语、数学、政治三科的研究生培训视频都很不错,都是知名培训机构的视频教材,感觉这钱花的值。

可是好景不长,仅仅过了十来天的时间,该网站突然发出公告,大致内容为“由于不可抗力因素,大学考试网将从此关闭,请大家在2012年3月30日之前,将您在大学考试网注册的用户名发给客服QQ邮箱,我们将记录做进一步的退款处理。3月份购买的用户按付款金额的100%退款;2月份购买的用户按付款金额的90%退款;1月份购买的用户按付款金额的80%退款……依此类推。”可等到4月1日,网站彻底停了,相关的网站服务联系人也都没了音讯。这让小艾感觉很意外,所有考研信息再也无法共享。“难道自己的钱就这样白花了?”小艾为此很苦恼也很生气。

像同样遭遇的考研学生还不在少数,江西、河南、重庆等全国多地的大学生都是该网站会员,他们中很多人也到当地派出所报过案,可惜数额太小,属地警方均未立案;求助支付宝也没人管,因为钱已经付出去了。众考研学生无奈之下,采取了多种方式维权,网络组团发帖曝光黑心网站、组建QQ群集体维权……反正能想到的方法基本都用了,可是收效不大。

视频资料都是从别的网站买的,侵犯了知识产权

经营者想“洗手不干”但为时已晚

事情发生在一个人身上金额是不大,可该网站的会员有数百人,那是一笔不小的数额。常州钟楼区刑警大队留意到相关维权信息后,发现该网站的备案地就在江苏,于是立即展开前期侦查工作。

通过半月的调查,钟楼警方基本弄清了情况。原来,该网站那些知名培训机构的视频都是未经授权,私自上载到网站作为经营目的使用,涉嫌构成侵犯知识产权。警方很快又调查到该网站的创办者姓张,是武汉人,1988年生,网站于去年3月创办。

常州钟楼警方通过大量的摸排、走访等工作,5月7日,锁定张某在北京海淀区一间房屋内活动,于是实施抓捕。张某归案后,很快便交代了突然关闭网站的原因。原来,从去年下半年开始,他看见很多关于涉嫌侵犯知识产权的案例告破,他感觉到这是一个大趋势。他很清楚自己所经营的网站也属于侵犯知识产权,于是决定“洗手不干”了。

据张某交代,由于自己害怕得不得了,在下定决心关闭网站的时候,就只想到了“要快”。于是发了一个公告,通知大家赶紧退钱,结果退钱的那几天仅仅才十来个人。等网站关闭后,他停掉了所有的联系方式,后来上网才发现,由于没有及时退钱,他的网站成为了“众矢之的”,很多会员都在向自己这个关闭的网站讨债。于是,为了尽可能消除影响,他又加进一些维权的QQ群,和会员们联系退款事宜,不少收到钱的考研学生便解散了维权QQ群,并删除维权帖。可是,毕竟还有几百人没退到钱,不良影响依然存在。正当他想着要继续消除影响的时候,自己就落网了。

从知名网站买资料 到其他网站做广告

靠“买鸡下蛋” 半年赚了十几万

据了解,张某最初办网站正是因为他准备考研。他交代说,自己是个电脑爱好者,大学毕业前,他在网上买了一些考研视频教材,可是发现考研比较耗费精力,最终还是选择了放弃。不过,通过那次购买视频,他发现办个类似的网站肯定比较赚钱,于是说干就干,创办了“大学考试网”,将从其他网站买到的视频挂上网销售。看看自己的视频太少,他又跑到几家知名网站买了些不错的内容回来,上载到自己的网站。可是,网站知名度太小,会员量不多,他又花了点钱去其他网站做广告,来扩大网站的影响力,没想到,效果还不错,有考研学生开始主动和他联系。有了“客源”后,张某不断地充实自己的视频,渐渐地,由于选的教材好,网站人气越来越旺,就这样“买鸡下蛋”,半年就赚到了十几万。

发表在 电子商务 | 标签为 , , , , , , | 留下评论

男子网售假“伟哥”半年获利20万

前天上午,深圳市公安局经济犯罪侦查局联合深圳市药品监督管理局开展统一行动,成功打响打击网络制售假药联合战役。行动中,共打掉犯罪团伙及窝点2个,现场抓获犯罪嫌疑人7名,缴获假冒“伟哥”等假药60多种,涉案金额1000余万元。

据犯罪嫌疑人杨某交代,其药品网店于去年12月开张。此前,其发现进口药“伟哥”的零售价128元/粒,而批发价仅为7元/盒(10粒),巨大的价差令他铤而走险。他遂从销售商入了一批假药,上网开店。仅一个月的时间便轻松赚了1万余元。

办案民警介绍,杨某网售“伟哥”48元/盒,虽号称100%正品却未取得任何药品批准文号,货源也是来自广州等地的假药工厂,其非法牟取的暴利高达600%。据悉,这些假药中大多含有超量的西地那非成分,服用后会出现眼花眩光、视力模糊、血压骤降、头昏晕倒、青光眼、暂时性耳聋,甚至导致永久性阳痿等严重不良反应。从去年12月至今,该窝点已非法获利20多万元。

捣毁的另一售假窝点位于罗湖区,犯罪嫌疑人销售的假冒“安宫牛黄丸”每盒售价250元,进货价仅为几十元,而香港正品“同仁堂安宫牛黄丸”一盒售价要1000多港元。

发表在 互联网 | 标签为 , , , | 留下评论

互联网:互联网大佬集体做手机或意在政府补贴

是为了政策补贴的狙击动作,还是想真心实意地做一票?

一股风潮正在涌动,网络大亨们都已经开始或者宣称开始涉足制造手机。

此间,有关政府将对自有手机操作系统开发进行补贴的消息在坊间流传,电信业内直言:互联网公司此举和政府可能提供的补贴有关。

接受本报采访的互联网公司拒绝置评,但他们的手机制造计划已经在路上。

5月17日晚,网易内部人士向本报确认,这家曾经的互联网老牌门户正在做手机,且配置不低价格不高——双核,千元之下,视频、游戏体验非常流畅。

三天前,华为终端部门负责人余承东泄露了华为已与360就定制手机达成合作协议,周鸿祎不得不承认他在干一件并非自己擅长的事——做手机。一天前,百度也宣布和长虹推出第二款搭载了百度操作系统的千元智能手机。加上此前就做了手机的阿里巴巴和腾讯,现在已经有五六家互联网公司涉足制造手机。

动力及推力

上述企业的动作,被认为是他们在推广自有系统和应用入口。随着移动互联网时代的到来,依托于传统互联网的大佬们也面临巨大的挑战。大多数互联网厂商采用简单的内置APP的方法,复制其在PC上的成功策略,即通过免费模式赢取用户,再借助手机平台,推广自身应用,等到达到足够的量之后,通过增值服务,或者“流量批发”盈利。

这些互联网大佬,无一没有一群应用。譬如,网易目前就有网易新闻、网易阅读、有道词典、有道云笔记和其他应用。

很明显,互联网公司们卖的是手机,推的还是系统和应用,但这个决断的背后还有更多的故事。

如此不约而同地发力手机,亦有政策诱因。本报独家获悉,中国政府高层在近日视察某通信企业驻外机构时,曾两次表示,痛感中国没有自主知识产权的手机操作系统。

来自产业界的多个信息源称,工信部也正在推进鼓励中国互联网公司发展自主知识产权操作系统的工作,并有可能针对开发者提供政府补贴。

亦有电信行业内部人士指出,互联网公司突然高调出击手机操作系统,和政府可能提供的补贴有关,不过,接受记者采访的互联网公司拒绝置评。

来自政府的推力亦是因为,工信部人士感受到国际通信产业的硝烟弥漫。

中兴知识产权总监王海波称,信息技术产业在知识产权领域陷入混战的局面,旧势力如诺基亚、爱立信、索尼等,不断以领跑者自居,向后来者索要“买路钱”,而新势力如中国的华为和中兴通讯等,则不惮威胁,不断冲破原有的藩篱。新势力扩张的最原始方式,就是尽一切可能扩大专利技术的持有量。

通信企业全球化的专利布局,是为了经济安全和经营考虑的。专利混战的背后,是知识产权制度的全球性难题:电信行业要求互联互通,这意味着一个统一的标准,即私有的专利变成了公用的必要和基础,而后来者根本无法绕开;另一方面,电信设备技术高度密集,你中有我,我中有你,没有专利储备,就意味着失去话语权。

专利申请、布局和诉讼中的商业考量,不仅仅是赔偿和费用,它更意味着未来进入这个行业的门槛和壁垒。“我们需要对核心技术进行专利布局,通常是在其周围申请一定数量的专利,形成必要的专利组合。”中兴知识产权总监透露,“这样做的好处很多:保护核心专利;迷惑对手,无论是用来消耗对手成本,还是防御性地申请专利,都是有目的性的”。

由于缺少专利储备,在国际竞争中失利的老牌手机公司已经出现。比如代工出身的HTC,从去年财报看,专利已经为其进军国际市场的制造了障碍,并需要为此付出更高代价。

目前,中国手机企业都是基于谷歌Android系统的二次开发,并没有真正属于自己的底层架构。系统开发的重任无疑交给有意于布局移动互联网的公司最为合适。

监管者的愿望是美好的,事实却是残酷的。

期盼与现实

就算大张旗鼓地宣布进入手机硬件领域,互联网公司成功做手机的概率或许并不高。

创新工场CEO李开复称:互联网公司做手机绝大部分会失败。他的理由是这两个产业差别巨大,企业基因不同。绝大多数互联网品牌对手机不但不能加分,还要扣分。而不以用户需求为使命,只为嵌入自己服务为目标,无法得到用户口碑。此外,网络大佬们不愿意嵌入用户爱戴的竞争对手服务会被诟病,而用Android打造封闭iPhone式高利润封闭产业链也是不现实的。

易观国际高级分析师黄萌称,中国互联网公司没有能力开发真正有替代性的系统,就像中国没有一个企业做PC操作系统,一是没有这种气质,二是生长环境导致。即使在世界领域,PC操作系统多数只是在美国研发,手机操作系统只是在北欧多了一个。它不太可能像应用APP 那样百花齐放。

通过政府之手的选择能够在市场上行得通吗?

历史上,监管者对自主知识产权的殷殷期盼,往往并没有得到预期中的回报。比如说WAPI,比如TD-SCDMA。都与当初的预想相差甚远。而在企业层面,为开发自主知识产权系统所要付出的时间和资金,能否在短期内收回,则决定了手机部门在互联网公司内部的地位和未来。

互联网公司造手机,似乎都受到了最近几年利润高举的苹果公司的影响。5月初,国外的一份手机市场调查报告让不少人大跌眼镜,苹果iPhone(参数 图片 样张 评测)虽然占据整个手机市场份额的不到10%,但攫取了超过整个手机行业四分之三的利润,达到了73%,而三星占据了26%的利润,两者相加99%,剩余的1%被HTC拿走。

苹果公司的高利润是有缘由的,它并不是一个单纯软件的公司,不是一个互联网的公司。细数苹果的历史就会发现,它的确是一家硬件公司,苹果今天的成功,是在硬件、应用系统、软件等方面,起起伏伏积累了数年,而才能在最近五年内爆发。

另一个的逻辑

对于互联网大佬们而言,他们宣称互联网的盈利模式可以衍生到手机制造上。

百度的“引诱”是:搜索广告这种成熟的商业模式可以让这些厂家分享利益。百度技术副总裁王劲称,到目前为止,百度已经与手机厂商和百度移动开发者的分成超过了1亿元人民币。

和百度的模式差不多,奇虎360董事长周鸿祎也在用“互联网的盈利模式”来给手机厂商“洗脑”。周鸿祎讲的道理是——亚马逊的平板出货时零利润,但通过这个入口,亚马逊从一次性卖硬件变成了长期服务收费。

周鸿祎认为智能手机硬件未来一定是免费的,或者说是利润趋近于零,转而通过内置的增值服务建立自己的商业模式。即将于今年6月上市的360出品的手机,将不贴360的品牌,而360负责输出系统、应用以及产品推广。

网易公司也表示要涉足手机制造。该公司创始人丁磊说,产品逐渐从PC转移的趋势是必然的,网易非常重视这一波智能手机在中国的普及所带来的机会,很希望把做得很好的工具软件、资讯类产品和效率软件放在移动终端上。

如果只是为了推广客户端,这些公司完全可以采用与手机厂商合作预置的方式——此前很多手机厂商都宣布自己的手机预置了哪些客户端应用。

不过,在现在的一些手机渠道中,用户拿到的产品有可能被多次刷机——厂家收了网络公司的钱刷一次,在全国性代理商那里刷一次,到了柜台上再刷一次,消费者自己也会刷机,网络公司如果仅仅在手机中预置,恐怕花多少钱都会打水漂。

腾讯无线人士称,预置这条路在去年之前是可以的,如果是直接与国代渠道做刷机风险还小些,但是后来这个市场就乱了,买IMEI(手机的特定标识码)号来做假刷机。

很多安卓软件都是通过上报IMEI号来判断是否有用户使用,后来拓展到用这个上报机制来判断是否通过刷机渠道进行激活(所谓的成功刷机)。因此有渠道商就去手机方案商等处购买成批的IMEI号,通过PC端虚拟程序,模拟上报,造成这样的 IMEI号也能成功透传给做Android软件后台记录,用于结算,实际在手机上根本没安装过。

这样导致网络大佬无法再通过预置和刷机来保证自己的客户端能到用户面前。

易观国际分析师王颖称,互联网企业进入手机领域,最根本的目的是为了配合布局移动互联网战略,聚合用户到自己的平台上,后续通过应用和流量挣钱。从事手机业务只是他们发展移动互联网的一个工具,并不是以手机产品方式来运作一款产品。

2012年一季度的手机制造公司的财报却是冰火两重天。包括索尼、LG、摩托罗拉、诺基亚、RIM等巨鳄,无一不在亏损。就连在国际上出货量首屈一指的中兴和华为也因为在终端消费的投入,利润出现了不同程度的下降。

这意味着,互联网公司做出的手机如果不能很快盈利,那么在企业内部的竞争中,就处于劣势地位,更不用说和有制造积淀的公司竞争。

他们的互联网同行雷军推出的小米手机,已经创造了200万台的销售规模。其推出的MIUI操作系统还免费支持30多种其他品牌的智能手机。但即使如此,黄萌称,小米手机更像是借用互联网的玩法,把营销做起来,但是小米的硬件并没有不可替代性,作为一家没有任何硬件积淀的公司,在工业设计上也没有为竞争者留下门槛。近期小米质量门也是对此的一个佐证。挥别了老式的非智能手机时代,互联网公司再凭借简单的贴牌和代工,并非易事。

发表在 互联网 | 标签为 , , , , , | 留下评论

ajax+php无刷新二级联动下拉菜单省市联动实用源码

ajax+php无刷新二级联动下拉菜单(省市联动)源码
ajax.js

var http_request = false;
function send_request(url,method) {//初始化、指定处理函数、发送请求的函数
http_request = false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest) { //Mozilla 浏览器
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {//设置MiME类别
http_request.overrideMimeType(‘text/xml’);
}
}
else if (window.ActiveXObject) { // IE浏览器
try {
http_request = new ActiveXObject(“Msxml2.XMLHTTP”);
} catch (e) {
try {
http_request = new ActiveXObject(“Microsoft.XMLHTTP”);
} catch (e) {}
}
}
if (!http_request) { // 异常,创建对象实例失败
window.alert(“不能创建XMLHttpRequest对象实例.”);
return false;
}
switch(method){
case 1: http_request.onreadystatechange = processRequest1;break;//选择操作函数
case 2: http_request.onreadystatechange = processRequest2;break;
case 3: http_request.onreadystatechange = processRequest3;break;
}
// 确定发送请求的方式和URL以及是否同步执行下段代码
http_request.open(“GET”, url, true);
http_request.send(null);
}
// 处理返回信息的函数
function processRequest1() {//操作函数1,调入省
if (http_request.readyState == 4) { // 判断对象状态
if (http_request.status == 200) { // 信息已经成功返回,开始处理信息
document.getElementById(“statusTxt”).innerHTML=”";
addOptionGroup(“province”,http_request.responseText);
} else { //页面不正常
alert(“您所请求的页面有异常。”);
}
}else {//只要未读取完成
document.getElementById(“statusTxt”).innerHTML=”正则读取数据中……”;
}
}

function processRequest2() {//操作函数2,调入市
if (http_request.readyState == 4) { // 判断对象状态
if (http_request.status == 200) { // 信息已经成功返回,开始处理信息
document.getElementById(“statusTxt”).innerHTML=”";
addOptionGroup(“city”,http_request.responseText);
} else { //页面不正常
alert(“您所请求的页面有异常。”);
}
}else {//只要未读取完成
document.getElementById(“statusTxt”).innerHTML=”正则读取数据中……”;
}
}

function processRequest3() {//操作函数3,输入省市
if (http_request.readyState == 4) { // 判断对象状态
if (http_request.status == 200) { // 信息已经成功返回,开始处理信息
document.getElementById(“statusTxt”).innerHTML=”";
document.getElementById(“district”).value=http_request.responseText;
} else { //页面不正常
alert(“您所请求的页面有异常。”);
}
}else {//只要未读取完成
document.getElementById(“statusTxt”).innerHTML=”正则读取数据中……”;
}
}

function loadProvince() {//载入省
send_request(“select.server.php?action=province”,1);//服务端处理程序,操作函数
}

function loadCity() {//载入市
document.getElementById(“district”).value=”";//清空文本框
send_request(“select.server.php?action=city&id=”+document.getElementById(“province”).value,2);
}

function inputDistrict() {//向文本框输入选定的省市
send_request(“select.server.php?action=district&id=”+document.getElementById(“province”).value+”&id1=”+document.getElementById(“city”).value,3);

}

addOption.js

function addOption(objSelectNow,txt,val)
{
/// 使用W3C标准语法为SELECT添加Option
var objOption = document.createElement(“OPTION”);
objOption.text= txt;
objOption.value=val;
objSelectNow.options.add(objOption);
}
function addOptionGroup(selectId,optGroupString)
{
var optGroup = optGroupString.split(“,”);

var objSelect = document.getElementsByTagName(“SELECT”);
var objSelectNow = objSelect[selectId];
objSelectNow.length = 1;
/// 成组添加Options
for (i=1; i<optGroup.length; i++)
{
addOption(objSelectNow, optGroup[i], i);
}
}

服务端处理程序select.server.php

<?php

Header(“Content-type:text/html;charset=GBK”);//加入头,防止乱码
$referUrl=$_SERVER['HTTP_REFERER'];//取得上一页面地址
$referHost=$_SERVER['HTTP_HOST'];//取得当前主机名
$referFile=explode(“/”,$referUrl);//取得上一前面的主机名$referFile[2]
if($referFile[2]!=$referHost)//如果上一页面与本服务端程序不在同一主机则禁止执行
{
exit();
}

$aryTree = file(“china.txt”);//加载数据文件
foreach($aryTree as $key=>$value)
{
$province[$key]=explode(“,”,trim($value));
$city[$key]=trim($value);
}

$action=$_GET["action"];
if($action==”province”||$action==”")
{//action为province时进行以下操作,输出省
$provinceStr=”";
for($i=0;$i<count($province);++$i)
{
$provinceStr.=$province[$i][0].”,”;
}
$pattern=”,$”;
$provinceStr=ereg_replace($pattern,”",$provinceStr);
echo $provinceStr;
}else if($action==”city”){//否则为province时输出市
$id=$_GET["id"];
echo $city[$id];
}else if($action==”district”){//否则为district,输出省市
$id=$_GET["id"];
$id1=$_GET["id1"];
echo $province[$id][0].$province[$id][$id1];
}else{//否则报错
echo “程序出错”;
exit();
}
?>

前台显示页面demo.htm

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
<title>ajax无刷新二级联动下拉菜单(省市联动)演示V1.0</title>
</head>
<script language=”javascript” >//加载ajax框架</script>
<script language=”javascript” >//加载对select进行操作的函数</script>

<body >
<select >
<option value=”0″ selected=”selected”>请选择</option>
</select>

<select >
<option value=”0″ selected=”selected”>请选择</option>
</select>

<input type=”text” readonly=”" />
<div ></body>
</html>

数据文件china.txt

请选择,请选择
北京,东城,西城,崇文,宣武,朝阳,丰台,石景山,海淀,门头沟,房山,通州,顺义,昌平,大兴,平谷,怀柔,密云,延庆
上海,黄浦,卢湾,徐汇,长宁,静安,普陀,闸北,虹口,杨浦,闵行,宝山,嘉定,浦东,金山,松江,青浦,南汇,奉贤,崇明
天津,和平,东丽,河东,西青,河西,津南,南开,北辰,河北,武清,红挢,塘沽,汉沽,大港,宁河,静海,宝坻,蓟县
重庆,万州,涪陵,渝中,大渡口,江北,沙坪坝,九龙坡,南岸,北碚,万盛,双挢,渝北,巴南,黔江,长寿,綦江,潼南,铜梁,大足,荣昌,壁山,梁平,城口,丰都,垫江,武隆,忠县,开县,云阳,奉节,巫山,巫溪,石柱,秀山,酉阳,彭水,江津,合川,永川,南川
河北,石家庄,邯郸,邢台,保定,张家口,承德,廊坊,唐山,秦皇岛,沧州,衡水
山西,太原,大同,阳泉,长治,晋城,朔州,吕梁,忻州,晋中,临汾,运城
内蒙古,呼和浩特,包头,乌海,赤峰,呼伦贝尔盟,阿拉善盟,哲里木盟,兴安盟,乌兰察布盟,锡林郭勒盟,巴彦淖尔盟,鄂市
辽宁,沈阳,大连,鞍山,抚顺,本溪,丹东,锦州,营口,阜新,辽阳,盘锦,铁岭,朝阳,葫芦岛
吉林,长春,吉林,四平,辽源,通化,白山,松原,白城,延边
黑龙江,哈尔滨,齐齐哈尔,牡丹江,佳木斯,大庆,绥化,鹤岗,鸡西,黑河,双鸭山,伊春,七台河,大兴安岭
江苏,南京,镇江,苏州,南通,扬州,盐城,徐州,连云港,常州,无锡,宿迁,泰州,淮安
浙江,杭州,宁波,温州,嘉兴,湖州,绍兴,金华,衢州,舟山,台州,丽水
安徽,合肥,芜湖,蚌埠,马鞍山,淮北,铜陵,安庆,黄山,滁州,宿州,池州,淮南,巢湖,阜阳,六安,宣城,亳州
福建,福州,厦门,莆田,三明,泉州,漳州,南平,龙岩,宁德
江西,南昌市,景德镇,九江,鹰潭,萍乡,新馀,赣州,吉安,宜春,抚州,上饶
山东,济南,青岛,淄博,枣庄,东营,烟台,潍坊,济宁,泰安,威海,日照,莱芜,临沂,德州,聊城,滨州,菏泽
河南,郑州,开封,洛阳,平顶山,安阳,鹤壁,新乡,焦作,濮阳,许昌,漯河,三门峡,南阳,商丘,信阳,周口,驻马店,济源
湖北,武汉,鄂州,宜昌,荆州,襄樊,黄石,荆门,黄冈,十堰,恩施,潜江,天门,仙桃,随州,咸宁,孝感
湖南,长沙,常德,株洲,湘潭,衡阳,岳阳,邵阳,益阳,娄底,怀化,郴州,永州,湘西,张家界
广东,广州,深圳,珠海,汕头,东莞,中山,佛山,韶关,江门,湛江,茂名,肇庆,惠州,梅州,汕尾,河源,阳江,清远,潮州,揭阳,云浮
广西,南宁,柳州,桂林,梧州,北海,防城港,钦州,贵港,玉林,南宁地区,柳州地区,贺州,百色,河池
海南,海口,三亚
四川,成都,绵阳,德阳,自贡,攀枝花,广元,内江,乐山,南充,宜宾,广安,达川,雅安,眉山,甘孜,凉山,泸州
贵州,贵阳,六

盘水,遵义,安顺,铜仁,黔西南,毕节,黔东南,黔南
云南,昆明,大理,曲靖,玉溪,昭通,楚雄,红河,文山,思茅,西双版纳,保山,德宏,丽江,怒江,迪庆,临沧
西藏,拉萨,日喀则,山南,林芝,昌都,阿里,那曲
陕西,西安,宝鸡,咸阳,铜川,渭南,延安,榆林,汉中,安康,商洛
甘肃,兰州,嘉峪关,金昌,白银,天水,酒泉,张掖,武威,定西,陇南,平凉,庆阳,临夏,甘南
宁夏,银川,石嘴山,吴忠,固原
青海,西宁,海东,海南,海北,黄南,玉树,果洛,海西
新疆,乌鲁木齐,石河子,克拉玛依,伊犁,巴音郭勒,昌吉,克孜勒苏柯尔克孜,博尔塔拉,吐鲁番,哈密,喀什,和田,阿克苏
香港,香港
澳门,澳门
台湾,台北,高雄,台中,台南,屏东,南投,云林,新竹,彰化,苗栗,嘉义,花莲,桃园,宜兰,基隆,台东,金门,马祖,澎湖
其它,北美洲,南美洲,亚洲,非洲,欧洲,大洋洲

发表在 代码 | 标签为 , , , , , | 留下评论

五步让你的帝国cms拥有三级联动下拉菜单教程

你还在为帝国没有联动菜单功能而发愁呢,现在不用愁了,有了 [YeeH 无限级联动类] 便可随心所欲,本教程是针对整合到帝国的针对性教程,若想更了解 [YeeH无限级联动类],可以访问教程最后的网站查看详细介绍及教程。

特别注意: YeeH无限级联动类默认是UTF-8编码,请在使用前将JS文件转换成您需要的编码。

第一步:下载最新版的 [YeeH无限级联动类],我们只需要提取Build文件中的data_china.js和selects.js到你的网站随意目录准备调用。

第二步:打开后台管理 – 数据表管理 – 管理字段 – 增加如下三个字段

字段名:pro 标识:地区(省) 输入投稿表单替换html代码:<select name=”pro”></select>
字段名:city 标识:地区(市) 输入投稿表单替换html代码:<select name=”city”></select>
字段名:area 标识:地区(县) 输入投稿表单替换html代码:<select name=”area”></select>

第三步,管理系统模型 – 修改该系统模型 – 把刚才新添加的三个字段设置为录入项等属性,并且勾选自动生成表单模版,录入和投稿都要选。

第四步,还是修改系统模型 ,这时候把下面已经生成的录入表单模版代码复制出来到你习惯的编辑器中编辑,比如DW或Editplus,在顶部增加JS调用代码,这时候就是要调用从build文件中提取的JS文件,你是不是已经放到你的站点目录了呢,那么记住你的路径,添加如下代码:

<script type=”text/javascript” src=”/路径/selects.js”></script>
<script type=”text/javascript” src=”/路径/data_china.js”></script>

然后在代码尾部增加如下代码,这是一段PHP代码+JS代码,用来判断是添加信息还是编辑信息的,添加信息的时候显示请选择地区,那么编辑信息的时候当然要读取数据库中已经添加的地区设置喽。

<?
if(empty($r[pro]))
{
?>

<script type=”text/javascript”>
var s = selects;
//获取对象
var p = document.getElementsByName(‘pro’)[0];//省
var c = document.getElementsByName(‘city’)[0];//市
var a = document.getElementsByName(‘area’)[0];//区
//绑定数据
s.bind(p,province);
s.bind(c,city);
s.bind(a,area);
//确定从属关系
s.parent(p,c);
s.parent(c,a);
//设置默认值
</script>
<?
}

else
{
?>
<script type=”text/javascript”>
var s = selects;
//获取对象
var p = document.getElementsByName(‘pro’)[0];//省
var c = document.getElementsByName(‘city’)[0];//市
var a = document.getElementsByName(‘area’)[0];//区
//绑定数据
s.bind(p,province);
s.bind(c,city);
s.bind(a,area);
//确定从属关系
s.parent(p,c);
s.parent(c,a);
//设置默认值
s.selected(p,{value:’<?=$ecmsfirstpost==1?”":htmlspecialchars(stripSlashes($r[pro]))?>’});
s.selected(c,{value:’<?=$ecmsfirstpost==1?”":htmlspecialchars(stripSlashes($r[city]))?>’});
s.selected(a,{text:’<?=$ecmsfirstpost==1?”":htmlspecialchars(stripSlashes($r[area]))?>’});
</script>
<?
}
?>

第五步,将代码粘贴回去,然后提交,从此以后千万不能再勾选自动生成表单模版了,不然你还要重新修改,提交完成了么,好,激动人心的时刻到了,去你的信息管理里面添加一条信息,看看是否已经有了非常牛X的地区三级联动了呢,添加信息以后再编辑这个信息,看看地区联动那里是不是直接显示你刚才设置的地区呢。

OK 教程就到这,我说的真的非常非常的详细了,如果你还是看不懂,那我没招了哈哈。

最新版 YeeH 无限级联动类下载地址:

http://bbs.phome.net/showthread-31-65637-0.html

发表在 代码 | 标签为 , , , , | 留下评论

php中数据的批量导入csv文件的方法

有时写程序时后台要求把大量数据导入数据库中,比如计算机考试成绩的查询、电话簿的数据等一般都是存放在excel中的,这时我们可把数据导出成csv文件,然后通过以下程序即可在后台批量导入数据到数据库中。

下面只是主要程序部分:

<?php

//定义获取时间函数
function getmicrotime(){
list($usec, $sec) = explode(” “,microtime());
return ((float)$usec + (float)$sec);
}
?>

<?php
$time_start = getmicrotime();
include(“db.inc.php”);//连接数据库
$db=new testcsv;
?>
<?php
$handle = fopen (“test.csv”,”r”);
$sql=”insert into scores(idcard,names,num,sex,nation,score) values(‘”;
while ($data = fgetcsv ($handle, 1000, “,”)) {
$num = count ($data);
for ($c=0; $c < $num; $c++) {
if($c==$num-1){$sql=$sql.$data.”‘)”;break;}
$sql=$sql.$data.”‘,’”;
}
print “<br>”;
echo $sql.”<br>”;
$db->query($sql);
echo “SQL语句执行成功!<br>”;
$sql=”insert into scores(idcard,names,num,sex,nation,score) values(‘”;
}
fclose ($handle);
$time_end = getmicrotime();
$time = $time_end – $time_start;
echo “程序执行时间:”.$time.”秒”;
?>

发表在 代码 | 标签为 , , , , | 留下评论

PHP程序员最常犯的11个MySQL错误

对于大多数web应用来说,数据库都是一个十分基础性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一份子。

对于很多新手们来说,使用PHP可以在短短几个小时之内轻松地写出具有特定功能的代码。但是,构建一个稳定可靠的数据库却需要花上一些时日和相关技能。下面列举了我曾经犯过的最严重的11个MySQL相关的错误(有些同样也反映在其他语言/数据库的使用上)。。。

1、使用MyISAM而不是InnoDB

MySQL有很多数据库引擎,但是你最可能碰到的就是MyISAM和InnoDB。

MySQL 默认使用的是MyISAM。但是,很多情况下这都是一个很糟糕的选择,除非你在创建一个非常简单抑或实验性的数据库。外键约束或者事务处理对于数据完整性 是非常重要的,但MyISAM都不支持这些。另外,当有一条记录在插入或者更新时,整个数据表都被锁定了,当使用量增加的时候这会产生非常差的运行效率。

结论很简单:使用InnoDB。

2、使用PHP的mysql函数

PHP自产生之日就提供了MySQL库函数(or near as makes no difference)。很多应用仍然在使用类似mysql_connect、mysql_query、mysql_fetch_assoc等的函数,尽管PHP手册上说:

如果你在使用MySQL v4.1.3或者更新版本,强烈推荐使用您使用mysqli扩展。

mysqli(MySQL的加强版扩展)有以下几个优点:

可选的面向对象接口
prepared表达式,这有利于阻止SQL注入攻击,还能提高性能
支持更多的表达式和事务处理
另外,如果你想支持多种数据库系统,你还可以考虑PDO。

3、没有处理用户输入

这或者可以这样说#1:永远不要相信用户的输入。用服务器端的PHP验证每个字符串,不要寄希望与JavaScript。最简单的SQL注入攻击会利用如下的代码:

$username = $_POST["name"];   $password = $_POST["password"];   $sql = “SELECT userid FROM usertable WHERE username=’$username’ AND password=’$password’;”;   // run query…

只要在username字段输入“admin’;–”,这样就会被黑到,相应的SQL语句如下:

SELECT userid FROM usertable WHERE username=’admin’;

狡猾的黑客可以以admin登录,他们不需要知道密码,因为密码段被注释掉了。

4、没有使用UTF-8

美国、英国和澳大利亚的我们很少考虑除英语之外的其他语言。我们很得意地完成了自己的“杰作”却发现它们并不能在其他地方正常运行。

UTF-8解决了很多国际化问题。虽然在PHP v6.0之前它还不能很好地被支持,但这并不影响你把MySQL字符集设为UTF-8。

5、相对于SQL,偏爱PHP

如果你接触MySQL不久,那么你会偏向于使用你已经掌握的语言来解决问题,这样会导致写出一些冗余、低效率的代码。比如,你不会使用MySQL自带的AVG()函数,却会先对记录集中的值求和然后用PHP循环来计算平均值。

此外,请注意PHP循环中的SQL查询。通常来说,执行一个查询比在结果中迭代更有效率。

所以,在分析数据的时候请利用数据库系统的优势,懂一些SQL的知识将大有裨益。

6、没有优化数据库查询

99%的PHP性能问题都是由数据库引起的,仅仅一个糟糕的SQL查询就能让你的web应用彻底瘫痪。MySQL的EXPLAIN statement、Query Profiler,还有很多其他的工具将会帮助你找出这些万恶的SELECT。

7、不能正确使用数据类型

MySQL提供了诸如numeric、string和date等的数据类型。如果你想存储一个时间,那么使用DATE或者DATETIME类型。如果这个时候用INTEGER或者STRING类型的话,那么将会使得SQL查询非常复杂,前提是你能使用INTEGER或者STRING来定义那个类型。

很多人倾向于擅自自定义一些数据的格式,比如,使用string来存储序列化的PHP对象。这样的话数据库管理起来可能会变得简单些,但会使得MySQL成为一个糟糕的数据存储而且之后很可能会引起故障。

8、在查询中使用*

永远不要使用*来返回一个数据表所有列的数据。这是懒惰:你应该提取你需要的数据。就算你需要所有字段,你的数据表也不可避免的会产生变化。

9、不使用索引或者过度使用索引

一般性原则是这样的:select语句中的任何一个where子句表示的字段都应该使用索引。

举 个例子,假设我们有一个user表,包括numeric ID(主键)和email address。登录的时候,MySQL必须以一个email为依据查找正确的ID。如果使用了索引的话(这里指email),那么MySQL就能够使用 更快的搜索算法来定位email,甚至可以说是即时实现。否则,MySQL就只能顺序地检查每一条记录直到找到正确的email address。

有的人会在每个字段上都添加索引,遗憾的是,执行了INSERT或者UPDATE之后这些索引都需要重新生成,这样就会影响性能。所以,只在需要的时候添加索引。

10、忘记备份!

虽然比较罕见,但是数据库还是有崩溃的危险。硬盘有可能损坏,服务器有可能崩溃,web主机提供商有可能会破产!丢失MySQL数据将会是灾难性的,所以请确保你已经使用了自动备份或者已经复制到位。

11、Bonus mistake-不考虑使用其他数据库

对于PHP开发人员来说,MySQL可能是使用最广泛的数据库系统,但并不是唯一的选择。PostgreSQL和Firebird是最强有力的竞争者:这个两者都是开源的,而且都没有被公司收购。微软提供了sql server Express,甲骨文提供了10g Express,这两者都是企业级数据库的免费版本。有时候,对于一个较小的web应用或者嵌入式应用,SQLite也不失为一个可行的替代方案。

发表在 代码 | 标签为 , , , | 留下评论

PHP的PDO扩展类教程

PHP的PDO类教程,阅读PHP的PDO类教程,POD扩展是在PHP5中加入,该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。PDO的目标提供一种轻型、清晰、方便的 API统一各种不同 RDBMS 库的共有特性,但不排除更高

POD扩展是在PHP5中加入,该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。
PDO的目标

提供一种轻型、清晰、方便的 API
统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。
通过 PHP 脚本提供可选的较大程度的抽象/兼容性。

PDO的特点:

性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。
能力。PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。
简单。PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。
运行时可扩展。PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。 [separator]

安装PDO
我这里是WINDOWS下开发用的PDO扩展,要是你要在Linux下安装配置,请到别的地方寻找。
版本要求:php5.1以及以后版本的程序包里已经带了;php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;手册上说5.0之前的版本不能运行PDO扩展。配置:
修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个 php.ini)把extension=php_pdo.dll前面的分号去掉,分毫是php配置文件注释符号,这个扩展是必须的。往下还有
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
各各扩展所对应的数据库是:
Driver name Supported databases
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2
你要使用哪种数据库,只要把相应的扩展前的注释符号”;”去掉就可以了。

使用PDO
我这里假设你已经装好mysql了,要是没装的话,麻烦先想办法装上,我的是mysql5.0.22,黑夜路人用的是MySQL 4.0.26也可以用。
数据库的连接:
我们通过下面的例子来分析PDO连接数据库,
<?php
$dbms=’mysql’;     //数据库类型 oracle 用ODI,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了
$host=’localhost’; //数据库主机名
$dbName=’test’;    //使用的数据库
$user=’root’;      //数据库连接用户名
$pass=”;          //对应的密码
$dsn=”$dbms:host=$host;dbname=$dbName”;
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$dbh
echo “连接成功<br/>”;
/*你还可以进行一次搜索操作
foreach ($dbh->query(‘Select * from FOO’) as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
$dbh = null;
} catch (PDOException $e) {
die (“Error!: ” . $e->getMessage() . “<br/>”);
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
?>

数据库查询:
上面我们已经进行了一次查询,我们还可以使用如下的查询:
<?php
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); //设置属性
$rs = $db->query(“Select * FROM foo”);
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>

以上因为用到setAttribute()方法,放上那两个参数,把字段名强制转换成大写。下面列出多有PDO::setAttribute()的参数: PDO::ATTR_CASE: 强制列名变成一种格式,详细如下(第二个参数):

PDO::CASE_LOWER: 强制列名是小写.
PDO::CASE_NATURAL: 列名按照原始的方式
PDO::CASE_UPPER: 强制列名为大写.
PDO::ATTR_ERRMODE: 错误提示.
PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码.
PDO::ERRMODE_WARNING: 显示警告错误.
PDO::ERRMODE_EXCEPTION: 抛出异常.
PDO::ATTR_ORACLE_NULLS (不仅仅是ORACLE有效,别的数据库也有效): )指定数据库返回的NULL值在php中对应的数值。
PDO::NULL_NATURAL: 不变.
PDO::NULL_EMPTY_STRING: Empty string is converted to NULL.
PDO::NULL_TO_STRING: NULL is converted to an empty string.
PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requires bool.
PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requires array(string classname, array(mixed constructor_args)).
PDO::ATTR_AUTOCOMMIT (available in OCI, Firebird and MySQL): Whether to autocommit every single statement.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (available in MySQL): Use buffered queries.
例子中的$rs->setFetchMode(PDO::FETCH_ASSOC);是PDOStatement::setFetchMode(),对返回类型的声明。
有如下:
PDO::FETCH_ASSOC — 关联数组形式
PDO::FETCH_NUM   — 数字索引数组形式
PDO::FETCH_BOTH  — 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ    — 按照对象的形式,类似于以前的 mysql_fetch_object()
更多返回类型声明(PDOStatement::方法名)看手册。

插入,更新,删除数据,
$db->exec(“Delete FROM `xxxx_menu` where mid=43″);

简单的总结一下上面的操作:
查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO::query()主要是用于有记录结果返回的操作,特别是Select操作,
PDO::exec()主要是针对没有结果集合返回的操作,比如Insert、Update、Delete等操作,它返回的结果是当前操作影响的列数。
PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。

获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL()。
PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段。
PDOStatement::fetch() 是用来获取一条记录,
PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。

另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。
PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行Delete、Insert、Update操作影响的结果集,对PDO::exec()方法和Select操作无效。

发表在 代码 | 标签为 , , , | 留下评论

PHP的PDO扩展函数库详解

PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力;与ADODB和MDB2相比,PDO更高效。
目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择。

PDO中包含三个预定义的类

PDO中包含三个预定义的类,它们分别是 PDO、PDOStatement 和 PDOException。

一、PDO

PDO->beginTransaction() — 标明回滚起始点
PDO->commit() — 标明回滚结束点,并执行SQL
PDO->__construct() — 建立一个PDO链接数据库的实例
PDO->errorCode() — 获取错误码
PDO->errorInfo() — 获取错误的信息
PDO->exec() — 处理一条SQL语句,并返回所影响的条目数
PDO->getAttribute() — 获取一个“数据库连接对象”的属性
PDO->getAvailableDrivers() — 获取有效的PDO驱动器名称
PDO->lastInsertId() — 获取写入的最后一条数据的主键值
PDO->prepare() — 生成一个“查询对象”
PDO->query() — 处理一条SQL语句,并返回一个“PDOStatement”
PDO->quote() — 为某个SQL中的字符串添加引号
PDO->rollBack() — 执行回滚
PDO->setAttribute() — 为一个“数据库连接对象”设定属性

二、PDOStatement

PDOStatement->bindColumn() — Bind a column to a PHP variable
PDOStatement->bindParam() — Binds a parameter to the specified variable name
PDOStatement->bindValue() — Binds a value to a parameter
PDOStatement->closeCursor() — Closes the cursor, enabling the statement to be executed again.
PDOStatement->columnCount() — Returns the number of columns in the result set
PDOStatement->errorCode() — Fetch the SQLSTATE associated with the last operation on the statement handle
PDOStatement->errorInfo() — Fetch extended error information associated with the last operation on the statement handle
PDOStatement->execute() — Executes a prepared statement
PDOStatement->fetch() — Fetches the next row from a result set
PDOStatement->fetchAll() — Returns an array containing all of the result set rows
PDOStatement->fetchColumn() — Returns a single column from the next row of a result set
PDOStatement->fetchObject() — Fetches the next row and returns it as an object.
PDOStatement->getAttribute() — Retrieve a statement attribute
PDOStatement->getColumnMeta() — Returns metadata for a column in a result set
PDOStatement->nextRowset() — Advances to the next rowset in a multi-rowset statement handle
PDOStatement->rowCount() — Returns the number of rows affected by the last SQL statement
PDOStatement->setAttribute() — Set a statement attribute
PDOStatement->setFetchMode() — Set the default fetch mode for this statement

PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力;与ADODB和MDB2相比,PDO更高效。目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择。

PDO中包含三个预定义的类

PDO中包含三个预定义的类,它们分别是 PDO、PDOStatement 和 PDOException。

一、PDO

PDO->beginTransaction() — 标明回滚起始点
PDO->commit() — 标明回滚结束点,并执行SQL
PDO->rollBack() — 执行回滚
PDO->__construct() — 建立一个PDO链接数据库的实例
PDO->errorCode() — 获取错误码
PDO->errorInfo() — 获取错误的信息
PDO->exec() — 处理一条SQL语句,并返回所影响的条目数
PDO->getAttribute() — 获取一个“数据库连接对象”的属性
PDO->getAvailableDrivers() — 获取有效的PDO驱动器名称
PDO->lastInsertId() — 获取写入的最后一条数据的主键值
PDO->prepare() — 生成一个“查询对象”
PDO->query() — 处理一条SQL语句,并返回一个“PDOStatement”
PDO->quote() — 为某个SQL中的字符串添加引号
PDO->setAttribute() — 为一个“数据库连接对象”设定属性

详解1) PDO中的数据库连接
$dsn = ‘mysql:dbname=ent;host=127.0.0.1′;
$user = ‘root’;
$password = ‘123456′;
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_PERSISTENT => true));
$dbh->query(‘set names utf8;’);
foreach ($dbh->query(‘SELECT * from tpm_juese’) as $row) {
print_r($row);
}
} catch (PDOException $e) {
echo ‘Connection failed: ‘ . $e->getMessage();
}

许多Web应用会因为使用了向数据库的持久连接而得到优化。持久连接不会在脚本结束时关闭,
相反它会被缓存起来并在另一个脚本通过同样的标识请求一个连接时得以重新利用。
持久连接的缓存可以使你避免在脚本每次需要与数据库对话时都要部署一个新的连接的资源消耗,让你的Web应用更加快速。
上面实例中的array(PDO::ATTR_PERSISTENT => true)就是把连接类型设置为持久连接。

详解2) PDO中的事务
PDO->beginTransaction(),PDO->commit(),PDO->rollBack()这三个方法是在支持回滚功能时一起使用的。PDO->beginTransaction()方法标明起始点,PDO->commit()方法标明回滚结束点,并执行SQL,PDO->rollBack()执行回滚。
<?php
try {
$dbh = new PDO(‘mysql:host=localhost;dbname=test’, ‘root’, ”);
$dbh->query(‘set names utf8;’);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->beginTransaction();
$dbh->exec(”INSERT INTO `test`.`table` (`name` ,`age`)VALUES (‘mick’, 22);”);
$dbh->exec(”INSERT INTO `test`.`table` (`name` ,`age`)VALUES (‘lily’, 29);”);
$dbh->exec(”INSERT INTO `test`.`table` (`name` ,`age`)VALUES (‘susan’, 21);”);
$dbh->commit();

} catch (Exception $e) {
$dbh->rollBack();
echo “Failed: ” . $e->getMessage();
}
?>
现在你已经通过PDO建立了连接,在部署查询之前你必须搞明白PDO是怎样管理事务的。如果你以前从未遇到过事务处理,(现在简单介绍一下:)它们提供了4个主要的特性:原子性,一致性,独立性和持久性(Atomicity, Consistency, Isolation and Durability,ACID)通俗一点讲,一个事务中所有的工作在提交时,即使它是分阶段执行的,也要保证安全地应用于数据库,不被其他的连接干扰。事务工作也可以在请求发生错误时轻松地自动取消。

事务的典型运用就是通过把批量的改变“保存起来”然后立即执行。这样就会有彻底地提高更新效率的好处。换句话说,事务可以使你的脚本更快速同时可能更健壮(要实现这个优点你仍然需要正确的使用它们)。

不幸运的是,并不是每个数据库都支持事务,因此PDO需要在建立连接时运行在被认为是“自动提交”的模式下。自动提交模式意味着你执行的每个查询都有它自己隐含的事务处理,无论数据库支持事务还是因数据库不支持而不存在事务。如果你需要一个事务,你必须使用 PDO->beginTransaction() 方法创建一个。如果底层驱动不支持事务处理,一个PDOException就会被抛出(与你的异常处理设置无关,因为这总是一个严重的错误状态)。在一个事物中,你可以使用 PDO->commit() 或 PDO->rollBack() 结束它,这取决于事务中代码运行是否成功。

当脚本结束时或一个连接要关闭时,如果你还有一个未处理完的事务,PDO将会自动将其回滚。这是对于脚本意外终止的情况来说是一个安全的方案——如果你没有明确地提交事务,它将会假设发生了一些错误,为了你数据的安全,所以就执行回滚了。

二、PDOStatement

PDOStatement->bindColumn() — Bind a column to a PHP variable
PDOStatement->bindParam() — Binds a parameter to the specified variable name
PDOStatement->bindValue() — Binds a value to a parameter
PDOStatement->closeCursor() — Closes the cursor, enabling the statement to be executed again.
PDOStatement->columnCount() — Returns the number of columns in the result set
PDOStatement->errorCode() — Fetch the SQLSTATE associated with the last operation on the statement handle
PDOStatement->errorInfo() — Fetch extended error information associated with the last operation on the statement handle
PDOStatement->execute() — Executes a prepared statement
PDOStatement->fetch() — Fetches the next row from a result set
PDOStatement->fetchAll() — Returns an array containing all of the result set rows
PDOStatement->fetchColumn() — Returns a single column from the next row of a result set
PDOStatement->fetchObject() — Fetches the next row and returns it as an object.
PDOStatement->getAttribute() — Retrieve a statement attribute
PDOStatement->getColumnMeta() — Returns metadata for a column in a result set
PDOStatement->nextRowset() — Advances to the next rowset in a multi-rowset statement handle
PDOStatement->rowCount() — Returns the number of rows affected by the last SQL statement
PDOStatement->setAttribute() — Set a statement attribute
PDOStatement->setFetchMode() — Set the default fetch mode for this statement

三、PDOException

PDO 提供了3中不同的错误处理策略。
1. PDO::ERRMODE_SILENT
这是默认使用的模式。PDO会在statement和database对象上设定简单的错误代号,你可以使用PDO->errorCode() 和 PDO->errorInfo() 方法检查错误;如果错误是在对statement对象进行调用时导致的,你就可以在那个对象上使用 PDOStatement->errorCode() 或 PDOStatement->errorInfo() 方法取得错误信息。而如果错误是在对database对象调用时导致的,你就应该在这个database对象上调用那两个方法。
2. PDO::ERRMODE_WARNING
作为设置错误代号的附加,PDO将会发出一个传统的E_WARNING信息。这种设置在除错和调试时是很有用的,如果你只是想看看发生了什么问题而不想中断程序的流程的话。
3. PDO::ERRMODE_EXCEPTION
作为设置错误代号的附件,PDO会抛出一个PDOException异常并设置它的属性来反映错误代号和错误信息。这中设置在除错时也是很有用的,因为他会有效的“放大(blow up)”脚本中的出错点,非常快速的指向一个你代码中可能出错区域。(记住:如果异常导致脚本中断,事务处理回自动回滚。)
异常模式也是非常有用的,因为你可以使用比以前那种使用传统的PHP风格的错误处理结构更清晰的结构处理错误,比使用安静模式使用更少的代码及嵌套,也能够更加明确地检查每个数据库访问的返回值。
关于PHP中异常的更多信息请看Exceptions章节
PDO 使用基于SQL-92 SQLSTATE 的错误代号字符串;特定的PDO驱动应当将自己本身的代号对应到适当的SQLSTATE代号上。PDO->errorCode() 方法只返回单一的SQLSTATE代号。如果你需要关于一个错误的更加有针对性的信息,PDO也提供了一个PDO->errorInfo()方法,它可以返回一个包含了SQLSTATE代号,特定数据库驱动的错误代号和特定数据库驱动的错误说明字符串。
<?php
// 修改默认的错误显示级别
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
?>

属性列表:
PDO::PARAM_BOOL
表示一个布尔类型
PDO::PARAM_NULL
表示一个SQL中的NULL类型
PDO::PARAM_INT
表示一个SQL中的INTEGER类型
PDO::PARAM_STR
表示一个SQL中的SQL CHAR,VARCHAR类型
PDO::PARAM_LOB
表示一个SQL中的large object类型
PDO::PARAM_STMT
表示一个SQL中的recordset类型,还没有被支持
PDO::PARAM_INPUT_OUTPUT
Specifies that the parameter is an INOUT parameter for a stored procedure. You must bitwise-OR this value with an explicit PDO::PARAM_* data type.
PDO::FETCH_LAZY
将每一行结果作为一个对象返回
PDO::FETCH_ASSOC
仅仅返回以键值作为下标的查询的结果集,名称相同的数据只返回一个
PDO::FETCH_NAMED
仅仅返回以键值作为下标的查询的结果集,名称相同的数据以数组形式返回
PDO::FETCH_NUM
仅仅返回以数字作为下标的查询的结果集
PDO::FETCH_BOTH
同时返回以键值和数字作为下标的查询的结果集
PDO::FETCH_OBJ
以对象的形式返回结果集
PDO::FETCH_BOUND
将PDOStatement::bindParam()和PDOStatement::bindColumn()所绑定的值作为变量名赋值后返回
PDO::FETCH_COLUMN
表示仅仅返回结果集中的某一列
PDO::FETCH_CLASS
表示以类的形式返回结果集
PDO::FETCH_INTO
表示将数据合并入一个存在的类中进行返回
PDO::FETCH_FUNC
PDO::FETCH_GROUP
PDO::FETCH_UNIQUE
PDO::FETCH_KEY_PAIR
以首个键值下表,后面数字下表的形式返回结果集
PDO::FETCH_CLASSTYPE
PDO::FETCH_SERIALIZE
表示将数据合并入一个存在的类中并序列化返回
PDO::FETCH_PROPS_LATE
Available since PHP 5.2.0
PDO::ATTR_AUTOCOMMIT
在设置成true的时候,PDO会自动尝试停止接受委托,开始执行
PDO::ATTR_PREFETCH
设置应用程序提前获取的数据大小,并非所有的数据库哦度支持
PDO::ATTR_TIMEOUT
设置连接数据库超时的值
PDO::ATTR_ERRMODE
设置Error处理的模式
PDO::ATTR_SERVER_VERSION
只读属性,表示PDO连接的服务器端数据库版本
PDO::ATTR_CLIENT_VERSION
只读属性,表示PDO连接的客户端PDO驱动版本
PDO::ATTR_SERVER_INFO
只读属性,表示PDO连接的服务器的meta信息
PDO::ATTR_CONNECTION_STATUS
PDO::ATTR_CASE
通过PDO::CASE_*中的内容对列的形式进行操作
PDO::ATTR_CURSOR_NAME
获取或者设定指针的名称
PDO::ATTR_CURSOR
设置指针的类型,PDO现在支持PDO::CURSOR_FWDONLY和PDO::CURSOR_FWDONLY
PDO::ATTR_DRIVER_NAME
返回使用的PDO驱动的名称
PDO::ATTR_ORACLE_NULLS
将返回的空字符串转换为SQL的NULL
PDO::ATTR_PERSISTENT
获取一个存在的连接
PDO::ATTR_STATEMENT_CLASS
PDO::ATTR_FETCH_CATALOG_NAMES
在返回的结果集中,使用自定义目录名称来代替字段名。
PDO::ATTR_FETCH_TABLE_NAMES
在返回的结果集中,使用自定义表格名称来代替字段名。
PDO::ATTR_STRINGIFY_FETCHES
PDO::ATTR_MAX_COLUMN_LEN
PDO::ATTR_DEFAULT_FETCH_MODE
Available since PHP 5.2.0
PDO::ATTR_EMULATE_PREPARES
Available since PHP 5.1.3.
PDO::ERRMODE_SILENT
发生错误时不汇报任何的错误信息,是默认值
PDO::ERRMODE_WARNING
发生错误时发出一条php的E_WARNING的信息
PDO::ERRMODE_EXCEPTION
发生错误时抛出一个PDOException
PDO::CASE_NATURAL
回复列的默认显示格式
PDO::CASE_LOWER
强制列的名字小写
PDO::CASE_UPPER
强制列的名字大写
PDO::NULL_NATURAL
PDO::NULL_EMPTY_STRING
PDO::NULL_TO_STRING
PDO::FETCH_ORI_NEXT
获取结果集中的下一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_PRIOR
获取结果集中的上一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_FIRST
获取结果集中的第一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_LAST
获取结果集中的最后一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_ABS
获取结果集中的某一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_REL
获取结果集中当前行后某行的数据,仅在有指针功能时有效
PDO::CURSOR_FWDONLY
建立一个只能向后的指针操作对象
PDO::CURSOR_SCROLL
建立一个指针操作对象,传递PDO::FETCH_ORI_*中的内容来控制结果集
PDO::ERR_NONE (string)
设定没有错误时候的错误信息
PDO::PARAM_EVT_ALLOC
Allocation event
PDO::PARAM_EVT_FREE
Deallocation event
PDO::PARAM_EVT_EXEC_PRE
Event triggered prior to execution of a prepared statement.
PDO::PARAM_EVT_EXEC_POST
Event triggered subsequent to execution of a prepared statement.
PDO::PARAM_EVT_FETCH_PRE
Event triggered prior to fetching a result from a resultset.
PDO::PARAM_EVT_FETCH_POST
Event triggered subsequent to fetching a result from a resultset.
PDO::PARAM_EVT_NORMALIZE
Event triggered during bound parameter registration allowing the driver to normalize the parameter name.

发表在 代码 | 标签为 , , , , | 留下评论