HarmonyOS简史

2024-02-01 HarmonyOS HarmonyOS

2012年10月8日,美国对中兴和华为两家公司发起了调查和国会听证,使得这两家国内顶尖通信公司的美国扩张之路遭遇重挫。危机之下,华为开始规划适用于物联网嵌入式设备的自有操作系统操作系统——LiteOS。LiteOS可以理解为是鸿蒙的前身。

2019年5月19日,Google母公司Alphabet暂停向华为转让硬件、软件和技术服务。这意味着华为将失去对Android操作系统的全部使用权限,华为只可以使用开放源代码源项目(AOSP)继续使用Android系统,而不能使用Google服务例如Gmail、Google Play和Youtube等。

2019年5月24日,国家知识产权局商标局网站显示,华为已经申请注册“华为鸿蒙”商标,申请日期是2018年8月24日,注册公告日期是2019年5月14日。在商品名称一栏中,“华为鸿蒙”可应用于操作系统程序、计算机操作程序、计算机操作软件等等,进一步佐证了华为自有操作系统命名为“鸿蒙”的可能性。

2019年8月9日,在华为开发者大会上正式发布HarmonyOS(鸿蒙)——一套基于微内核的全场景分布式OS。彼时的HarmonyOS的内核支持LiteOS、Linux内核等。同时余承东也表示,下一代鸿蒙OS会以开源方式吸收开发者的力量。

2020年8月7日,在中国信息化百人会2020年峰会上,余承东表示,鸿蒙截至2020年8月已经应用到华为智慧屏、华为手表上,未来有信心应用到1+8+N全场景终端设备上。

2020年9月10日,在华为开发者大会上正式发布HarmonyOS 2.0。HarmonyOS 2.0正在试图打造一个“超级虚拟终端”,打破硬件边界,通过将不同职能设备串联在一起,使其融入全场景智慧生态,轻松构筑全场景创新体验。余承东表示,2020年12月份将面向开发者提供HarmonyOS 2.0的beta版本用于支持手机的开发。会上同时发布了开源项目OpenHarmony 1.0,可支持128KB-128MB的内存设备。OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的,用于搭建一个智能终端设备操作系统的框架和平台,也是HarmonyOS的底座。

2020年12月16日,华为正式发布HarmonyOS 2.0手机开发者Beta版本,这意味着HarmonyOS能够覆盖手机应用场景。

2021年4月22日,华为HarmonyOS应用开发在线体验网站上线。

2021年6月2日,华为正式发布HarmonyOS 2及多款搭载HarmonyOS 2的新产品。这也意味着“搭载HarmonyOS的手机”已经变成面向市场的正式产品。

2021年6月3日,我爱我家宣布,在业内率先实现基于鸿蒙系统的APP应用支持。

2021年7月29日,华为举办新品发布会表示,从6月2日开启升级后,到7月29日晚为止,鸿蒙系统升级用户已突破4000万。

2021年9月23日,华为官宣鸿蒙系统升级用户已经突破1.2亿,平均每天超100万用户升级鸿蒙,已经成为迄今全球用户增长速度最快的移动操作系统。

2021年10月14日,美的发布了美的物联网操作系统1.0,是首个基于鸿蒙OpenHarmony 2.0的全场景智能家居操作系统。

2021年10月22日,HarmonyOS智能座舱DEMO版首次亮相华为开发者大会。

2021年10月27日,Eclipse基金会发布公告,宣布推出基于开源鸿蒙OpenHarmony的操作系统Oniro。

2021年11月9日,于北京举行的“操作系统产业峰会 2021”宣布鸿蒙已经实现了内核技术共享,未来将进一步在分布式软总线、安全OS、设备驱动框架、以及新编程语言等方面实现共享。通过能力共享,实现生态互通及云边端协同,更好地服务数字化全场景。

2021年11月17日,鸿蒙迎来第三批开源,新增开源组件769个,涉及工具、网络、文件数据、UI、框架、动画图形及音视频7大类。鸿蒙前两次开源已上线超过700个Java/JS组件。

2021年12月23日,华为冬季旗舰新品发布会,华为宣布搭载鸿蒙HarmonyOS设备数突破 2.2 亿。

2021年12月23日,华为冬季旗舰新品发布会上,搭载HarmonyOS智能座舱正式亮相,AITO问界M5成为首款搭载HarmonyOS智能座舱的车型。

2022年1月12日,HarmonyOS服务开放平台正式发布。

2022年6月15日,华为鸿蒙Harmony OS 3.0开发者Beta版已经开启了公测。

2022年7月27日,华为召开了新品发布会,发布鸿蒙HarmonyOS 3系统。会上余承东表示,截止到2022年7月,搭载鸿蒙2.0的华为终端设备已经突破了3亿。HarmonyOS Connect产品发货量突破1.7亿。

2023年8月4日,在华为开发者大会上,华为发布HarmonyOS 4、全新升级的鸿蒙开发套件、HarmonyOS Next开发者预览版本等一系列领先技术。会上余承东表示,自2019年HarmonyOS问世以来,鸿蒙生态的设备数量已超过7亿,已有220万HarmonyOS开发者投入到鸿蒙世界的开发。OpenHarmony已成为开源鸿蒙的根社区,位居Gitee指数第1名,已有5100名社区代码贡献者加入,华为也将持续投入OpenHarmony开源项目共建,使能千行百业。华为还公布了HarmonyOS NEXT开发者预览版计划,2023年8月起面向企业开发者开放,2024年第一季度面向所有开发者开放。据介绍,HarmonyOS NEXT系统底座全线自研,去掉了传统的AOSP代码,仅支持鸿蒙内核和鸿蒙系统的应用,减少了40%的冗余代码,使系统的流畅度、能效、纯净安全特性大为提升。

2023年11月23日,阿里钉钉、蚂蚁集团 旗下的移动开发平台mPaaS与华为达成合作,正式启动鸿蒙原生应用的开发。

2023年11月24日,小红书已完成鸿蒙原生应用Beta版本开发。

2023年11月27日,B站与华为达成合作,正式启动鸿蒙原生应用的开发。

2023年11月30日,58集团与华为达成合作,宣布旗下58同城、安居客将启动鸿蒙原生应用的开发。

2023年12月1日,高德地图与华为达成合作,将启动鸿蒙原生应用的开发。

2023年12月6日,麦当劳中国启动鸿蒙原生应用开发。

2023年12月8日,支付宝宣布启动鸿蒙原生应用开发。

2023年12月11日,同花顺已完成鸿蒙原生应用beta版本,并正在进行全量版本开发。

2023年12月15日,网易游戏与华为达成合作,将启动鸿蒙原生应用的开发。

2023年12月18日,米哈游将启动鸿蒙原生应用的开发。

2024年1月18日,华为举行鸿蒙生态千帆启航仪式,会上宣布HarmonyOS NEXT鸿蒙星河版系统开发者预览版开放申请。据介绍,鸿蒙星河版将实现原生精致、原生应用、原生流畅、原生安全、原生智能、原生互联六大极致原生体验。HarmonyOS NEXT 开发者预览版将不再兼容安卓开源应用,仅支持鸿蒙内核和系统的应用,因此被称为“纯血鸿蒙”。本次会上,余承东表示鸿蒙内核超越传统内核,更适应全场景设备多样化。鸿蒙系统是真正的操作系统,从编程语言到编译器都是全栈自研。截至当日,鸿蒙生态设备增长至8亿,首批200多家合作伙伴正在加速开发鸿蒙原生应用。合作伙伴开放垂域创新能力,三方SDK鸿蒙化,共同为开发者提供高效的全链路开发工具、能力。这意味着HarmonyOS NEXT生态版图已基本成型,正式揭开鸿蒙进阶新篇章。

2024年4月17日,第21届华为分析师大会在深圳开幕。华为副董事长、轮值董事长徐直军在大会上透露,华为希望通过2024年一年的时间,先在中国市场把智能手机上使用超过99%时间的5000个应用全面迁移到鸿蒙原生操作系统上,真正实现操作系统和应用生态的统一。现在5000多个应用里面,有4000多个应用已经明确了迁移计划,还有不到1000个应用正在沟通中,“当把这5000个应用以及其它成千上万的应用都从安卓生态迁移到鸿蒙操作系统上时,我们的鸿蒙操作系统就真正完成了打造,并真正成为除了苹果iOS和谷歌安卓外的全球第三个移动操作系统。”

  HarmonyOS开发找不到模块“@ohos.application.context”JDK 22发布  

Way Lau

Software Engineer and Full Stack Developer, now work and live in Shenzhen, China. Detail

Contact

Donate

See the list of Donors.


Code licensed under MIT,documentation under CC BY-NC-SA 3.0 CN

Copyright © 2009-2024 老卫(柳伟卫)的博客 – 关注编程、系统架构、性能优化

步韵和诗四首

步韵《灌水帖赠格格》

笑天

春风拂处少年狂,

且把半壶倾一觞。

来处虎龙翻海岳,

隐时猫蝶捉迷藏。

窍心有孔通犀角,

口舌如刀断法章。

莫笑群中多刷子,

乌鸡附得凤朝阳。

步九爷韵·戏说九龙灌水

文/孔子登山

为你花痴为你狂,

九龙醉卧半壶觞。

甘填欲壑村中隐,

难掩春心眸底藏。

梨压海棠铺被卷,

耳磨潘鬓论诗章。

昨宵缠斗不眠久,

今又偕行往邵阳。

步九爷韵赠格格

陈立田

经年未许减疏狂,

感概临风自把觞。

沧海归来今小隐,

文林契阔已深藏。

一枝拈得花无缺,

百韵初成腹有章。

最是扫眉才子笔,

沾香焕彩入春阳。

步九爷韵•自吟

文/乐天

点墨胸无未敢狂,

自娱自乐亦三觞。

一身傻气朝天去,

两缕清风往袖藏。

别个拈花当有本,

余何摘句不成章?

功名声色东家事,

只对卿卿说夕阳。

步九爷雅韵凑句:戏赠格格

文/肖若威

道韫何曾斗酒狂,

满壶清照女儿觞。

招摇过市行人醉,

小隐于林飞蝶藏。

信手皆成朱笔画,

随言尽是锦云章。

明心养性谁同悟,

白首吟诗共夕阳。

也谈押韵

音韵与审押韵、察平仄前几讲,讲述了古代汉语音韵的基本知识:声母、韵母、声调和标音。从本讲开始,讲述运用这些知识,解决古代诗文阅读中的问题。一运用音韵知识审察押韵押韵,就是在诗词歌赋中,某些句子的末尾用同韵(即韵腹、韵尾相同)的字,使得音调和谐悦耳。作古体诗,一般依照古韵;作近体诗,则按韵书规定。《平水韵》反映了唐宋用韵的部类;直至现代,人们作近体诗,仍然依照《平水韵》。宋词根据宋代实际语音用韵;今人作词依据清朝人编撰的《词林正韵》。作曲用韵按照《中原音韵》。古人所作的诗词歌赋,即使今天读起来仍然押韵,古今语音也是有差别的;更不用说有些作品今天读起来已经不押韵了。我们学习音韵知识,要明白它们在当时都是押韵的。岂曰无衣?与子同袍。王于兴师,修我戈矛。与子同仇!岂曰无衣?与子同泽。王于兴师,修我矛戟。与子偕作!岂曰无衣?与子同裳。王于兴师,修我甲兵。与子偕行!(《诗·秦风·无衣》)——第一章“袍、矛、仇”,同属阴声韵幽部[u];今“袍、矛”韵母为ao,“仇”为ou。第二章“泽、戟、作”,同属入声韵铎部[ak],今“泽”为e,“戟”为i,“作”为uo。第三章“裳、兵、行”,同属阳声韵阳部[aŋ],今“裳”为ang,“兵、行”为ing。春城无处不飞花,寒食东风御柳斜。日暮汉宫传蜡烛,轻烟散入五侯家。(韩翃 《寒食》)——“花、家、斜”,在《平水韵》中同属麻部。麻部在《中原音韵》中分化为家麻、车遮两部;到现代普通话演变为a、e,“花、家”韵母为a、ia,“斜”韵母为ie。东皋薄暮望,徙倚欲何依。树树皆秋色,山山唯落晖。牧人驱犊返,猎马带禽归。相顾无相识,长歌怀采薇。(王绩《野望》)——“依、晖、归、薇”,在《平水韵》中同属微部;微部在《中原音韵》中归入齐微部;到现代普通话分化为i、ei,“依”韵母为i,“晖、归、薇”韵母为ei。风急天高猿啸哀,渚清沙白鸟飞回。无边落木萧萧下,不尽长江滚滚来。万里悲秋常作客,百年多病独登台。艰难苦恨繁霜鬓,潦倒新停浊酒杯。(杜甫《登高》)——“哀、回、来、台、杯”,《平水韵》中同属灰部。灰部在《中原音韵》中部分归入齐微部,部分归入皆来部;到现代普通话,齐微部中分化出ei,皆来部演变为ai,“哀、来、台” 韵母为ai,“回、杯”韵母为ei。六王毕,四海一。蜀山兀 ,阿房出。(杜牧《阿房宫赋》开头)——“毕、一、兀、出”,在《平水韵》中“毕、一、出”属入声质部,“兀”属入声月部,“质、月”音近,可以合韵。到《中原音韵》入声韵消失,归入阴声韵;现代普通话中“毕、一”韵母为i,“兀、出”韵母为u。千古江山,英雄无觅孙仲谋处。舞榭歌台,风流总被雨打风吹去。斜阳草树,寻常巷陌,人道寄奴曾住。想当年,金戈铁马,气吞万里如虎。(辛弃疾《永遇乐·京口北固亭怀古》上阙)——“处、去、住、虎”,《词林正韵》为第四部仄声(语、噳、姥、御、遇、暮通用),《中原音韵》为鱼模部;现代普通话分化为u、ü,“处、住、虎”为u,“去”为ü。二运用音韵知识审察平仄讲究平仄,是近体诗和词的显著特点之一。平仄相间,语音就有了抑扬顿挫之美。如一首“仄起仄收式”五律,平仄安排是这样的(括号表示可平可仄):(仄)仄平平仄,平平(仄)仄平。(平)平平仄仄,(仄)仄仄平平。(仄)仄平平仄,平平(仄)仄平。(平)平平仄仄,(仄)仄仄平平。需要注意,古代诗词中的平仄,不能用现代普通话的声调来看。古代的入声字在演变为现代普通话(入派四声)时,有的派入平声了,特别要注意识别这种仄声字。下面是一首“仄起仄收式”五律:好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。(杜甫《春夜喜雨》)——这首诗有7个入声字:“节、发、入、物、黑、独、湿”。其中“入、物”二字,在普通话里读仄声去声;“节、发、黑、独、湿”5个字,在普通话里读平声。这5个字,若按普通话读,则不符合平仄要求。此外,“俱”,普通话读jù,古代读jū;“看”,普通话里有kān和kàn两个读音,古代都读kān。这两个字按普通话读,也不符合平仄要求。不仅近体诗讲究平仄,词也讲究。词牌“浣溪沙”平仄安排是这样的:(仄)仄(平)平(仄)仄平,(平)平(仄)仄仄平平。(平)平(仄)仄仄平平。(仄)仄(平)平平仄仄,(平)平(仄)仄仄平平。(平)平(仄)仄仄平平。下面是一首《浣溪沙》(作者晏殊):一曲新词酒一杯,去年天气旧亭台。夕阳西下几时回。 无可奈何花落去,似曾相识燕归来。小园香径独徘徊。——这首词有4个入声字:“曲、落、识、独”。其中,“曲、落”二字,普通话读仄声;“识、独”二字,普通话读平声。“识、独”,若按普通话读,则不合平仄要求。最后,需要说明,学习古汉语音韵,只要求审察押韵和平仄,而不是要求照古音读。

PHP中的GD库操作指南

PHP中的GD库操作指南
王林
发布: 2023-05-20 14:40:40
原创
3059人浏览过

一、什么是gd库?

GD库是一组用于创建和处理各种图像格式的库函数,是PHP中最为常用的图像处理库之一。

二、安装GD库

在CentOS/RedHat下安装GD库

1.安装PHP的GD扩展库
yum install php-gd

2.重启web服务器
service httpd restart

3.查看PHP支持的GD库版本
php -i | grep -i gd

在Ubuntu/Debian下安装GD库

1.安装php5-gd模块
apt-get update && apt-get install php5-gd

2.重启web服务器
service apache2 restart

3.查看PHP支持的GD库版本
php -i | grep -i gd

三、GD库的基本操作

1.创建图像

1)创建一个200X200像素的黑色图像
$image = imagecreate(200,200);
$black = imagecolorallocate($image,0,0,0);
imagefill($image,0,0,$black);

2)在图像中添加文本
$white = imagecolorallocate($image,255,255,255);
$text = ‘Hello, GD!’;
imagettftext($image,20,0,70,100,$white,’arial.ttf’,$text);

3)保存图像到文件
imagepng($image,’test.png’);

4)释放内存
imagedestroy($image);

2.图像处理

1)缩放图像
$src_image = imagecreatefrompng(‘test.png’);
$src_width = imagesx($src_image);
$src_height = imagesy($src_image);
$new_width = $src_width * 0.5;
$new_height = $src_height * 0.5;
$new_image = imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($new_image,$src_image,0,0,0,0,$new_width,$new_height,$src_width,$src_height);
imagepng($new_image,’test-resized.png’);

2)添加边框
$border_color = imagecolorallocate($new_image,128,128,128);
imagerectangle($new_image,0,0,$new_width-1,$new_height-1,$border_color);
imagepng($new_image,’test-bordered.png’);

3)裁剪图像
$cropped_image = imagecrop($new_image,[‘x’=>40,’y’=>40,’width’=>100,’height’=>100]);
imagepng($cropped_image,’test-cropped.png’);

4)模糊图像
$blurred_image = imagefilter($new_image,IMG_FILTER_GAUSSIAN_BLUR);
imagepng($blurred_image,’test-blurred.png’);

3.操作图像元素

1)获取像素RGB值
$pixel = imagecolorat($new_image,50,50);
$red = ($pixel >> 16) & 0xFF;
$green = ($pixel >> 8) & 0xFF;
$blue = $pixel & 0xFF;

2)修改像素RGB值
$new_color = imagecolorallocate($new_image,255,0,0);
imagesetpixel($new_image,50,50,$new_color);
imagepng($new_image,’test-pixel.png’);

3)填充图像
$fill_color = imagecolorallocate($new_image,0,255,0);
imagefill($new_image,0,0,$fill_color);
imagepng($new_image,’test-filled.png’);

四、GD库的高级操作

1.水印处理

1)添加文字水印
$watermark_text = ‘COPYRIGHT’;
$font_size = 20;
$font_color = imagecolorallocate($new_image,0,0,0);
imagettftext($new_image,$font_size,0,10,20,$font_color,’arial.ttf’,$watermark_text);
imagepng($new_image,’test-watermark.png’);

2)添加图片水印
$watermark_image = imagecreatefrompng(‘watermark.png’);
$watermark_width = imagesx($watermark_image);
$watermark_height = imagesy($watermark_image);
$pos_x = ($new_width – $watermark_width) / 2;
$pos_y = ($new_height – $watermark_height) / 2;
imagecopy($new_image,$watermark_image,$pos_x,$pos_y,0,0,$watermark_width,$watermark_height);
imagepng($new_image,’test-watermark.png’);

2.画图操作

1)画直线
$line_color = imagecolorallocate($new_image,0,0,255);
imageline($new_image,0,0,$new_width,$new_height,$line_color);
imagepng($new_image,’test-line.png’);

2)画矩形
$rect_color = imagecolorallocate($new_image,0,255,0);
imagerectangle($new_image,20,20,$new_width-20,$new_height-20,$rect_color);
imagepng($new_image,’test-rectangle.png’);

3)画圆形
$circle_color = imagecolorallocate($new_image,255,0,0);
$circle_center_x = $new_width/2;
$circle_center_y = $new_height/2;
$circle_diameter = $new_height * 0.8;
$circle_radius = $circle_diameter / 2;
imageellipse($new_image,$circle_center_x,$circle_center_y,$circle_diameter,$circle_diameter,$circle_color);
imagepng($new_image,’test-circle.png’);

五、总结

本文介绍了GD库的基本操作和高级操作,包括图像创建、图像处理、操作图像元素、水印处理、画图操作等内容。GD库是PHP开发中非常实用的图像处理工具之一,可以用于制作图片验证码、生成二维码、图表、海报等。掌握GD库的使用技能可以帮助PHP开发者更加高效地完成业务需求。

以上就是PHP中的GD库操作指南的详细内容,更多请关注php中文网其它相关文章!

 

PHP修改图片大小

<?php
function resizeImage($sourceImage, $targetImage, $maxWidth, $maxHeight) {
list($sourceWidth, $sourceHeight, $sourceType) = getimagesize($sourceImage);
switch ($sourceType) {
case IMAGETYPE_JPEG:
$sourceResource = imagecreatefromjpeg($sourceImage);
break;
case IMAGETYPE_PNG:
$sourceResource = imagecreatefrompng($sourceImage);
break;
case IMAGETYPE_GIF:
$sourceResource = imagecreatefromgif($sourceImage);
break;
default:
return false;
}
$targetWidth = $sourceWidth;
$targetHeight = $sourceHeight;
if ($sourceWidth > $maxWidth || $sourceHeight > $maxHeight) {
$aspectRatio = $sourceWidth / $sourceHeight;
if (($maxWidth / $maxHeight) > $aspectRatio) {
$targetWidth = $maxHeight * $aspectRatio;
$targetHeight = $maxHeight;
} else {
$targetWidth = $maxWidth;
$targetHeight = $maxWidth / $aspectRatio;
}
}
$targetResource = imagecreatetruecolor($targetWidth, $targetHeight);
imagecopyresampled($targetResource, $sourceResource, 0, 0, 0, 0, $targetWidth, $targetHeight, $sourceWidth, $sourceHeight);
switch ($sourceType) {
case IMAGETYPE_JPEG:
imagejpeg($targetResource, $targetImage, 80); // 80 是图片质量,可根据需求调整
break;
case IMAGETYPE_PNG:
imagepng($targetResource, $targetImage);
break;
case IMAGETYPE_GIF:
imagegif($targetResource, $targetImage);
break;
default:
return false;
}
imagedestroy($sourceResource);
imagedestroy($targetResource);
return true;
}

//这个命令尝试修改图片大小,注意要启用GD库。
resizeImage(’11.png’, ’22.png’, 1000, 600);

王维《菩提寺》诗两首

王维《菩提寺》诗两首

其一:

《菩提寺禁裴迪来相看说逆贼等凝碧池上作音乐供奉人等举声便一时泪下私成口号诵示裴迪》

万户伤心生野烟,
百官何日再朝天。

秋槐叶落空宫里,
凝碧池头奏管弦。

 

其二:

《菩提寺禁口号又示裴迪》

安得舍罗网,拂衣辞世喧。
悠然策藜杖,归向桃花源。

 

细赏之,蛮有趣。

有意深入了解其义者,请百度百科。

ADODB 入门

1. 前言

ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的主持人陈莹光老师,决定采用此一组件,为了让更多有心参与该项目的伙伴们能够顺利加入发展的行列,小弟认为有必要把 ADODB 的中文入门介绍写出来,以方便伙伴们参考备查。

虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。

目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自由软件社群发展之后贡献出来的)。

使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续使用,转移数据库平台时,程序代码也不必做太大的更动。

其实 ADODB 这样的发展理念,并不是首创的,DBI 比 ADODB 出现得更早,它提供 Perl 存取数据库时,使用一致的 API 呼叫接口。相信用过 Perl + DBI 的朋友,再来用 ADODB 时,会有一种似曾相识的感觉。

另外,ADODB 对用过 ASP 的人而言,应该不陌生,这类朋友对 ADODB 应该很容易接受。

我们来看一下,ADODB 的简单用法:

<?php
// 引入 adodb 的 inc 档,才能呼叫 adodb 提供的函式
include(‘adodb/adodb.inc.php’);

// 选择连接的数据库种类,以建立联机对象,
// 一旦对象建立,即可使用其成员函式来处理数据库。
// 以下 $conn 即此一物件(object)
$conn = &ADONewConnection(‘mysql’);

// 要不要显示侦错讯息,false 不要,true 要。
// $conn->debug = false;

$conn->debug = true;

// 连接数据库
// 用法:$conn->Connect(‘主机’, ‘使用者’, ‘密码’, ‘数据库’);
// 用例:
$conn->Connect(‘localhost’, ‘piza’, ‘ooo123’, ‘test’);

// 若欲采用持续性连接,上式可换用 PConnect:
// $conn->PConnect(‘localhost’, ‘piza’, ‘ooo123’, ‘test’);

// 设定 sql 命令
$sql = “insert into t values (‘abcde’, 18)”;

// 执行 sql 命令
$rs = $conn->Execute($sql);

// 检查执行结果,若 $rs == false,则呼叫 $conn 对象的成员函式 ErrorMsg()
if (!$rs) print $conn->ErrorMsg(); else print “OK!”;

?>

结果如下:

———————————————
(mysql): insert into t values (“abcde”,18)
———————————————
OK!

若把侦错关掉,即 $conn->debug=false,则结果如下:

OK!

以下,逐步为各位介绍:使用 ADODB 的重点方法。

2. 安装

ADODB 的首页在:http://php.weblogs.com/ADOdb,目前(2002/10/24)最新版是:2.42 版,可至 ADODB 下载或至台南县教网中心 FTP 下载。

安装 ADODB 的方法超极简单,只要下载、解压、放入适当位置,即可完成 ! 如下所示:

1. 下载:

$ ncftp ftp.tnc.edu.tw

cd sysop/ADODB

get adodb242.tgz

2. 解压:

假设我把 adodb242.tgz 放入 /var/www/html 中

$ cp adodb242.tgz /var/www/html

$ tar xvzf adodb242.tgz

如下所示:

adodb/adodb-cryptsession.php
adodb/adodb-csvlib.inc.php
adodb/adodb-errorhandler.inc.php
adodb/adodb-errorpear.inc.php
adodb/adodb-lib.inc.php
adodb/adodb-pager.inc.php
….以下省略….

现在,您在 /var/www/html/adodb 已安装好 ADODB 了。

3. 引入 ADODB

一旦安装好 ADODB,使用前,应把 ADODB 相关的含入文件引入您的程序中。adodb 目录放在任何位置无所谓,只要能指向正确路径文件名即可。一般而言,您的程序代码只须引入 adodb.inc.php。

作法如下:

在您的 PHP 程序中:

include(‘路径/adodb/adodb.inc.php’);

include_once(‘路径/adodb/adodb.inc.php’);

例:

若您的程序和 adodb 在同一目录下:

.
..
adodb/
something.php*

则:

include(‘adodb/adodb.inc.php’);

即可。

若位置是在某一个目录 somedir 中:

.
..
adodb
somedir/something.php

则必须使用:

include(‘../adodb/adodb.inc.php’);

除了 adodb.inc.php 这个含入档,ADODB 还提供许多 adodb-*.inc.php 的含入档,这些多半是为驱动某些数据库的特殊用法而设的。

若是引入 adodb-session.php 则可让您将 session 存入数据库中来维护运用。

若是引入 adodb-pager.inc.php,可方便您做分页显示。

若是引入 adodb-errorhandler.inc.php,可让您自订错误处理讯息。

若是含入 adodb-pear.inc.php,可让您使用 PHP4 的 PEAR DB 语法来使用 ADODB。此时,尚可使用 DSN 连接数据库的字符串设定。如 $dsn=”mysql://piza:ooo123@localhost/test”;

若是引入 tohtml.inc.php,可帮您在程序代码中,方便将取出的记录,转成 HTML 的表格(table)来显示。

若是引入 toexport.inc.php,可让您方便地输出 CSV 档或以 tab 分隔字段的数据文件。

若是引入 rsfilter.inc.php,可让您在使用记录之前,预做过滤处理。

若是引入 pivottable.inc.php,可让您使用 pivot table 功能(俗称 cross-tabulations)。

注意 ! adodb.inc.php 是一定要引入的,其它,则视您要使用那一个功能,再引入该含入档即可。

4. 选用数据库种类,建立联机对象

由于 ADODB 使用对象导向的作法,因此您在引入档之后,接着请视您后端数据库的种类,建立一个联机对象。作法如下:

以 MySQL 数据库为例:

$conn = &ADONewConnection(‘mysql’);

注:NewADOConnection 和 ADONewConnection 是一样的,二者皆可使用。

上例中的 ‘mysql’ 是指数据库的 drvier 的种类,ADODB 会据此呼叫对应的数据库 driver。

其它常用的 driver 有:access、ado、ado_access、ado_mssql、db2、vfp、ibase、borland_ibase、informix、imformix72、mssql、oci8、odbc、postgres、postgres64、postgres7、sqlanywhere、sybase….等等。

我们称建立的对象 $conn 为一 ADOConnection 对象,它代表与数据库的连接事务,皆透过这个对象来处理。ADOConnection 对象会提供许多处理的方法,以对象导向的说法,这些方法称为成员函式,这是外界存取此一对象的接口。

一旦联机对象建立之后,就有许多对象函式可供您使唤啦 ! 请看下一节的介绍。

5. 侦错模式

程序开发的过程,为了方便查出出现问题可能的地方,通常我们会打开侦错模式,俟程序功能确实稳定之后,再将它关闭。ADODB 提供侦错模式,存取数据库时,能显示其运作方式。

打开侦错模式,使用法:

$conn->debug=true

关闭侦错模式,使用法:

$conn->debug=false

6. 连接数据库

接着,使用 $conn 联机对象的 Connect 或 PConnect 函式来连接特定的数据库,此时必须提供 DSN (Data Source Names)相关数据,DSN 可能包括:主机名称、数据库使用者、数据库密码、数据库名称。不同的数据库种类,DSN 可能可以省略其中若干项。以 MySQL 而言,则上述四者都要提供。

该函式会传回 true 或 false,用以表示是否连接成功。

用例:

// 格式:$conn->Connect(‘主机’, ‘使用者’, ‘密码’, ‘数据库’);

$conn->Connect(‘localhost’, ‘piza’, ‘ooo123’, ‘test’);

或者,采持续性连接:

// 格式:$conn->PConnect(‘主机’, ‘使用者’, ‘密码’, ‘数据库’);

$conn->PConnect(‘localhost’, ‘piza’, ‘ooo123’, ‘test’);

若欲探查是否有联机成功,可用一个变量来接取传回值:

$mch=”localhost”;
$user=”piza”;
$pwd=”ooo123″;
$database=”test”;

$cok = $conn->Connect($mch, $user, $pwd, $database);

或者,采持续性连接:

$cok = $conn->PConnect($mch, $user, $pwd, $database);

if (!$cok) { echo “无法连接数据库 $database”; exit; }

7. 设定 sql 命令语法、执行 sql 命令

接下来,您就可以设计您要执行的 sql 命令语法,然后付诸执行。

$sql = “这里放 SQL 的命令语法”;

$rs = $conn->Execute($sql);

其中,$rs 为回传的结果,若 $rs == false,则表示执行失败,您必须仔细检查一下。

您不一定要把命令语法放在 $sql 变量中,也可以直接放入 Execute( ) 括号中。若命令较短无妨,若命令较长,我建议您还是用一个变量 $sql 来设定命令字符串吧 !

下一节开始,为各位介绍 SQL 的基本命令,如:Insert、Select、Update、Delete 等等的用法。

8. 插入记录(Insert)

Insert 的用法如下:

// $name 为字符串,$year 为数字
$name=’abcde’;
$year=18;

// 插入一笔记录,命令的大小写无妨,但数据表 t 及变量则大小写有分别 !
$sql = “INSERT INTO t VALUES (‘$name’, $year)”;

// $sql = “insert into t values (‘$name’, $year)”; 亦可。

// 执行
$rs = $conn->Execute($sql);

// 检查执行结果,进行错误处理;若正常,则继续其它动作….
if (!$rs) print $conn->ErrorMsg();

….以下省略….

ErrorMsg() 是错误显示的函式,它会取出错误讯息,并显示出来。

另外,ADODB 提供一种 记录集(RecordSet) 函式 GetInsertSQL(),可帮您产生 Insert 的语法。

例子如下:

<?php

// 引入 ADODB
include(‘adodb/adodb.inc.php’);

// 建立联机对象
$conn = &ADONewConnection(‘mysql’);

// 侦错
$conn->debug=true;

// DSN 四项基本数据设定
$mch=”localhost”;
$user=”root”;
$pwd=”jack168″;
$database=”test”;

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 产生一笔空记录
$sql = “select * from t where year=-1”;

$rs = $conn->Execute($sql);

// 用一个空数组来装要更新的数据
$r = array();

$r[‘name’]=’john’;
$r[‘year’]=28;

// 用 GetInsertSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $insertSQL 中
$insertSQL = $conn->GetInsertSQL($rs, $r);

// 执行插入
$conn->Execute($insertSQL);

$conn->Close();
?>

侦错讯息如下:

———————————————————–
(mysql): select * from t where year=-1
———————————————————–
(mysql): INSERT INTO t ( name, year ) VALUES ( ‘john’, 28 )
———————————————————–

9. 取出记录(Select)

Select 的用法如下:

<?php

// 引入 ADODB
include(‘adodb/adodb.inc.php’);

// 建立联机对象
$conn = &ADONewConnection(‘mysql’);

// 不侦错
$conn->debug=false;

// DSN 四项基本数据设定
$mch=”localhost”;
$user=”piza”;
$pwd=”ooo123″;
$database=”test”;

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 执行 Select 由表格 t 取出数据,
// 它会传回一个 ADORecordSet 记录集对象 $rs (RecordSet)
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录(row 或称 record),
// 该记录的所有字段数据的内容,存放在 fields 这个数组之中
// ,以数字为索引,第一个由 0 开始
$rs = &$conn->Execute(‘select * from t’);

// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
print $conn->ErrorMsg();
} else {

// 当尚未到达 记录集 $rs 的结束位置(EOF:End Of File)时,(即:还有记录尚未取出时)
while (!$rs->EOF) {
// 秀出所有字段,$FieldCount() 会传回字段总数
for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
print $rs->fields[$i] . ” “;
}

// 移至下一笔记录
$rs->MoveNext();

// 换列
echo “<br>\n”;
}
}

$rs->Close(); // 可不用
$conn->Close(); // 可不用
?>

$rs->fields[] 数组是由 PHP 的数据库扩展功能产生的,某些扩展功能并不支持使用字段名称当作索引。

若欲使用名称当作索引,也就是俗称的 hash 或 associative arrays,则需使用全域变量 $ADODB_FETCH_MODE 加以指定。

以下设定:使用数字索引 $ADODB_FETCH_MODE= ADODB_FETCH_NUM;

以下设定:使用名称索引 $ADODB_FETCH_MODE= ADODB_FETCH_ASSOC;

下面是使用名称索引的例子:

<?php

// 引入 ADODB
include(‘adodb/adodb.inc.php’);

// 建立联机对象
$conn = &ADONewConnection(‘mysql’);

// 不侦错
$conn->debug=false;

// DSN 四项基本数据设定
$mch=”localhost”;
$user=”root”;
$pwd=”jack168″;
$database=”test”;

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 执行 sql 之前,指定使用名称索引
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

// 执行 Select,它会传回一个 ADORecordSet 记录集对象 $rs
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录内容,
// 该记录存放在 fields 这个数组之中
$rs = &$conn->Execute(‘select * from t’);

// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
print $conn->ErrorMsg();
} else {

// 当尚未到达记录集结束位置(EOF)时,
while (!$rs->EOF) {
// 秀出所有字段

print $rs->fields[‘name’] . ” ” . $rs->fields[‘year’];

// 移至下一笔记录
$rs->MoveNext();

// 换列
echo “<br>\n”;
}
}

$rs->Close(); // 可不用
$conn->Close(); // 可不用
?>

10. 取出记录(使用 FetchRow)

这里示范 FetchRow 的用法:

$sql = “select * from t”;

$rs = $conn->Execute($sql);

if ($rs) {
while( $ar = $rs->FetchRow() ) {
print $ar[‘name’] .” ” . $ar[‘year’];
print “<br>\n”;
}

}

FetchRow() 会将取出的记录传回,您可用一个 array 来接取。

注意 ! 使用 FetchRow() 就不必再用 MoveNext(),FetchRow 内部会自动完成移至下一笔记录的动作。

 

 

https://www.xp.cn/b.php/21544.html

常用的adodb使用方法

 

常用的adodb使用方法

返回的记录集形式

define(‘ADODB_FETCH_DEFAULT’,0);

define(‘ADODB_FETCH_NUM’,1);

define(‘ADODB_FETCH_ASSOC’,2);

define(‘ADODB_FETCH_BOTH’,3);

以上的常量,是在adodb.inc.php里定义的,也就是$ADODB_FETCH_MODE 这个变量可以设置的值

常用的是:ADODB_FETCH_NUM 或 ADODB_FETCH_ASSOC

ADODB_FETCH_NUM 返回的记录集中的索引,是数字形式,即数据库字段的排序顺序值

ADODB_FETCH_ASSOC 返回的记录集中的索引,是原数据库字段名

ADODB_FETCH_BOTH 和 ADODB_FETCH_DEFAULT 是同时返回 ADODB_FETCH_NUM, ADODB_FETCH_ASSOC的值,某些数据库不支持

An example:

$ADODB_FETCH_MODE = ADODB_FETCH_NUM;

$rs1 = $db->Execute(‘select * from table’);

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

$rs2 = $db->Execute(‘select * from table’);

print_r($rs1->fields); # 返回的数组是: array([0]=>’v0′,[1] =>’v1′)

print_r($rs2->fields); # 返回的数组是: array([‘col1′]=>’v0’,[‘col2′] =>’v1’)

< ?php

/*

常用的ADODB使用方法

整理:飞豹游侠 QQ:8527385 E-mail:liuchengcn # 163.com

如有错误之处,敬请谅解,并QQ或E-mail通知我,谢谢

*/

//定义数据库变量

$DB_TYPE = “mysql”;

$DB_HOST = “localhost”;

$DB_USER = “root”;

$DB_PASS = “”;

$DB_DATABASE = “ai-part”;

require_once(“../adodb/adodb.inc.php”);

$db = NewADOConnection(“$DB_TYPE”);//建立数据库对象

$db->debug = true;//数据库的DEBUG测试,程序开发期,可设置为true,正式版要注释掉这行,(默认值是false)

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

/*

返回的记录集形式

define(‘ADODB_FETCH_DEFAULT’,0);

define(‘ADODB_FETCH_NUM’,1);

define(‘ADODB_FETCH_ASSOC’,2);

define(‘ADODB_FETCH_BOTH’,3);

以上的常量,是在adodb.inc.php里定义的,也就是$ADODB_FETCH_MODE 这个变量可以设置的值

常用的是:ADODB_FETCH_NUM 或 ADODB_FETCH_ASSOC

ADODB_FETCH_NUM 返回的记录集中的索引,是数字形式,即数据库字段的排序顺序值

ADODB_FETCH_ASSOC 返回的记录集中的索引,是原数据库字段名

ADODB_FETCH_BOTH 和 ADODB_FETCH_DEFAULT 是同时返回 ADODB_FETCH_NUM, ADODB_FETCH_ASSOC的值,某些数据库不支持

An example:

$ADODB_FETCH_MODE = ADODB_FETCH_NUM;

$rs1 = $db->Execute(‘select * from table’);

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

$rs2 = $db->Execute(‘select * from table’);

print_r($rs1->fields); # 返回的数组是: array([0]=>’v0′,[1] =>’v1′)

print_r($rs2->fields); # 返回的数组是: array([‘col1′]=>’v0’,[‘col2′] =>’v1’)

*/

//连接数据库,方法有Connect,PConnect,NConnect,一般使用Connect. NConnect是连接特殊的数据库时才用

if (!@$db->Connect(“$DB_HOST”, “$DB_USER”, “$DB_PASS”, “$DB_DATABASE”)) {

exit(‘服务器忙,请稍候再访问’);

}

/*

$db-> $rs-> 此类的使用方法

Execute($sql,$inputarr=false),执行参数中的$sql语句,后面的那个$inputarr参数,一般情况下不需要

SelectLimit($sql,$numrows=-1,$offset=-1,$inputarr=false) $numrows:取几条记录,$offset,从第几条开始取,SelectLimit,一般是用于分页,或只取出几条记录的时候用

*/

//Example: 取出多个记录

$sql = “SELECT * FROM table ORDER BY id DESC”;

if (!$rs = $db->Execute($sql)) {//执行SQL语句,并把结果返回给$rs变量

echo $db->ErrorMsg();//这个是打印出错信息

$db->Close();//关闭数据库

exit();

}

while (!$rs->EOF) {//遍历记录集

echo $rs->fields[‘username’] . ‘

‘;//print_r($rs->fields)试试,$rs->fields[‘字段名’],返回的是这个字段里的值

$rs->MoveNext();//将指针指到下一条记录,不用的话,会出现死循环!

}

$rs->Close();//关闭它,以便释放内存,每次操作完都进行一次关闭,养成编程的好习惯

//插入新记录

$sql = “INSERT table (user_type,username) VALUES (3, ‘liucheng’)”;

$db->Execute($sql);

//更新记录

$sql = “UPDATE table SET user_type=3 WHERE ;

$db->Execute($sql);

//删除记录

$sql = “DELETE FROM table WHERE ;

$db->Execute($sql);

// 取单个记录

//$db->GetRow($sql), 取出SQL中的第一条记录,并返回一个数组,如果出错,则返回false

$sql = “SELECT username,password,user_type FROM table WHERE ;

$data_ary = $db->GetRow($sql);

if ($data_ary == false) {//如果用===,可能不是你想要的结果

echo ‘没有找到此记录’;

exit();

} else {

echo $data_ary[‘username’] . ‘ ‘ . $data_ary[‘password’] . ‘ ‘ . $data_ary[‘user_type’] . ‘

‘;

}

//这里没有用到$rs,则不需要$rs->Close();

//另一种方法 (使用上面的方法比较好,又方便)

$sql = “SELECT username,password,user_type FROM table WHERE ;

if (!$rs = $db->Execute($sql)) {

echo $db->ErrorMsg();

$db->Close();

exit();

}

if (!$result = $rs->FetchRow()) {

echo ‘没有找到此记录’;

exit();

} else {

echo $result[‘username’] . ‘ ‘ . $result[‘password’] . ‘ ‘ . $result[‘user_type’] . ‘

‘;

}

//$db->GetOne($sql) 取出SQL中的第一条记录的第一个字段的值,如果出错,则返回false

$sql = “SELECT COUNT(id) FROM table”;

$record_nums = $db->GetOne($sql);

echo $record_nums;

$sql = “SELECT username,password,user_type FROM table WHERE user_;

$result = $db->GetOne($sql);

echo $result;//此值为记录中的username的值

/*

在进行添加,修改,删除记录操作时,要对字符串型的字段,使用$db->qstr()对用户输入的字符进行处理,对数字型字段,要在之前,进行数据判断

更新记录,注意:这是针对php.ini中,magic_quotes被设置为Off的情况,如果不确定,可以使用

$db->qstr($content,get_magic_quotes_gpc())

注意:content= 等号右边,没有单引号

*/

$sql = “UPDATE table SET content=” . $db->qstr($content) . ” WHERE ;

$db->Execute($sql);

/*$db->Insert_ID(),无参数,返回刚刚插入的那条记录的ID值,仅支持部分数据库,带auto-increment功能的数据库,如PostgreSQL, MySQL 和 MS SQL

*/

//Example:

$sql = “INSERT table (user_type,username) VALUES (3, ‘liucheng’)”;

$db->Execute($sql);

$data_id = $db->Insert_ID();

echo $data_id;

/*$db->GenID($seqName = ‘adodbseq’,$startID=1),产生一个ID值.$seqName:用于产生此ID的数据库表名,$startID:起始值,一般不用设置,它会把$seqName中的值自动加1.支持部分数据库,某些数据库不支持

Insert_ID,GenID,一般我用GenID,使用它的目的,是在插入记录后,要马上得到它的ID时,才用

*/

/*Example:

先创建一个列名为user_id_seq的表,里面只有一个字段,id,int(10),NOT NULL,然后插入一条值为0的记录

*/

$user_id = $db->GenID(‘user_id_seq’);

$sql = “INSERT table (id, user_type,username) VALUES (” . $user_id . “, 3, ‘liucheng’)”;

$db->Execute($sql);

/*

$rs->RecordCount(),取出记录集总数,无参数

它好像是把取出的记录集,用count()数组的方法,取得数据的数量

如果取大量数据,效率比较慢,建议使用SQL里的COUNT(*)的方法

$sql = “SELECT COUNT(*) FROM table”, 用此方法时,不要在SQL里加ORDER BY,那样会降低执行速度

Example:

*/

$sql = “SELECT * FROM table ORDER BY id DESC”;

if (!$rs = $db->Execute($sql)) {

echo $db->ErrorMsg();

$db->Close();

exit();

}

$record_nums = $rs->RecordCount();

/*

如果想对某一结果集,要进行两次同样的循环处理,可以用下面方法

以下,只是一个例子,只为说明$rs->MoveFirst()的使用方法

*/

$sql = “SELECT * FROM table ORDER BY id DESC”;

if (!$rs = $db->Execute($sql)) {

echo $db->ErrorMsg();

$db->Close();

exit();

}

$username_ary = array();

while (!$rs->EOF) {

$username_ary[] = $rs->fields[‘username’]

echo $rs->fields[‘username’] . ‘

‘;//print_r($rs->fields)试试,$rs->fields[‘字段名’],返回的是这个字段里的值

$rs->MoveNext();//将指针指到下一条记录,不用的话,会出现死循环!

}

$username_ary = array_unique($username_ary);

$rs->MoveFirst();//将指针指回第一条记录,无参数

while (!$rs->EOF) {

echo $rs->fields[‘password’] . ‘

‘;//print_r($rs->fields)试试,$rs->fields[‘字段名’],返回的是这个字段里的值

$rs->MoveNext();//将指针指到下一条记录,不用的话,会出现死循环!

}

$rs->Close();

/*

当本页程序,对数据库的操作完毕后,要$db->Close();

*/

$db->Close();

/*一个不错的方法 */

if (isset($db)) {

$db->Close();

}

?>