├── .gitignore ├── src ├── resources │ ├── payment.csv │ ├── bank.csv │ ├── last.name.csv │ ├── company.csv │ ├── first.name.csv │ ├── country.csv │ ├── university.csv │ ├── postman.js │ ├── color.json │ ├── dict.php │ └── chinese.characters.csv ├── Datetime.php ├── Number.php ├── Table.php ├── DB.php ├── MysqlCompare.php ├── MysqlTool.php └── Provider.php ├── examples ├── doc.png ├── postman.png ├── tp │ ├── DtoolTest.php │ └── Base.php ├── test.php └── homestead.html ├── composer.json ├── composer.lock └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | -------------------------------------------------------------------------------- /src/resources/payment.csv: -------------------------------------------------------------------------------- 1 | 支付宝,微信支付,PayPal,网银支付,安付通,块钱支付 -------------------------------------------------------------------------------- /examples/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yeosz/dtool/HEAD/examples/doc.png -------------------------------------------------------------------------------- /examples/postman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yeosz/dtool/HEAD/examples/postman.png -------------------------------------------------------------------------------- /src/resources/bank.csv: -------------------------------------------------------------------------------- 1 | 渤海银行,广发银行,国家开发银行,恒丰银行,华夏银行,交通银行,平安银行,上海浦东发展银行,兴业银行,招商银行,浙商银行,中国工商银行,中国光大银行,中国建设银行,中国民生银行,中国农业银行,中国银行,中国邮政储蓄银行,中信银行 -------------------------------------------------------------------------------- /src/resources/last.name.csv: -------------------------------------------------------------------------------- 1 | 李,王,张,刘,陈,杨,赵,黄,周,吴,徐,孙,胡,朱,高,林,何,郭,马,罗,梁,宋,郑,谢,韩,唐,冯,于,董,萧,程,曹,袁,邓,许,傅,沈,曾,彭,吕,苏,卢,蒋,蔡,贾,丁,魏,薛,叶,阎,余,潘,杜,戴,夏,钟,汪,田,任,姜,范,方,石,姚,谭,廖,邹,熊,金,陆,郝,孔,白,崔,康,毛,邱,秦,江,史,顾,侯,邵,孟,钱,汤,尹,易,贺,赖,龚,文,龙,万,段,雷,黎,常,武,乔 -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "yeosz/dtool", 3 | "authors": [ 4 | { 5 | "name": "weihua", 6 | "email": "ye.osz@qq.com" 7 | } 8 | ], 9 | "description": "填充数据,数据供应器", 10 | "keywords": ["数据填充","数据供应"], 11 | "license": "MIT", 12 | "require": {"php": "^5.6 || ^7.0"}, 13 | "minimum-stability": "dev", 14 | "autoload": { 15 | "psr-4": { 16 | "Yeosz\\Dtool\\": "src/" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/tp/DtoolTest.php: -------------------------------------------------------------------------------- 1 | ["getString",16], 17 | 'name' => ["getString",16], 18 | 'sex' => ["randomValue",["2","1","0"]], 19 | 'user_id' => ["int"], 20 | 'price' => ["randomFloat",8,2], 21 | 'address' => ["getString",16], 22 | 'remarks' => ["getString",16], 23 | 'created_at' => ["timestamp"], 24 | ]; 25 | public $pk = 'id'; 26 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "3c8aadd2bde950534e3a0049defd43b9", 8 | "content-hash": "90bd3daceeccc4e634adcbf5de5279b9", 9 | "packages": [], 10 | "packages-dev": [], 11 | "aliases": [], 12 | "minimum-stability": "dev", 13 | "stability-flags": [], 14 | "prefer-stable": false, 15 | "prefer-lowest": false, 16 | "platform": { 17 | "php": "^5.6 || ^7.0" 18 | }, 19 | "platform-dev": [] 20 | } 21 | -------------------------------------------------------------------------------- /examples/tp/Base.php: -------------------------------------------------------------------------------- 1 | dbConfig)); 22 | parent::__construct($db); 23 | } 24 | } -------------------------------------------------------------------------------- /src/resources/company.csv: -------------------------------------------------------------------------------- 1 | 红薯,山丘,启翼,永林,蓝星,圈圈,联智,佳偶,联豪,锐捷,汇龙,启申,信全,宝德,格致,东信,博品,广进,数动,讯美,金思绪,一指通,无极限,海岸线,思迪科,澳美佳,智平台,星启天,速建通,德瑞克,深层次,讯必达,亚美讯,思方达,三网达,健天下,华思达,玖捌柒,网天下,速汇通,中国医药,天地人安,新达建耀,亚亿讯跃,四三九九,搜而有道,丰泽铭扬,法拉电子,环宇游学,富邦凯运,飞光妙源,富通利达,天助人和,传媒之星,航空动力,卓全驰曼,恒宇万通,格利南硕,浩天中佳,智特清浩,裕鑫,索领,聚隆,智朗,智鑫,万企,奇胜,聚点,大漠,殷讯,金森,昊业,汉鼎,开达,鸣智,晶致,诚益,效率,拓野,众源,君成,壹玖,辉聚,海迅,丰联,邦康,晨升,顺天新元,海丽,锦久辰,金益明,勇城,勇胜,聚宝阁,智通,锐迈,顺源,百事恒兴,中意万达,超前,劲凯,理心,精速,惠佳,靖浩,灵通神州,久益,天顺,中楚亨通,慧嘉,赐金,中祥,伟恒,天泽,天弘益华,龙源泰,汇才通,嘉特,路仪,瑞通,起名,爱顺,恒利轩,邦尼,富蓝,红豪特,三鑫,治金阁,凯利,高玛,同心,德辰,聚财,昆腾,四海友诚,龙源泰兴,卓逸财富,华鑫,宜鸿,宜筑,智才,广达恒业,鸿然达,润才,颐事达,维佳特,库弘,中源,宝德,理薪,吉顺达昌,汇智通,益昌,智友,鸿升行,艺彩,慧达,优甫,佰特,源宝,星瀚,邦诚,赛硕,豪嘉利,宝钢,鑫胜,慧鑫,嘉合兴,思泉,源润,家兴,三禾,昀康,增裕,峰扬天翔,鑫隆,港华,恒益,展翅鸿业,正阳,艾诺威,泰士特,卓信,顺金,顺天府,众义达,扬铃,尚宏,鼎鑫盛泰,慧瑞恒,申达鑫通,金帝,中睿,中艺盛嘉,巨晖,盛腾,向南,实达丰,双鼎,益航,亿利昶,鸣远,慧佳,福鼎 2 | 网络有限公司,科技有限公司,投资有限公司,珠宝有限公司,地产有限公司,通信公司,服装有限公司,装潢有限公司,传媒有限公司 -------------------------------------------------------------------------------- /src/resources/first.name.csv: -------------------------------------------------------------------------------- 1 | 伟,刚,勇,毅,俊,峰,强,军,平,保,东,文,辉,力,明,永,健,世,广,志,义,兴,良,海,山,仁,波,宁,贵,福,生,龙,元,全,国,胜,学,祥,才,发,武,新,利,清,飞,彬,富,顺,信,子,杰,涛,昌,成,康,星,光,天,达,安,岩,中,茂,进,有,坚,和,彪,博,诚,先,敬,震,振,壮,会,群,豪,心,邦,承,乐,绍,功,松,善,厚,庆,磊,民,友,裕,河,哲,江,超,浩,亮,政,谦,亨,奇,固,之,轮,翰,朗,伯,宏,言,若,鸣,朋,斌,栋,维,启,克,伦,翔,旭,鹏,泽,晨,辰,士,以,建,家,致,树,炎,德,行,时,泰,盛,雄,琛,钧 2 | 驰杰,栋逸,驰逸,星运,稷龙,然骞,驰腾,运振,起尧,运良,槐禧,信泽,琛祯,骏锟,运乘,辰沛,日桀,振邦,梁家,骞震,强骞,强家,欣尧,仕仕,辰博,鹏轩,晨辰,裕弘,韦运,盛骏,辰桀,辰柔,轩礼,骏强,晓远,诚骏,休华,斌树,振远,震彬,俊驰,骞初,运骞,宇骞,良锟,峰震,楷树,浩逸,轩运,柏辰,腾海,泽辰,天运,辰运,星骏,铭晓,辰栋,振运,逸沛,振逸,锟腾,卓梓,辰骞,鑫仕,骏驰,加芃,博骏,皓国,然运,运树,辰仕,博天,爵泽,烁星,骏振,枫蔓,振子,骞辰,振涛,卓腾 3 | 秀,娟,英,华,慧,巧,美,娜,静,淑,惠,珠,翠,雅,芝,萍,红,娥,玲,芬,芳,燕,彩,春,菊,兰,凤,洁,梅,琳,霞,香,月,云,莲,真,环,雪,荣,爱,妹,莺,媛,艳,瑞,娅,琦,晶,妍,茜,秋,佳,嘉,琼,勤,珍,贞,莉,桂,娣,璧,璐,珊,莎,锦,黛,青,倩,婷,姣,婉,娴,瑾,颖,露,怡,婵,雁,蓓,纨,仪,荷,丹,蓉,眉,君,琴,蕊,薇,菁,瑗,琰,韵,融,园,艺,岚,苑,婕,馨,咏,卿,聪,澜,纯,欣,飘,育,滢,馥,悦,昭,冰,爽,琬,茗,羽,希,筠,竹,霭,凝,晓,欢,霄,枫,芸,菲,寒,伊,亚,宜,可,姬,影,柔,荔,枝,毓,思,丽,玉,素,凡,瑶,梦,舒,美 4 | 灵洲,馨敏,菲洁,芙琪,萱菡,雅正,俊萱,锦桃,鹤帆,锦鸿,媛钰,彩媛,旭初,瑶琪,昭栀,楠灵,俊初,怡楠,雪凡,涵彩,锦霞,静琪,心妍,初涵,馨欣,倩梦,呈枫,玥彦,静蔚,萱妍,淑锦,梦怡,静玥,梦娜,茜颖,欣娅,栀弦,菲梅,花洁,柔彦,婧寒,美凌,芳云,琬柏,晨彦,璐初,春梅,璐妍,梓凌,云云,格丽,雪梅,静慧,梦敏,锦琬,静寒,采萱,琪楠,萱舒,呈旭,寒莉,雨惠,曼莲,婧欣,婧颖,明明,婧帛,祥菲,钰雅,月彦,彩彤,杉雯,花彦,琪婧,美初,寒妍,茹珍,冰梦,可楠,静可 -------------------------------------------------------------------------------- /src/resources/country.csv: -------------------------------------------------------------------------------- 1 | 中国,阿尔巴尼亚,阿尔及利亚,阿富汗,阿根廷,阿拉伯联合酋长国,阿鲁巴,阿曼,阿塞拜疆,阿森松岛,埃及,埃塞俄比亚,爱尔兰,爱沙尼亚,安道尔,安哥拉,安圭拉,安提瓜岛和巴布达,澳大利亚,奥地利,奥兰群岛,巴巴多斯岛,巴布亚新几内亚,巴哈马,巴基斯坦,巴拉圭,巴勒斯坦,巴林,巴拿马,巴西,白俄罗斯,百慕大,保加利亚,北马里亚纳群岛,贝宁,比利时,冰岛,波多黎各,波兰,玻利维亚,波斯尼亚和黑塞哥维那,博茨瓦纳,伯利兹,不丹,布基纳法索,布隆迪,布韦岛,朝鲜,丹麦,德国,东帝汶,多哥,多米尼加,多米尼加共和国,俄罗斯,厄瓜多尔,厄立特里亚,法国,法罗群岛,法属波利尼西亚,法属圭亚那,法属南部领地,梵蒂冈,菲律宾,斐济,芬兰,佛得角,弗兰克群岛,冈比亚,刚果,刚果民主共和国,哥伦比亚,哥斯达黎加,格恩西岛,格林纳达,格陵兰,古巴,瓜德罗普,关岛,圭亚那,哈萨克斯坦,海地,韩国,荷兰,荷属安地列斯,赫德和麦克唐纳群岛,洪都拉斯,基里巴斯,吉布提,吉尔吉斯斯坦,几内亚,几内亚比绍,加拿大,加纳,加蓬,柬埔寨,捷克共和国,津巴布韦,喀麦隆,卡塔尔,开曼群岛,科科斯群岛,科摩罗,科特迪瓦,科威特,克罗地亚,肯尼亚,库克群岛,拉脱维亚,莱索托,老挝,黎巴嫩,利比里亚,利比亚,立陶宛,列支敦士登,留尼旺岛,卢森堡,卢旺达,罗马尼亚,马达加斯加,马尔代夫,马耳他,马拉维,马来西亚,马里,马其顿,马绍尔群岛,马提尼克,马约特岛,曼岛,毛里求斯,毛里塔尼亚,美国,美属萨摩亚,美属外岛,蒙古,蒙特塞拉特,孟加拉,密克罗尼西亚,秘鲁,缅甸,摩尔多瓦,摩洛哥,摩纳哥,莫桑比克,墨西哥,纳米比亚,南非,南极洲,南乔治亚和南桑德威奇群岛,瑙鲁,尼泊尔,尼加拉瓜,尼日尔,尼日利亚,纽埃,挪威,诺福克,帕劳群岛,皮特凯恩,葡萄牙,乔治亚,日本,瑞典,瑞士,萨尔瓦多,萨摩亚,塞尔维亚,黑山,塞拉利昂,塞内加尔,塞浦路斯,塞舌尔,沙特阿拉伯,圣诞岛,圣多美和普林西比,圣赫勒拿,圣基茨和尼维斯,圣卢西亚,圣马力诺,圣皮埃尔和米克隆群岛,圣文森特和格林纳丁斯,斯里兰卡,斯洛伐克,斯洛文尼亚,斯瓦尔巴和扬马廷,斯威士兰,苏丹,苏里南,所罗门群岛,索马里,塔吉克斯坦,泰国,坦桑尼亚,汤加,特克斯和凯克特斯群岛,特里斯坦达昆哈,特立尼达和多巴哥,突尼斯,图瓦卢,土耳其,土库曼斯坦,托克劳,瓦利斯和福图纳,瓦努阿图,危地马拉,维尔京群岛,美属,维尔京群岛,英属,委内瑞拉,文莱,乌干达,乌克兰,乌拉圭,乌兹别克斯坦,西班牙,希腊,新加坡,新喀里多尼亚,新西兰,匈牙利,叙利亚,牙买加,亚美尼亚,也门,伊拉克,伊朗,以色列,意大利,印度,印度尼西亚,英国,英属印度洋领地,约旦,越南,赞比亚,泽西岛,乍得,直布罗陀,智利,中非共和国 -------------------------------------------------------------------------------- /src/resources/university.csv: -------------------------------------------------------------------------------- 1 | 北京大学,清华大学,复旦大学,中国人民大学,武汉大学,浙江大学,中山大学,北京师范大学,上海交通大学,南京大学,山东大学,同济大学,厦门大学,华中科技大学,南开大学,四川大学,吉林大学,中国传媒大学,西安交通大学,华东师范大学,中南大学,北京电影学院,天津大学,东南大学,中国政法大学,中央美术学院,华南理工大学,郑州大学,中国农业大学,哈尔滨工业大学,北京航空航天大学,北京理工大学,重庆大学,中国地质大学(武汉),电子科技大学,华中师范大学,暨南大学,兰州大学,中国科学技术大学,南京师范大学,苏州大学,中央财经大学,北京外国语大学,东北师范大学,中央戏剧学院,首都师范大学,西北大学,东北大学,大连理工大学,上海财经大学,河南大学,北京科技大学,深圳大学,中国美术学院,陕西师范大学,西南大学,华南师范大学,南昌大学,湖南大学,上海大学,上海戏剧学院,中国石油大学(华东),武汉理工大学,对外经济贸易大学,中南财经政法大学,北京邮电大学,西北工业大学,中国地质大学(北京),西南交通大学,安徽大学,湖南师范大学,云南大学,西南财经大学,北京中医药大学,上海交通大学医学院,西安电子科技大学,山东师范大学,华东理工大学,青岛大学,中国医科大学,中国海洋大学,中国石油大学(北京),上海外国语大学,广西大学,中国矿业大学(北京),东华大学,北京工业大学,首都医科大学,北京大学医学部,北京交通大学,广州大学,上海音乐学院,合肥工业大学,四川师范大学,华南农业大学,中央民族大学,山西大学,南京艺术学院,华中农业大学,河北大学,西南政法大学,东北财经大学,福州大学,哈尔滨医科大学,南京航空航天大学,北京林业大学,上海师范大学,辽宁大学,海南大学,南京理工大学,河海大学,浙江工业大学,广州美术学院,广西师范大学,南京农业大学,福建师范大学,湘潭大学,北京化工大学,广东外语外贸大学,贵州大学,北京体育大学,武汉科技大学,四川美术学院,广州中医药大学,湖北大学,北京语言大学,西北农林科技大学,鲁迅美术学院,南京医科大学,扬州大学,江南大学,天津师范大学,江西师范大学,内蒙古师范大学,宁波大学,四川音乐学院,重庆医科大学,华北电力大学(北京),华东政法大学,安徽师范大学,北京工商大学,河北师范大学,哈尔滨工程大学,内蒙古大学,天津美术学院,黑龙江大学,安徽医科大学,华侨大学,太原理工大学,天津医科大学,香港城市大学,江西财经大学,西北师范大学,大连海事大学,浙江师范大学,成都理工大学,山东艺术学院,汕头大学,广东工业大学,河南师范大学,国际关系学院,首都经济贸易大学,长江大学,中国药科大学,新疆大学,江苏大学,山东农业大学,南方医科大学,山东科技大学,东北林业大学,哈尔滨师范大学,湖北美术学院,上海中医药大学,南京林业大学,长安大学,云南师范大学,华北电力大学(保定),集美大学,上海理工大学,沈阳音乐学院,浙江传媒学院,成都中医药大学,温州医科大学,北京第二外国语学院,广州医科大学,福建医科大学,大连医科大学,内蒙古农业大学,北京服装学院,浙江工商大学,南京工业大学,延边大学,南京中医药大学,曲阜师范大学,河北工业大学,燕山大学,西安建筑科技大学,山东中医药大学,宁夏大学,中南民族大学,济南大学,中国人民公安大学,昆明理工大学,三峡大学,外交学院,四川农业大学,杭州师范大学,沈阳师范大学,浙江中医药大学,北京联合大学,重庆师范大学,天津工业大学,河南中医药大学,长沙理工大学,杭州电子科技大学,上海海事大学,东北石油大学,哈尔滨理工大学,安徽农业大学,湖南农业大学,河南科技大学,温州大学,烟台大学,河南农业大学,南京财经大学,西安理工大学,辽宁师范大学,青岛科技大学,山西医科大学,河北农业大学,广西中医药大学,山东理工大学,大连外国语大学,天津财经大学,星海音乐学院,西南石油大学,南通大学,南京邮电大学,浙江理工大学,中国青年政治学院,西北政法大学,重庆工商大学,河南理工大学,,东北农业大学,天津中医药大学,山西师范大学,贵州师范大学,江汉大学,内蒙古工业大学,广西医科大学,西南民族大学,福建农林大学,南华大学,,华东交通大学 2 | -------------------------------------------------------------------------------- /src/Datetime.php: -------------------------------------------------------------------------------- 1 | 0) { 55 | $time += mt_rand(1800, 86400 * 365); 56 | } 57 | return $time; 58 | } 59 | 60 | /** 61 | * 获取日期时间 62 | * 63 | * @param int $type 负数过去时,0当前,正数将来时 64 | * @param string $format 格式 65 | * @return string 66 | */ 67 | public static function datetime($type = -1, $format = 'Y-m-d H:i:s') 68 | { 69 | return date($format, self::getTimestamp($type)); 70 | } 71 | } -------------------------------------------------------------------------------- /src/Number.php: -------------------------------------------------------------------------------- 1 | $provider->getString(10), 9 | 'mb_string' => $provider->getMbString(10), 10 | 'city' => $provider->city, 11 | 'address' => $provider->address, 12 | 'uuid' => $provider->uuid, 13 | 'id_card' => $provider->id_card, 14 | 'image_url' => $provider->image_url, 15 | 'bitmap_url' => $provider->bitmap_url, 16 | 'name' => $provider->name, 17 | 'first_name' => $provider->first_name, 18 | 'last_name' => $provider->last_name, 19 | 'phone' => $provider->phone, 20 | 'mobile' => $provider->mobile, 21 | 'email' => $provider->email, 22 | 'qq' => $provider->qq, 23 | 'postcode' => $provider->postcode, 24 | 'company_name' => $provider->company_name, 25 | 'ean8' => $provider->ean8, 26 | 'ean13' => $provider->ean13, 27 | 'timestamp' => $provider->timestamp, 28 | 'year' => $provider->year, 29 | 'date' => $provider->date, 30 | 'time' => $provider->time, 31 | 'integer' => $provider->integer, 32 | 'random' => $provider->randomValue([1, 2, 3]), 33 | 'payment' => $provider->payment, 34 | 'color_name' => $provider->color_name, 35 | 'color_hex' => $provider->color_hex, 36 | 'color_rgb' => $provider->color_rgb, 37 | 'version' => $provider->version, 38 | 39 | ]; 40 | print_r($data); 41 | 42 | $provider->addIncrement('sort', 1); 43 | var_dump($provider->sort); 44 | var_dump($provider->sort); 45 | var_dump($provider->sort); 46 | 47 | $provider->addProvider('my_time', function () { 48 | return time(); 49 | }); 50 | var_dump($provider->my_time); 51 | 52 | // DB 53 | $database = 'homestead'; 54 | $db = new Yeosz\Dtool\DB('localhost:33060', 'homestead', 'homestead', 'secret'); 55 | 56 | $sql = "DROP TABLE IF EXISTS `dtool_test`"; 57 | $db->query($sql); 58 | $sql = "CREATE TABLE `dtool_test` ( 59 | `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', 60 | `username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名', 61 | `name` varchar(20) NOT NULL DEFAULT '' COMMENT '真实姓名', 62 | `sex` enum('2','1','0') NOT NULL COMMENT '性别:1男2女0未知', 63 | `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'user id', 64 | `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', 65 | `address` varchar(60) NOT NULL DEFAULT '' COMMENT '地址', 66 | `remarks` varchar(128) NOT NULL DEFAULT '' COMMENT '备注', 67 | `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间', 68 | PRIMARY KEY (`id`), 69 | UNIQUE KEY `unique_username` (`username`) USING HASH 70 | ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;"; 71 | $db->query($sql); 72 | 73 | 74 | $tool = new Yeosz\Dtool\MysqlTool($db, $database); 75 | // 生成文档 76 | file_put_contents($database . '.html', $tool->getDocument()); 77 | // 生成TableProvider 78 | $tool->buildTableProvider('./tp/', 'TableProvider'); 79 | 80 | // TableProvider的使用 81 | 82 | // omposer.json修改autoload部分,增加命名空间 83 | $table = new \TableProvider\DtoolTest(); 84 | $data = $table->generate(); 85 | $table->db->insert('dtool_test', $data); 86 | $table->create(2); 87 | 88 | // sql查询 89 | $row = $table->db->query("select id,name from dtool_test where id=:id", ['id' => 1]); 90 | print_r($row); 91 | 92 | $column = $table->db->column("select name from dtool_test"); 93 | print_r($column); 94 | 95 | $cell = $table->db->cell("select name from dtool_test where id=?", [1]); 96 | print_r($cell); 97 | -------------------------------------------------------------------------------- /src/Table.php: -------------------------------------------------------------------------------- 1 | db = $db; 66 | $this->provider = new Provider(); 67 | 68 | $methods = get_class_methods($this); 69 | foreach ($methods as $method) { 70 | if (stripos($method, 'dataProvider') === 0) { 71 | $property = $this->provider->toUnderline(substr($method, 12)); 72 | $property = ltrim(strtolower($property), '_'); 73 | $this->methods[$property] = $method; 74 | } 75 | } 76 | } 77 | 78 | /** 79 | * 插入数据 80 | * 81 | * @param $count 82 | * @param \Closure $closure 83 | * @return array 84 | */ 85 | public function create($count, \Closure $closure = null) 86 | { 87 | $row = []; 88 | for ($i = 0; $i < $count; $i++) { 89 | $data = $this->generate($closure); 90 | $result = $this->db->insert($this->table, $data, $this->pk); 91 | if ($this->pk) { 92 | if (!isset($data[$this->pk])) $data[$this->pk] = $result; 93 | $row[$result] = $data; 94 | } else { 95 | $row[] = $data; 96 | } 97 | } 98 | return $row; 99 | } 100 | 101 | /** 102 | * 生成数据 103 | * 104 | * @param \Closure $closure 105 | * @return array 106 | */ 107 | public function generate(\Closure $closure = null) 108 | { 109 | $this->current = []; 110 | foreach ($this->columns as $key => $column) { 111 | if ($column instanceof \Closure) { 112 | $this->current[$key] = $column(); 113 | continue; 114 | } elseif (is_array($column)) { 115 | $property = array_shift($column); 116 | if (isset($this->methods[$property])) { 117 | $this->current[$key] = call_user_func_array([$this, $this->methods[$property]], $column); 118 | } elseif (method_exists($this->provider, $property)) { 119 | $this->current[$key] = call_user_func_array([$this->provider, $property], $column); 120 | } elseif (method_exists($this->provider->numberProvider, $property)) { 121 | $this->current[$key] = call_user_func_array([$this->provider->numberProvider, $property], $column); 122 | } elseif (method_exists($this->provider->datetimeProvider, $property)) { 123 | $this->current[$key] = call_user_func_array([$this->provider->datetimeProvider, $property], $column); 124 | } else { 125 | $this->current[$key] = $this->provider->$property; 126 | } 127 | } else { 128 | $this->current[$key] = $column; 129 | } 130 | } 131 | 132 | if ($closure) { 133 | $result = $closure($this->current); 134 | if (!is_null($result)) { 135 | $this->current = $result; 136 | } 137 | } 138 | 139 | return $this->current; 140 | } 141 | } -------------------------------------------------------------------------------- /examples/homestead.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | homestead数据库设计 6 | 20 | 21 | 22 |
23 |

homestead数据库设计

24 | 25 |
1 dtool_test InnoDB
序号字段名数据类型默认值允许非空自动递增是否主键外键关系备注
1idint(10) unsignedNOID
2usernamevarchar(20)NO 用户名
3namevarchar(20)NO 真实姓名
4sexenum('2','1','0')NO 性别:1男2女0未知
5user_idint(10) unsigned0NO user id
6pricedecimal(10,2)0.00NO 价格
7addressvarchar(60)NO 地址
8remarksvarchar(128)NO 备注
9created_attimestampYES 创建时间
索引名称唯一索引索引类型字段
unique_usernameBTREEusername
26 |
27 | 28 | -------------------------------------------------------------------------------- /src/resources/color.json: -------------------------------------------------------------------------------- 1 | [["AliceBlue","F0F8FF","240,248,255"],["AntiqueWhite","FAEBD7","250,235,215"],["Aqua","00FFFF","0,255,255"],["Aquamarine","7FFFD4","127,255,212"],["Azure","F0FFFF","240,255,255"],["Beige","F5F5DC","245,245,220"],["Bisque","FFE4C4","255,228,196"],["Black","000000","0,0,0"],["BlanchedAlmond","FFEBCD","255,235,205"],["Blue","0000FF","0,0,255"],["BlueViolet","8A2BE2","138,43,226"],["Brown","A52A2A","165,42,42"],["BurlyWood","DEB887","222,184,135"],["CadetBlue","5F9EA0","95,158,160"],["Chartreuse","7FFF00","127,255,0"],["Chocolate","D2691E","210,105,30"],["Coral","FF7F50","255,127,80"],["CornflowerBlue","6495ED","100,149,237"],["Cornsilk","FFF8DC","255,248,220"],["Crimson","DC143C","220,20,60"],["Cyan","00FFFF","0,255,255"],["DarkBlue","00008B","0,0,139"],["DarkCyan","008B8B","0,139,139"],["DarkGoldenRod","B8860B","184,134,11"],["DarkGray","A9A9A9","169,169,169"],["DarkGreen","006400","0,100,0"],["DarkKhaki","BDB76B","189,183,107"],["DarkMagenta","8B008B","139,0,139"],["DarkOliveGreen","556B2F","85,107,47"],["Darkorange","FF8C00","255,140,0"],["DarkOrchid","9932CC","153,50,204"],["DarkRed","8B0000","139,0,0"],["DarkSalmon","E9967A","233,150,122"],["DarkSeaGreen","8FBC8F","143,188,143"],["DarkSlateBlue","483D8B","72,61,139"],["DarkSlateGray","2F4F4F","47,79,79"],["DarkTurquoise","00CED1","0,206,209"],["DarkViolet","9400D3","148,0,211"],["DeepPink","FF1493","255,20,147"],["DeepSkyBlue","00BFFF","0,191,255"],["DimGray","696969","105,105,105"],["DimGrey","696969","105,105,105"],["DodgerBlue","1E90FF","30,144,255"],["FireBrick","B22222","178,34,34"],["FloralWhite","FFFAF0","255,250,240"],["ForestGreen","228B22","34,139,34"],["Fuchsia","FF00FF","255,0,255"],["Gainsboro","DCDCDC","220,220,220"],["GhostWhite","F8F8FF","248,248,255"],["Gold","FFD700","255,215,0"],["GoldenRod","DAA520","218,165,32"],["Gray","808080","128,128,128"],["Green","008000","0,128,0"],["GreenYellow","ADFF2F","173,255,47"],["HoneyDew","F0FFF0","240,255,240"],["HotPink","FF69B4","255,105,180"],["IndianRed","CD5C5C","205,92,92"],["Indigo","4B0082","75,0,130"],["Ivory","FFFFF0","255,255,240"],["Khaki","F0E68C","240,230,140"],["Lavender","E6E6FA","230,230,250"],["LavenderBlush","FFF0F5","255,240,245"],["LawnGreen","7CFC00","124,252,0"],["LemonChiffon","FFFACD","255,250,205"],["LightBlue","ADD8E6","173,216,230"],["LightCoral","F08080","240,128,128"],["LightCyan","E0FFFF","224,255,255"],["LightGoldenRodYellow","FAFAD2","250,250,210"],["LightGray","D3D3D3","211,211,211"],["LightGreen","90EE90","144,238,144"],["LightPink","FFB6C1","255,182,193"],["LightSalmon","FFA07A","255,160,122"],["LightSeaGreen","20B2AA","32,178,170"],["LightSkyBlue","87CEFA","135,206,250"],["LightSlateGray","778899","119,136,153"],["LightSteelBlue","B0C4DE","176,196,222"],["LightYellow","FFFFE0","255,255,224"],["Lime","00FF00","0,255,0"],["LimeGreen","32CD32","50,205,50"],["Linen","FAF0E6","250,240,230"],["Magenta","FF00FF","255,0,255"],["Maroon","800000","128,0,0"],["MediumAquaMarine","66CDAA","102,205,170"],["MediumBlue","0000CD","0,0,205"],["MediumOrchid","BA55D3","186,85,211"],["MediumPurple","9370DB","147,112,219"],["MediumSeaGreen","3CB371","60,179,113"],["MediumSlateBlue","7B68EE","123,104,238"],["MediumSpringGreen","00FA9A","0,250,154"],["MediumTurquoise","48D1CC","72,209,204"],["MediumVioletRed","C71585","199,21,133"],["MidnightBlue","191970","25,25,112"],["MintCream","F5FFFA","245,255,250"],["MistyRose","FFE4E1","255,228,225"],["Moccasin","FFE4B5","255,228,181"],["NavajoWhite","FFDEAD","255,222,173"],["Navy","000080","0,0,128"],["OldLace","FDF5E6","253,245,230"],["Olive","808000","128,128,0"],["OliveDrab","6B8E23","107,142,35"],["Orange","FFA500","255,165,0"],["OrangeRed","FF4500","255,69,0"],["Orchid","DA70D6","218,112,214"],["PaleGoldenRod","EEE8AA","238,232,170"],["PaleGreen","98FB98","152,251,152"],["PaleTurquoise","AFEEEE","175,238,238"],["PaleVioletRed","DB7093","219,112,147"],["PapayaWhip","FFEFD5","255,239,213"],["PeachPuff","FFDAB9","255,218,185"],["Peru","CD853F","205,133,63"],["Pink","FFC0CB","255,192,203"],["Plum","DDA0DD","221,160,221"],["PowderBlue","B0E0E6","176,224,230"],["Purple","800080","128,0,128"],["Red","FF0000","255,0,0"],["RosyBrown","BC8F8F","188,143,143"],["RoyalBlue","4169E1","65,105,225"],["SaddleBrown","8B4513","139,69,19"],["Salmon","FA8072","250,128,114"],["SandyBrown","F4A460","244,164,96"],["SeaGreen","2E8B57","46,139,87"],["SeaShell","FFF5EE","255,245,238"],["Sienna","A0522D","160,82,45"],["Silver","C0C0C0","192,192,192"],["SkyBlue","87CEEB","135,206,235"],["SlateBlue","6A5ACD","106,90,205"],["SlateGray","708090","112,128,144"],["Snow","FFFAFA","255,250,250"],["SpringGreen","00FF7F","0,255,127"],["SteelBlue","4682B4","70,130,180"],["Tan","D2B48C","210,180,140"],["Teal","008080","0,128,128"],["Thistle","D8BFD8","216,191,216"],["Tomato","FF6347","255,99,71"],["Turquoise","40E0D0","64,224,208"],["Violet","EE82EE","238,130,238"],["Wheat","F5DEB3","245,222,179"],["White","FFFFFF","255,255,255"],["WhiteSmoke","F5F5F5","245,245,245"],["Yellow","FFFF00","255,255,0"],["YellowGreen","9ACD32","154,205,50"]] -------------------------------------------------------------------------------- /src/resources/dict.php: -------------------------------------------------------------------------------- 1 | database . '数据库设计'; 4 | $tables = $this->getTable(); 5 | $foreignKey = $this->getForeignKey(); 6 | $primary = $this->getPrimaryKey(); 7 | $triggers = $this->getTrigger(); 8 | $index = $this->getIndex(); 9 | $defaultComment = $this->defaultComment; 10 | 11 | $html = ''; 12 | // 循环所有表 13 | foreach ($tables as $key => $table) { 14 | $html .= "\n"; 15 | $html .= ''; 16 | // 字段 17 | $html .= ''; 18 | $html .= ''; 19 | $html .= ''; 20 | $html .= ''; 21 | $html .= ''; 22 | $html .= ''; 23 | $html .= ''; 24 | $html .= ''; 25 | $html .= ''; 26 | $html .= ''; 27 | $html .= ''; 28 | $html .= ''; 29 | $html .= ''; 30 | $html .= ''; 31 | foreach ($table['column'] as $order => $column) { 32 | $primaryStr = in_array($column['table_schema'] . '.' . $column['table_name'] . '.' . $column['column_name'], $primary) ? '是' : ''; 33 | $columnForeignKeyStr = isset($foreignKey[$column['table_name'] . '.' . $column['column_name']]) ? $foreignKey[$column['table_name'] . '.' . $column['column_name']] : ''; 34 | if ($column['column_comment'] == '' && isset($defaultComment[$column['column_name']])) 35 | { 36 | $column['column_comment'] = $defaultComment[$column['column_name']]; 37 | } 38 | $html .= ''; 39 | $html .= ''; 40 | $html .= ''; 41 | $html .= ''; 42 | $html .= ''; 43 | $html .= ''; 44 | $html .= ''; 45 | $html .= ''; 46 | $html .= ''; 47 | $html .= ''; 48 | $html .= ''; 49 | } 50 | $html .= ''; 51 | 52 | // 触发器 53 | if (isset($triggers[$table['table_name']])) { 54 | $html .= ''; 55 | $html .= ''; 56 | $html .= ''; 57 | $html .= ''; 58 | $html .= ''; 59 | $html .= ''; 60 | $html .= ''; 61 | $html .= ''; 62 | foreach ($triggers[$table['table_name']] as $trigger) { 63 | $html .= ''; 64 | $html .= ''; 65 | $html .= ''; 66 | $html .= ''; 67 | $html .= ''; 68 | $html .= ''; 69 | $html .= ''; 70 | } 71 | } 72 | // 索引 73 | if (isset($index[$table['table_name']])) { 74 | $html .= ''; 75 | $html .= ''; 76 | $html .= ''; 77 | $html .= ''; 78 | $html .= ''; 79 | $html .= ''; 80 | $html .= ''; 81 | $html .= ''; 82 | foreach ($index[$table['table_name']] as $item) { 83 | $html .= ''; 84 | $html .= ''; 85 | $html .= ''; 86 | $html .= ''; 87 | $html .= ''; 88 | $html .= ''; 89 | $html .= ''; 90 | } 91 | } 92 | 93 | $html .= '
' . ($key + 1) . ' ' . $table['table_name'] . ' ' . $table['table_comment'] . '' . $table['engine'] . '
序号字段名数据类型默认值允许非空自动递增是否主键外键关系备注
' . ($order + 1) . '' . $column['column_name'] . '' . $column['column_type'] . '' . $column['column_default'] . '' . $column['is_nullable'] . '' . ($column['extra'] == 'auto_increment' ? '是' : ' ') . '' . $primaryStr . '' . $columnForeignKeyStr . '' . $column['column_comment'] . '
触发器名称触发类型定义
' . $trigger['name'] . '' . $trigger['timing'] . '' . $trigger['event'] . '' . $trigger['statement'] . '
索引名称唯一索引索引类型字段
' . $item['index_name'] . '' . ($item['non_unique'] ? '否' : '是') . '' . $item['index_type'] . '' . $item['column_name'] . '
' . "\n"; 94 | } 95 | ?> 96 | 97 | 98 | 99 | 100 | <?php echo $title?> 101 | 115 | 116 | 117 |
118 |

119 | 120 |
121 | 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | dtool 2 | ====== 3 | 4 | ## 安装 5 | 6 | 使用 Composer 安装: 7 | 8 | ``` 9 | composer require "yeosz/dtool" 10 | ``` 11 | 12 | ## 使用 13 | 14 | ### Provider 数据供给器 15 | 16 | ```php 17 | $provider = new \Yeosz\Dtool\Provider(); 18 | 19 | $data = [ 20 | 'string' => $provider->getString(10), 21 | 'mb_string' => $provider->getMbString(10), 22 | 'city' => $provider->city, 23 | 'address' => $provider->address, 24 | 'uuid' => $provider->uuid, 25 | 'id_card' => $provider->id_card, 26 | 'image_url' => $provider->image_url, 27 | 'bitmap_url' => $provider->bitmap_url, 28 | 'name' => $provider->name, 29 | 'first_name' => $provider->first_name, 30 | 'last_name' => $provider->last_name, 31 | 'phone' => $provider->phone, 32 | 'mobile' => $provider->mobile, 33 | 'email' => $provider->email, 34 | 'qq' => $provider->qq, 35 | 'postcode' => $provider->postcode, 36 | 'company_name' => $provider->company_name, 37 | 'ean8' => $provider->ean8, 38 | 'ean13' => $provider->ean13, 39 | 'timestamp' => $provider->timestamp, 40 | 'year' => $provider->year, 41 | 'date' => $provider->date, 42 | 'time' => $provider->time, 43 | 'integer' => $provider->integer, 44 | 'random' => $provider->randomValue([1, 2, 3]), 45 | 'payment' => $provider->payment, 46 | 'bank' => $provider->bank, 47 | 'color_name' => $provider->color_name, 48 | 'color_hex' => $provider->color_hex, 49 | 'color_rgb' => $provider->color_rgb, 50 | 'version' => $provider->version, 51 | 'between' => $provider->between(11, 99, 1000), 52 | ]; 53 | 54 | print_r($data); 55 | 56 | // 数字供应器 numberProvider 57 | $provider->numberProvider->randomMediumint(); 58 | // 时间供应器 datetimeProvider 59 | $provider->datetimeProvider->time(); 60 | 61 | // 自增长 62 | $provider->addIncrement('sort', 1); 63 | var_dump($provider->sort); 64 | var_dump($provider->sort); 65 | var_dump($provider->sort); 66 | 67 | // 自定义供应器 68 | $provider->addProvider('my_time', function(){ 69 | return time(); 70 | }); 71 | var_dump($provider->my_time); 72 | ``` 73 | 74 | ### DB PDO封装 75 | 76 | ```php 77 | 78 | $db = new Yeosz\Dtool\DB('localhost;port=33060', 'homestead', 'homestead', 'secret'); 79 | 80 | $sql = "CREATE TABLE `dtool_test` ( 81 | `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', 82 | `username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名', 83 | `name` varchar(20) NOT NULL DEFAULT '' COMMENT '真实姓名', 84 | `sex` enum('2','1','0') NOT NULL COMMENT '性别:1男2女0未知', 85 | `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'user id', 86 | `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', 87 | `address` varchar(60) NOT NULL DEFAULT '' COMMENT '地址', 88 | `remarks` varchar(128) NOT NULL DEFAULT '' COMMENT '备注', 89 | `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间', 90 | PRIMARY KEY (`id`), 91 | UNIQUE KEY `unique_username` (`username`) USING HASH 92 | ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;"; 93 | $db->query($sql); 94 | 95 | $rows = $db->query("select * from dtool_test where " . $db->buildInCondition('id', [1,2,3,4], true) . " order by id desc"); 96 | print_r($rows); 97 | 98 | $row = $db->row("select id,name from dtool_test where id=:id", ['id'=>1]); 99 | print_r($row); 100 | 101 | $column = $db->column("select name from dtool_test"); 102 | print_r($column); 103 | 104 | $cell = $db->cell("select name from dtool_test where id=?", [1]); 105 | print_r($cell); 106 | ``` 107 | 108 | ### MysqlTool MySQL工具 109 | 110 | ```php 111 | $db = new Yeosz\Dtool\DB('localhost:33060', 'homestead', 'homestead', 'secret'); 112 | 113 | $tool = new Yeosz\Dtool\MysqlTool($db, 'homestead'); 114 | // 生成文档 115 | file_put_contents('./document.html', $tool->getDocument()); 116 | 117 | // 生成表数据供应器 118 | $tool->buildTableProvider('./tp/', 'TableProvider'); 119 | ``` 120 | 121 | ![image](https://raw.githubusercontent.com/yeosz/dtool/master/examples/doc.png) 122 | 123 | ### TableProvider 表数据供给器 124 | 125 | - [DtoolTest](https://github.com/yeosz/dtool/blob/master/examples/tp/DtoolTest.php) 126 | 127 | ```php 128 | // omposer.json修改autoload部分,增加命名空间 129 | $table = new \TableProvider\DtoolTest(); 130 | $data = $table->generate(); // 生成数据,但不插入数据库 131 | $table->db->insert('dtool_test', $data); 132 | $table->create(2); // 生成数据,并插入数据库 133 | // generate和create都可以传入一个闭包参数,对数据进行修改 134 | $data = $table->generate(function ($current){ 135 | $current['user_id'] = mt_rand(111,999); 136 | return $current; 137 | }); 138 | 139 | // 表也可以针对某列自定义数据供应器 方法名以dataProvider开头 140 | class DtoolTest extends Base 141 | { 142 | public $table = 'dtool_test'; 143 | public $columns = [ 144 | 'username' => ["getString",16], 145 | 'name' => ["getString",16], 146 | 'sex' => ["randomValue",["2","1","0"]], 147 | 'user_id' => ["custom_user_id"], 148 | 'price' => ["randomFloat",8,2], 149 | 'address' => ["getString",16], 150 | 'remarks' => ["getString",16], 151 | 'created_at' => ["timestamp"], 152 | ]; 153 | public $pk = 'id'; 154 | 155 | public function dataProviderCustomUserId() 156 | { 157 | return mt_rand(111,999); 158 | } 159 | } 160 | 161 | ``` 162 | 163 | ### MysqlCompare 结构同步 164 | 165 | ```php 166 | 167 | $db1 = new Yeosz\Dtool\DB('localhost', 'demo1', 'homestead', 'secret'); 168 | $db2 = new Yeosz\Dtool\DB('localhost', 'demo2', 'homestead', 'secret'); 169 | 170 | $diff = new \Yeosz\Dtool\MysqlCompare($db2, $db1); 171 | $diff->showSql(); 172 | 173 | ``` 174 | 175 | ### Postman 176 | 177 | - [postman.js](https://github.com/yeosz/dtool/blob/master/src/resources/postman.js) 178 | 179 | 接口调试时生成随机数据,方便测试(建议先压缩) 180 | 181 | ![image](https://raw.githubusercontent.com/yeosz/dtool/master/examples/postman.png) 182 | 183 | ## 参考 184 | 185 | - [详细参考资料](https://github.com/yeosz/dtool/tree/master/src/resources) 186 | 187 | # License 188 | 189 | MIT 190 | -------------------------------------------------------------------------------- /src/resources/chinese.characters.csv: -------------------------------------------------------------------------------- 1 | 一,乙,二,十,丁,厂,七,卜,八,人,入,儿,匕,几,九,刁,了,刀,力,乃,又,三,干,于,亏,工,土,士,才,下,寸,大,丈,与,万,上,小,口,山,巾,千,乞,川,亿,个,夕,久,么,勺,凡,丸,及,广,亡,门,丫,义,之,尸,己,已,巳,弓,子,卫,也,女,刃,飞,习,叉,马,乡,丰,王,开,井,天,夫,元,无,云,专,丐,扎,艺,木,五,支,厅,不,犬,太,区,历,歹,友,尤,匹,车,巨,牙,屯,戈,比,互,切,瓦,止,少,曰,日,中,贝,冈,内,水,见,午,牛,手,气,毛,壬,升,夭,长,仁,什,片,仆,化,仇,币,仍,仅,斤,爪,反,介,父,从,仑,今,凶,分,乏,公,仓,月,氏,勿,欠,风,丹,匀,乌,勾,凤,六,文,亢,方,火,为,斗,忆,计,订,户,认,冗,讥,心,尺,引,丑,巴,孔,队,办,以,允,予,邓,劝,双,书,幻,玉,刊,未,末,示,击,打,巧,正,扑,卉,扒,功,扔,去,甘,世,艾,古,节,本,术,可,丙,左,厉,石,右,布,夯,戊,龙,平,灭,轧,东,卡,北,占,凸,卢,业,旧,帅,归,旦,目,且,叶,甲,申,叮,电,号,田,由,只,叭,史,央,兄,叽,叼,叫,叩,叨,另,叹,冉,皿,凹,囚,四,生,矢,失,乍,禾,丘,付,仗,代,仙,们,仪,白,仔,他,斥,瓜,乎,丛,令,用,甩,印,尔,乐,句,匆,册,卯,犯,外,处,冬,鸟,务,包,饥,主,市,立,冯,玄,闪,兰,半,汁,汇,头,汉,宁,穴,它,讨,写,让,礼,训,议,必,讯,记,永,司,尼,民,弗,弘,出,辽,奶,奴,召,加,皮,边,孕,发,圣,对,台,矛,纠,母,幼,丝,邦,式,迂,刑,戎,动,扛,寺,吉,扣,考,托,老,巩,圾,执,扩,扫,地,场,扬,耳,芋,共,芒,亚,芝,朽,朴,机,权,过,臣,吏,再,协,西,压,厌,戌,在,百,有,存,而,页,匠,夸,夺,灰,达,列,死,成,夹,夷,轨,邪,尧,划,迈,毕,至,此,贞,师,尘,尖,劣,光,当,早,吁,吐,吓,虫,曲,团,吕,同,吊,吃,因,吸,吗,吆,屿,屹,岁,帆,回,岂,则,刚,网,肉,年,朱,先,丢,廷,舌,竹,迁,乔,迄,伟,传,乒,乓,休,伍,伏,优,臼,伐,延,仲,件,任,伤,价,伦,份,华,仰,仿,伙,伪,自,伊,血,向,似,后,行,舟,全,会,杀,合,兆,企,众,爷,伞,创,肌,肋,朵,杂,危,旬,旨,旭,负,匈,名,各,多,争,色,壮,冲,妆,冰,庄,庆,亦,刘,齐,交,衣,次,产,决,亥,充,妄,闭,问,闯,羊,并,关,米,灯,州,汗,污,江,汛,池,汝,汤,忙,兴,宇,守,宅,字,安,讲,讳,军,讶,许,讹,论,讼,农,讽,设,访,诀,寻,那,迅,尽,导,异,弛,孙,阵,阳,收,阶,阴,防,奸,如,妇,妃,好,她,妈,戏,羽,观,欢,买,红,驮,纤,驯,约,级,纪,驰,纫,巡,寿,弄,麦,玖,玛,形,进,戒,吞,远,违,韧,运,扶,抚,坛,技,坏,抠,扰,扼,拒,找,批,址,扯,走,抄,贡,汞,坝,攻,赤,折,抓,扳,抡,扮,抢,孝,坎,均,抑,抛,投,坟,坑,抗,坊,抖,护,壳,志,块,扭,声,把,报,拟,却,抒,劫,芙,芜,苇,芽,花,芹,芥,芬,苍,芳,严,芦,芯,劳,克,芭,苏,杆,杠,杜,材,村,杖,杏,杉,巫,极,李,杨,求,甫,匣,更,束,吾,豆,两,酉,丽,医,辰,励,否,还,尬,歼,来,连,轩,步,卤,坚,肖,旱,盯,呈,时,吴,助,县,里,呆,吱,吠,呕,园,旷,围,呀,吨,足,邮,男,困,吵,串,员,呐,听,吟,吩,呛,吻,吹,呜,吭,吧,邑,吼,囤,别,吮,岖,岗,帐,财,针,钉,牡,告,我,乱,利,秃,秀,私,每,兵,估,体,何,佐,佑,但,伸,佃,作,伯,伶,佣,低,你,住,位,伴,身,皂,伺,佛,囱,近,彻,役,返,余,希,坐,谷,妥,含,邻,岔,肝,肛,肚,肘,肠,龟,甸,免,狂,犹,狈,角,删,条,彤,卵,灸,岛,刨,迎,饭,饮,系,言,冻,状,亩,况,床,库,庇,疗,吝,应,这,冷,庐,序,辛,弃,冶,忘,闰,闲,间,闷,判,兑,灶,灿,灼,弟,汪,沐,沛,汰,沥,沙,汽,沃,沦,汹,泛,沧,没,沟,沪,沈,沉,沁,怀,忧,忱,快,完,宋,宏,牢,究,穷,灾,良,证,启,评,补,初,社,祀,识,诈,诉,罕,诊,词,译,君,灵,即,层,屁,尿,尾,迟,局,改,张,忌,际,陆,阿,陈,阻,附,坠,妓,妙,妖,姊,妨,妒,努,忍,劲,矣,鸡,纬,驱,纯,纱,纲,纳,驳,纵,纷,纸,纹,纺,驴,纽,奉,玩,环,武,青,责,现,玫,表,规,抹,卦,坷,坯,拓,拢,拔,坪,拣,坦,担,坤,押,抽,拐,拖,者,拍,顶,拆,拎,拥,抵,拘,势,抱,拄,垃,拉,拦,幸,拌,拧,拂,拙,招,坡,披,拨,择,抬,拇,拗,其,取,茉,苦,昔,苛,若,茂,苹,苗,英,苟,苑,苞,范,直,茁,茄,茎,苔,茅,枉,林,枝,杯,枢,柜,枚,析,板,松,枪,枫,构,杭,杰,述,枕,丧,或,画,卧,事,刺,枣,雨,卖,郁,矾,矿,码,厕,奈,奔,奇,奋,态,欧,殴,垄,妻,轰,顷,转,斩,轮,软,到,非,叔,歧,肯,齿,些,卓,虎,虏,肾,贤,尚,旺,具,味,果,昆,国,哎,咕,昌,呵,畅,明,易,咙,昂,迪,典,固,忠,呻,咒,咋,咐,呼,鸣,咏,呢,咄,咖,岸,岩,帖,罗,帜,帕,岭,凯,败,账,贩,贬,购,贮,图,钓,制,知,迭,氛,垂,牧,物,乖,刮,秆,和,季,委,秉,佳,侍,岳,供,使,例,侠,侥,版,侄,侦,侣,侧,凭,侨,佩,货,侈,依,卑,的,迫,质,欣,征,往,爬,彼,径,所,舍,金,刹,命,肴,斧,爸,采,觅,受,乳,贪,念,贫,忿,肤,肺,肢,肿,胀,朋,股,肮,肪,肥,服,胁,周,昏,鱼,兔,狐,忽,狗,狞,备,饰,饱,饲,变,京,享,庞,店,夜,庙,府,底,疟,疙,疚,剂,卒,郊,庚,废,净,盲,放,刻,育,氓,闸,闹,郑,券,卷,单,炬,炒,炊,炕,炎,炉,沫,浅,法,泄,沽,河,沾,泪,沮,油,泊,沿,泡,注,泣,泞,泻,泌,泳,泥,沸,沼,波,泼,泽,治,怔,怯,怖,性,怕,怜,怪,怡,学,宝,宗,定,宠,宜,审,宙,官,空,帘,宛,实,试,郎,诗,肩,房,诚,衬,衫,视,祈,话,诞,诡,询,该,详,建,肃,录,隶,帚,屉,居,届,刷,屈,弧,弥,弦,承,孟,陋,陌,孤,陕,降,函,限,妹,姑,姐,姓,妮,始,姆,迢,驾,叁,参,艰,线,练,组,绅,细,驶,织,驹,终,驻,绊,驼,绍,绎,经,贯,契,贰,奏,春,帮,玷,珍,玲,珊,玻,毒,型,拭,挂,封,持,拷,拱,项,垮,挎,城,挟,挠,政,赴,赵,挡,拽,哉,挺,括,垢,拴,拾,挑,垛,指,垫,挣,挤,拼,挖,按,挥,挪,拯,某,甚,荆,茸,革,茬,荐,巷,带,草,茧,茵,茶,荒,茫,荡,荣,荤,荧,故,胡,荫,荔,南,药,标,栈,柑,枯,柄,栋,相,查,柏,栅,柳,柱,柿,栏,柠,树,勃,要,柬,咸,威,歪,研,砖,厘,厚,砌,砂,泵,砚,砍,面,耐,耍,牵,鸥,残,殃,轴,轻,鸦,皆,韭,背,战,点,虐,临,览,竖,省,削,尝,昧,盹,是,盼,眨,哇,哄,哑,显,冒,映,星,昨,咧,昭,畏,趴,胃,贵,界,虹,虾,蚁,思,蚂,虽,品,咽,骂,勋,哗,咱,响,哈,哆,咬,咳,咪,哪,哟,炭,峡,罚,贱,贴,贻,骨,幽,钙,钝,钞,钟,钢,钠,钥,钦,钧,钩,钮,卸,缸,拜,看,矩,毡,氢,怎,牲,选,适,秒,香,种,秋,科,重,复,竿,段,便,俩,贷,顺,修,俏,保,促,俄,俐,侮,俭,俗,俘,信,皇,泉,鬼,侵,禹,侯,追,俊,盾,待,徊,衍,律,很,须,叙,剑,逃,食,盆,胚,胧,胆,胜,胞,胖,脉,胎,勉,狭,狮,独,狰,狡,狱,狠,贸,怨,急,饵,饶,蚀,饺,饼,峦,弯,将,奖,哀,亭,亮,度,迹,庭,疮,疯,疫,疤,咨,姿,亲,音,帝,施,闺,闻,闽,阀,阁,差,养,美,姜,叛,送,类,迷,籽,娄,前,首,逆,兹,总,炼,炸,烁,炮,炫,烂,剃,洼,洁,洪,洒,柒,浇,浊,洞,测,洗,活,派,洽,染,洛,浏,济,洋,洲,浑,浓,津,恃,恒,恢,恍,恬,恤,恰,恼,恨,举,觉,宣,宦,室,宫,宪,突,穿,窃,客,诫,冠,诬,语,扁,袄,祖,神,祝,祠,误,诱,诲,说,诵,垦,退,既,屋,昼,屏,屎,费,陡,逊,眉,孩,陨,除,险,院,娃,姥,姨,姻,娇,姚,娜,怒,架,贺,盈,勇,怠,癸,蚤,柔,垒,绑,绒,结,绕,骄,绘,给,绚,骆,络,绝,绞,骇,统,耕,耘,耗,耙,艳,泰,秦,珠,班,素,匿,蚕,顽,盏,匪,捞,栽,捕,埂,捂,振,载,赶,起,盐,捎,捍,捏,埋,捉,捆,捐,损,袁,捌,都,哲,逝,捡,挫,换,挽,挚,热,恐,捣,壶,捅,埃,挨,耻,耿,耽,聂,恭,莽,莱,莲,莫,莉,荷,获,晋,恶,莹,莺,真,框,梆,桂,桔,栖,档,桐,株,桥,桦,栓,桃,格,桩,校,核,样,根,索,哥,速,逗,栗,贾,酌,配,翅,辱,唇,夏,砸,砰,砾,础,破,原,套,逐,烈,殊,殉,顾,轿,较,顿,毙,致,柴,桌,虑,监,紧,党,逞,晒,眠,晓,哮,唠,鸭,晃,哺,晌,剔,晕,蚌,畔,蚣,蚊,蚪,蚓,哨,哩,圃,哭,哦,恩,鸯,唤,唁,哼,唧,啊,唉,唆,罢,峭,峨,峰,圆,峻,贼,贿,赂,赃,钱,钳,钻,钾,铁,铃,铅,缺,氧,氨,特,牺,造,乘,敌,秤,租,积,秧,秩,称,秘,透,笔,笑,笋,债,借,值,倚,俺,倾,倒,倘,俱,倡,候,赁,俯,倍,倦,健,臭,射,躬,息,倔,徒,徐,殷,舰,舱,般,航,途,拿,耸,爹,舀,爱,豺,豹,颁,颂,翁,胰,脆,脂,胸,胳,脏,脐,胶,脑,脓,逛,狸,狼,卿,逢,鸵,留,鸳,皱,饿,馁,凌,凄,恋,桨,浆,衰,衷,高,郭,席,准,座,症,病,疾,斋,疹,疼,疲,脊,效,离,紊,唐,瓷,资,凉,站,剖,竞,部,旁,旅,畜,阅,羞,羔,瓶,拳,粉,料,益,兼,烤,烘,烦,烧,烛,烟,烙,递,涛,浙,涝,浦,酒,涉,消,涡,浩,海,涂,浴,浮,涣,涤,流,润,涧,涕,浪,浸,涨,烫,涩,涌,悖,悟,悄,悍,悔,悯,悦,害,宽,家,宵,宴,宾,窍,窄,容,宰,案,请,朗,诸,诺,读,扇,诽,袜,袖,袍,被,祥,课,冥,谁,调,冤,谅,谆,谈,谊,剥,恳,展,剧,屑,弱,陵,祟,陶,陷,陪,娱,娟,恕,娥,娘,通,能,难,预,桑,绢,绣,验,继,骏,球,琐,理,琉,琅,捧,堵,措,描,域,捺,掩,捷,排,焉,掉,捶,赦,堆,推,埠,掀,授,捻,教,掏,掐,掠,掂,培,接,掷,控,探,据,掘,掺,职,基,聆,勘,聊,娶,著,菱,勒,黄,菲,萌,萝,菌,萎,菜,萄,菊,菩,萍,菠,萤,营,乾,萧,萨,菇,械,彬,梦,婪,梗,梧,梢,梅,检,梳,梯,桶,梭,救,曹,副,票,酝,酗,厢,戚,硅,硕,奢,盔,爽,聋,袭,盛,匾,雪,辅,辆,颅,虚,彪,雀,堂,常,眶,匙,晨,睁,眯,眼,悬,野,啪,啦,曼,晦,晚,啄,啡,距,趾,啃,跃,略,蚯,蛀,蛇,唬,累,鄂,唱,患,啰,唾,唯,啤,啥,啸,崖,崎,崭,逻,崔,帷,崩,崇,崛,婴,圈,铐,铛,铝,铜,铭,铲,银,矫,甜,秸,梨,犁,秽,移,笨,笼,笛,笙,符,第,敏,做,袋,悠,偿,偶,偎,偷,您,售,停,偏,躯,兜,假,衅,徘,徙,得,衔,盘,舶,船,舵,斜,盒,鸽,敛,悉,欲,彩,领,脚,脖,脯,豚,脸,脱,象,够,逸,猜,猪,猎,猫,凰,猖,猛,祭,馅,馆,凑,减,毫,烹,庶,麻,庵,痊,痒,痕,廊,康,庸,鹿,盗,章,竟,商,族,旋,望,率,阎,阐,着,羚,盖,眷,粘,粗,粒,断,剪,兽,焊,焕,清,添,鸿,淋,涯,淹,渠,渐,淑,淌,混,淮,淆,渊,淫,渔,淘,淳,液,淤,淡,淀,深,涮,涵,婆,梁,渗,情,惜,惭,悼,惧,惕,惟,惊,惦,悴,惋,惨,惯,寇,寅,寄,寂,宿,窒,窑,密,谋,谍,谎,谐,袱,祷,祸,谓,谚,谜,逮,敢,尉,屠,弹,隋,堕,随,蛋,隅,隆,隐,婚,婶,婉,颇,颈,绩,绪,续,骑,绰,绳,维,绵,绷,绸,综,绽,绿,缀,巢,琴,琳,琢,琼,斑,替,揍,款,堪,塔,搭,堰,揩,越,趁,趋,超,揽,堤,提,博,揭,喜,彭,揣,插,揪,搜,煮,援,搀,裁,搁,搓,搂,搅,壹,握,搔,揉,斯,期,欺,联,葫,散,惹,葬,募,葛,董,葡,敬,葱,蒋,蒂,落,韩,朝,辜,葵,棒,棱,棋,椰,植,森,焚,椅,椒,棵,棍,椎,棉,棚,棕,棺,榔,椭,惠,惑,逼,粟,棘,酣,酥,厨,厦,硬,硝,确,硫,雁,殖,裂,雄,颊,雳,暂,雅,翘,辈,悲,紫,凿,辉,敞,棠,赏,掌,晴,睐,暑,最,晰,量,鼎,喷,喳,晶,喇,遇,喊,遏,晾,景,畴,践,跋,跌,跑,跛,遗,蛙,蛛,蜓,蜒,蛤,喝,鹃,喂,喘,喉,喻,啼,喧,嵌,幅,帽,赋,赌,赎,赐,赔,黑,铸,铺,链,销,锁,锄,锅,锈,锋,锌,锐,甥,掰,短,智,氮,毯,氯,鹅,剩,稍,程,稀,税,筐,等,筑,策,筛,筒,筏,答,筋,筝,傲,傅,牌,堡,集,焦,傍,储,皓,皖,粤,奥,街,惩,御,循,艇,舒,逾,番,释,禽,腊,脾,腋,腔,腕,鲁,猩,猬,猾,猴,惫,然,馈,馋,装,蛮,就,敦,斌,痘,痢,痪,痛,童,竣,阔,善,翔,羡,普,粪,尊,奠,道,遂,曾,焰,港,滞,湖,湘,渣,渤,渺,湿,温,渴,溃,溅,滑,湃,渝,湾,渡,游,滋,渲,溉,愤,慌,惰,愕,愣,惶,愧,愉,慨,割,寒,富,寓,窜,窝,窖,窗,窘,遍,雇,裕,裤,裙,禅,禄,谢,谣,谤,谦,犀,属,屡,强,粥,疏,隔,隙,隘,媒,絮,嫂,媚,婿,登,缅,缆,缉,缎,缓,缔,缕,骗,编,骚,缘,瑟,鹉,瑞,瑰,瑙,魂,肆,摄,摸,填,搏,塌,鼓,摆,携,搬,摇,搞,塘,摊,聘,斟,蒜,勤,靴,靶,鹊,蓝,墓,幕,蓬,蓄,蒲,蓉,蒙,蒸,献,椿,禁,楚,楷,榄,想,槐,榆,楼,概,赖,酪,酬,感,碍,碘,碑,碎,碰,碗,碌,尴,雷,零,雾,雹,辐,辑,输,督,频,龄,鉴,睛,睹,睦,瞄,睫,睡,睬,嗜,鄙,嗦,愚,暖,盟,歇,暗,暇,照,畸,跨,跷,跳,跺,跪,路,跤,跟,遣,蜈,蜗,蛾,蜂,蜕,嗅,嗡,嗓,署,置,罪,罩,蜀,幌,错,锚,锡,锣,锤,锥,锦,键,锯,锰,矮,辞,稚,稠,颓,愁,筹,签,简,筷,毁,舅,鼠,催,傻,像,躲,魁,衙,微,愈,遥,腻,腰,腥,腮,腹,腺,鹏,腾,腿,鲍,猿,颖,触,解,煞,雏,馍,馏,酱,禀,痹,廓,痴,痰,廉,靖,新,韵,意,誊,粮,数,煎,塑,慈,煤,煌,满,漠,滇,源,滤,滥,滔,溪,溜,漓,滚,溢,溯,滨,溶,溺,粱,滩,慎,誉,塞,寞,窥,窟,寝,谨,褂,裸,福,谬,群,殿,辟,障,媳,嫉,嫌,嫁,叠,缚,缝,缠,缤,剿,静,碧,璃,赘,熬,墙,墟,嘉,摧,赫,截,誓,境,摘,摔,撇,聚,慕,暮,摹,蔓,蔑,蔡,蔗,蔽,蔼,熙,蔚,兢,模,槛,榴,榜,榨,榕,歌,遭,酵,酷,酿,酸,碟,碱,碳,磁,愿,需,辖,辗,雌,裳,颗,瞅,墅,嗽,踊,蜻,蜡,蝇,蜘,蝉,嘛,嘀,赚,锹,锻,镀,舞,舔,稳,熏,箕,算,箩,管,箫,舆,僚,僧,鼻,魄,魅,貌,膜,膊,膀,鲜,疑,孵,馒,裹,敲,豪,膏,遮,腐,瘩,瘟,瘦,辣,彰,竭,端,旗,精,粹,歉,弊,熄,熔,煽,潇,漆,漱,漂,漫,滴,漾,演,漏,慢,慷,寨,赛,寡,察,蜜,寥,谭,肇,褐,褪,谱,隧,嫩,翠,熊,凳,骡,缩,慧,撵,撕,撒,撩,趣,趟,撑,撮,撬,播,擒,墩,撞,撤,增,撰,聪,鞋,鞍,蕉,蕊,蔬,蕴,横,槽,樱,橡,樟,橄,敷,豌,飘,醋,醇,醉,磕,磊,磅,碾,震,霄,霉,瞒,题,暴,瞎,嘻,嘶,嘲,嘹,影,踢,踏,踩,踪,蝶,蝴,蝠,蝎,蝌,蝗,蝙,嘿,嘱,幢,墨,镇,镐,镑,靠,稽,稻,黎,稿,稼,箱,篓,箭,篇,僵,躺,僻,德,艘,膝,膛,鲤,鲫,熟,摩,褒,瘪,瘤,瘫,凛,颜,毅,糊,遵,憋,潜,澎,潮,潭,鲨,澳,潘,澈,澜,澄,懂,憔,懊,憎,额,翩,褥,谴,鹤,憨,慰,劈,履,豫,缭,撼,擂,操,擅,燕,蕾,薯,薛,薇,擎,薪,薄,颠,翰,噩,橱,橙,橘,整,融,瓢,醒,霍,霎,辙,冀,餐,嘴,踱,蹄,蹂,蟆,螃,器,噪,鹦,赠,默,黔,镜,赞,穆,篮,篡,篷,篱,儒,邀,衡,膨,雕,鲸,磨,瘾,瘸,凝,辨,辩,糙,糖,糕,燃,濒,澡,激,懒,憾,懈,窿,壁,避,缰,缴,戴,擦,藉,鞠,藏,藐,檬,檐,檀,礁,磷,霜,霞,瞭,瞧,瞬,瞳,瞩,瞪,曙,蹋,蹈,螺,蟋,蟀,嚎,赡,穗,魏,簧,簇,繁,徽,爵,朦,臊,鳄,癌,辫,赢,糟,糠,燥,懦,豁,臀,臂,翼,骤,藕,鞭,藤,覆,瞻,蹦,嚣,镰,翻,鳍,鹰,瀑,襟,璧,戳,孽,警,蘑,藻,攀,曝,蹲,蹭,蹬,巅,簸,簿,蟹,颤,靡,癣,瓣,羹,鳖,爆,疆,鬓,壤,馨,耀,躁,蠕,嚼,嚷,巍,籍,鳞,魔,糯,灌,譬,蠢,霸,露,霹,躏,黯,髓,赣,囊,镶,瓤,罐,矗 -------------------------------------------------------------------------------- /src/DB.php: -------------------------------------------------------------------------------- 1 | host = $host; 73 | $this->dbName = $dbName; 74 | $this->dbUser = $dbUser; 75 | $this->dbPassword = $dbPassword; 76 | $this->connect(); 77 | } 78 | 79 | /** 80 | * 创建连接 81 | */ 82 | private function connect() 83 | { 84 | try { 85 | $this->pdo = new \PDO('mysql:dbname=' . $this->dbName . ';host=' . $this->host . ';charset=utf8', 86 | $this->dbUser, 87 | $this->dbPassword, 88 | array( 89 | \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", 90 | \PDO::ATTR_EMULATE_PREPARES => false, 91 | \PDO::ATTR_PERSISTENT => true, // 长链接 92 | \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 93 | \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true 94 | ) 95 | ); 96 | $this->bConnected = true; 97 | } catch (\PDOException $e) { 98 | trigger_error($e->getMessage(), E_USER_ERROR); 99 | die(); 100 | } 101 | } 102 | 103 | /** 104 | * 关闭连接 105 | */ 106 | public function closeConnection() 107 | { 108 | $this->pdo = null; 109 | } 110 | 111 | /** 112 | * 转化 113 | * 114 | * @param $query 115 | * @param array $parameters 116 | */ 117 | private function init($query, $parameters = []) 118 | { 119 | if (!$this->bConnected) { 120 | $this->connect(); 121 | } 122 | $this->parameters = $parameters; 123 | 124 | // 重连再试 125 | try { 126 | $this->sQuery = @$this->pdo->prepare($this->buildParams($query, $this->parameters)); 127 | } catch (\PDOException $e) { 128 | if (strtolower($e->getCode()) == 'hy000') { 129 | $this->connect(); 130 | $this->sQuery = $this->pdo->prepare($this->buildParams($query, $this->parameters)); 131 | } 132 | } 133 | 134 | if (!empty($this->parameters)) { 135 | if (array_key_exists(0, $parameters)) { 136 | $parametersType = true; 137 | array_unshift($this->parameters, ''); 138 | unset($this->parameters[0]); 139 | } else { 140 | $parametersType = false; 141 | } 142 | foreach ($this->parameters as $column => $value) { 143 | $this->sQuery->bindParam($parametersType ? intval($column) : ':' . $column, $this->parameters[$column]); 144 | } 145 | } 146 | 147 | $this->sQuery->execute(); 148 | $this->queryCount++; 149 | 150 | $this->parameters = array(); 151 | } 152 | 153 | /** 154 | * 拼接参数 155 | * 156 | * @param $query 157 | * @param null $params 158 | * @return mixed 159 | */ 160 | private function buildParams($query, $params = null) 161 | { 162 | if (!empty($params)) { 163 | $rawStatement = explode(" ", $query); 164 | foreach ($rawStatement as $value) { 165 | if (strtolower($value) == 'in') { 166 | return str_replace("(?)", "(" . implode(",", array_fill(0, count($params), "?")) . ")", $query); 167 | } 168 | } 169 | } 170 | return $query; 171 | } 172 | 173 | /** 174 | * 执行sql 175 | * 176 | * @param $query 177 | * @param null $params 178 | * @param int $fetchMode 179 | * @return null 180 | */ 181 | public function query($query, $params = null, $fetchMode = \PDO::FETCH_ASSOC) 182 | { 183 | $query = trim($query); 184 | $rawStatement = explode(" ", $query); 185 | $this->init($query, $params); 186 | $statement = strtolower($rawStatement[0]); 187 | if ($statement === 'select' || $statement === 'show') { 188 | return $this->sQuery->fetchAll($fetchMode); 189 | } elseif ($statement === 'insert' || $statement === 'update' || $statement === 'delete') { 190 | return $this->sQuery->rowCount(); 191 | } else { 192 | return NULL; 193 | } 194 | } 195 | 196 | /** 197 | * 插入数据 198 | * 199 | * @param $table 200 | * @param $insertRow 201 | * @param int|string|bool $returnPk 202 | * @param bool $ignore 203 | * @return bool|int 204 | */ 205 | public function insert($table, $insertRow, $returnPk = 0, $ignore = false) 206 | { 207 | $sql = [[], []]; 208 | foreach ($insertRow as $key => $v) { 209 | $sql[0][] = $key; 210 | $sql[1][] = ':' . $key; 211 | } 212 | $sql[0] = implode(',', $sql[0]); 213 | $sql[1] = implode(',', $sql[1]); 214 | 215 | $ignoreStr = $ignore ? 'ignore' : ''; 216 | $result = $this->query("INSERT {$ignoreStr} INTO {$table} ({$sql[0]}) VALUES ($sql[1])", $insertRow); 217 | return empty($returnPk) ? $result : $this->lastInsertId(); 218 | } 219 | 220 | /** 221 | * 新增的id 222 | * 223 | * @return mixed 224 | */ 225 | public function lastInsertId() 226 | { 227 | return $this->pdo->lastInsertId(); 228 | } 229 | 230 | /** 231 | * 获取一列数据 232 | * 233 | * @param $query 234 | * @param null $params 235 | * @return mixed 236 | */ 237 | public function column($query, $params = null) 238 | { 239 | $this->init($query, $params); 240 | $resultColumn = $this->sQuery->fetchAll(\PDO::FETCH_COLUMN); 241 | $this->rowCount = $this->sQuery->rowCount(); 242 | $this->columnCount = $this->sQuery->columnCount(); 243 | $this->sQuery->closeCursor(); 244 | return $resultColumn; 245 | } 246 | 247 | /** 248 | * 获取一行数据 249 | * 250 | * @param $query 251 | * @param null $params 252 | * @param int $fetchMode 253 | * @return mixed 254 | */ 255 | public function row($query, $params = null, $fetchMode = \PDO::FETCH_ASSOC) 256 | { 257 | $this->init($query, $params); 258 | $resultRow = $this->sQuery->fetch($fetchMode); 259 | $this->rowCount = $this->sQuery->rowCount(); 260 | $this->columnCount = $this->sQuery->columnCount(); 261 | $this->sQuery->closeCursor(); 262 | return $resultRow; 263 | } 264 | 265 | /** 266 | * 获取单元格数据 267 | * 268 | * @param $query 269 | * @param null $params 270 | * @return mixed 271 | */ 272 | public function cell($query, $params = null) 273 | { 274 | $this->init($query, $params); 275 | return $this->sQuery->fetchColumn(); 276 | } 277 | 278 | /** 279 | * 拼接WHERE in条件 280 | * 281 | * @param string $field 字段 282 | * @param string|array $condition 条件 283 | * @param bool $isNumeric 是否数值,默认 true 284 | * @return string 285 | */ 286 | public function buildInCondition($field, $condition, $isNumeric = true) 287 | { 288 | if (is_string($condition)) { 289 | $condition = explode(',', $condition); 290 | } 291 | if (empty($condition)) { 292 | return "1=2"; 293 | } 294 | if ($isNumeric) { 295 | $condition = array_map('floatval', $condition); 296 | $condition = array_unique($condition); 297 | return count($condition) == 1 ? "{$field}={$condition[0]}" : "{$field} in (" . implode(',', $condition) . ")"; 298 | } else { 299 | $condition = array_map('trim', $condition); 300 | $condition = array_unique($condition); 301 | return count($condition) == 1 ? "{$field}='{$condition[0]}'" : "{$field} in ('" . implode("','", $condition) . "')"; 302 | } 303 | } 304 | 305 | /** 306 | * 获取连接的信息 307 | * 308 | * @return array 309 | */ 310 | public function getConnectInfo() 311 | { 312 | return ['host' => $this->host, 'name' => $this->dbName, 'user' => $this->dbUser]; 313 | } 314 | 315 | public function __sleep() 316 | { 317 | return ['host', 'dbName', 'dbUser', 'dbPassword']; 318 | } 319 | 320 | public function __wakeup() 321 | { 322 | $this->connect(); 323 | } 324 | } -------------------------------------------------------------------------------- /src/MysqlCompare.php: -------------------------------------------------------------------------------- 1 | target = $target; 29 | $this->source = $source; 30 | } 31 | 32 | /** 33 | * 反转目标及源数据库 34 | * 35 | * @return $this 36 | */ 37 | public function reverse() 38 | { 39 | list($this->target, $this->source) = [$this->source, $this->target]; 40 | return $this; 41 | } 42 | 43 | /** 44 | * 返回数据库比对 45 | * 46 | * @descrption 47 | * drop_table 要删除的表 48 | * create_table 要创建的表 49 | * alter_table_add 表需要新增的字段或索引 50 | * alter_table_modify 表需要修改的字段或索引 51 | * alter_table_drop 表需要删除的字段或索引 52 | * 53 | * @return array 54 | */ 55 | public function showDiff() 56 | { 57 | $sourceInfo = $this->getDbInfo($this->source); 58 | $targetInfo = $this->getDbInfo($this->target); 59 | return $this->getDbDiff($targetInfo[0], $sourceInfo[0]); 60 | } 61 | 62 | /** 63 | * 结构同步的SQL 仅代参考 64 | * 程序无法识别字段名或索引名称的修改,请人工甄别,并注意SQL执行顺序 65 | */ 66 | public function showSql() 67 | { 68 | $sourceInfo = $this->getDbInfo($this->source); 69 | $targetInfo = $this->getDbInfo($this->target); 70 | $diff = $this->getDbDiff($targetInfo[0], $sourceInfo[0]); 71 | $result = $this->getSyncSql($diff, $sourceInfo[0], $sourceInfo[1]); 72 | 73 | $source = $this->source->getConnectInfo(); 74 | $target = $this->target->getConnectInfo(); 75 | echo '/*' . PHP_EOL; 76 | echo 'MySQL数据库结构比对' . PHP_EOL . PHP_EOL; 77 | echo '源 : ' . $source['host'] . "\t" . $source['name'] . PHP_EOL; 78 | echo '目标: ' . $target['host'] . "\t" . $target['name'] . PHP_EOL . PHP_EOL; 79 | echo 'Date: ' . date('Y-m-d H:i:s') . PHP_EOL; 80 | echo '*/' . PHP_EOL . PHP_EOL; 81 | echo 'SET FOREIGN_KEY_CHECKS=0;' . PHP_EOL . PHP_EOL; 82 | foreach ($result as $table => $item) { 83 | echo sprintf(self::TEMPLATE, $table) . PHP_EOL; 84 | foreach ($item as $value) { 85 | echo $value . ';' . PHP_EOL; 86 | } 87 | } 88 | 89 | } 90 | 91 | /** 92 | * 生成同步的sql 93 | * 程序无法识别字段名或索引名称的修改,请人工甄别,并注意SQL执行顺序 94 | * 95 | * @param $diff 96 | * @param $createInfo 97 | * @param $creates 98 | * @return array 99 | */ 100 | protected function getSyncSql($diff, $createInfo, $creates) 101 | { 102 | $result = []; 103 | if (!empty($diff['drop_table'])) { 104 | foreach ($diff['drop_table'] as $table) { 105 | $result[] = "DROP TABLE IF EXISTS `{$table}`"; 106 | } 107 | unset($diff['drop_table']); 108 | } 109 | if (!empty($diff['create_table'])) { 110 | foreach ($diff['create_table'] as $table) { 111 | $result[] = $creates[$table]; 112 | } 113 | unset($diff['create_table']); 114 | } 115 | $getType = function ($str) { 116 | $start1 = substr($str, 0, 1); 117 | $start2 = substr($str, 0, 4); 118 | if ($start1 == '`') { 119 | return 'COLUMN'; 120 | } elseif ($start2 == 'KEY ') { 121 | return 'KEY'; 122 | } elseif ($start2 == 'UNIQ') { 123 | return 'UNIQUE_KEY'; 124 | } elseif ($start2 == 'PRIM') { 125 | return 'PRIMARY_KEY'; 126 | } else { 127 | throw new \Exception('未知类型'); 128 | } 129 | }; 130 | $getSql = function ($action, $type, $table, $key, $suggest) { 131 | if ($action == 'alter_table_drop') { 132 | return $this->alertTableDrop($table, $type, $key); 133 | } elseif ($action == 'alter_table_add') { 134 | return $this->alertTableAdd($table, $type, $suggest); 135 | } elseif ($action == 'alter_table_modify') { 136 | return $this->alertTableModify($table, $type, $key, $suggest); 137 | } else { 138 | throw new \Exception('未知类型'); 139 | } 140 | }; 141 | foreach ($diff as $table => $info) { 142 | foreach ($info as $key => $item) { 143 | foreach ($item as $value) { 144 | $type = $getType($value); 145 | $suggest = $createInfo[$table][$value] ?? ''; 146 | $sql = $getSql($key, $type, $table, $value, $suggest); 147 | $result[$table][] = $sql; 148 | } 149 | } 150 | } 151 | return $result; 152 | } 153 | 154 | /** 155 | * 156 | * 157 | * @param $target 158 | * @param $source 159 | * @return array 160 | */ 161 | protected function getDbDiff($target, $source) 162 | { 163 | $diff = [ 164 | 'drop_table' => [], 165 | 'create_table' => [], 166 | ]; 167 | foreach ($target as $key => $value) { 168 | if (isset($source[$key])) { 169 | $diff1 = array_diff($value, $source[$key]); 170 | foreach ($diff1 as $k => $item) { 171 | if (isset($source[$key][$k])) { 172 | $diff[$key]['alter_table_modify'][] = $k; 173 | } else { 174 | $diff[$key]['alter_table_drop'][] = $k; 175 | } 176 | } 177 | $diff2 = array_diff($source[$key], $value); 178 | foreach ($diff2 as $k => $item) { 179 | if (!isset($target[$key][$k])) { 180 | $diff[$key]['alter_table_add'][] = $k; 181 | } 182 | } 183 | } else { 184 | $diff['drop_table'][] = $key; 185 | } 186 | } 187 | foreach ($source as $key => $value) { 188 | if (!isset($target[$key])) { 189 | $diff['create_table'][] = $key; 190 | } 191 | } 192 | return $diff; 193 | } 194 | 195 | /** 196 | * 获取数据库的表信息 197 | * 198 | * @param $db 199 | * @return array 200 | */ 201 | protected function getDbInfo($db) 202 | { 203 | $tables = $db->column('show full tables where TABLE_TYPE="BASE TABLE"'); 204 | $strpos = function ($str) { 205 | if (substr($str, 0, 11) == 'PRIMARY KEY') return $str; 206 | $pos1 = strpos($str, '`'); 207 | $pos2 = strpos($str, '`', $pos1 + 1); 208 | $pos2 = $pos2 + 1; 209 | $key = substr($str, 0, $pos2); 210 | return $key; 211 | }; 212 | 213 | $info = []; 214 | $creates = []; 215 | foreach ($tables as $table) { 216 | $create = $db->row("show create table {$table}"); 217 | $create = end($create); 218 | $creates[$table] = $create; 219 | $rows = explode("\n", $create); 220 | $length = count($rows) - 2; 221 | $rows = array_slice($rows, 1, $length); 222 | $rows = array_map('trim', $rows); 223 | 224 | $temp = []; 225 | foreach ($rows as $row) { 226 | $row = rtrim($row, ','); 227 | $temp[$strpos($row)] = $row; 228 | } 229 | $info[$table] = $temp; 230 | } 231 | return [$info, $creates]; 232 | } 233 | 234 | /** 235 | * 生成删除的SQL 236 | * 237 | * @param $table 238 | * @param $type 239 | * @param $key 240 | * @return string 241 | */ 242 | protected function alertTableDrop($table, $type, $key) 243 | { 244 | switch ($type) { 245 | case 'COLUMN': 246 | return sprintf('ALTER TABLE `%s` DROP COLUMN %s', $table, $key); 247 | case 'KEY': 248 | $key = substr($key, 4); 249 | return sprintf('ALTER TABLE `%s` DROP INDEX %s', $table, $key); 250 | case 'UNIQUE_KEY': 251 | $key = substr($key, 10); 252 | return sprintf('ALTER TABLE `%s` DROP INDEX %s', $table, $key); 253 | case 'PRIMARY_KEY': 254 | return sprintf('ALTER TABLE `%s` DROP PRIMARY KEY', $table); 255 | } 256 | return ''; 257 | } 258 | 259 | /** 260 | * 生成新增的SQL 261 | * 262 | * @param $table 263 | * @param $type 264 | * @param $suggest 265 | * @return string 266 | */ 267 | protected function alertTableAdd($table, $type, $suggest) 268 | { 269 | switch ($type) { 270 | case 'COLUMN': 271 | return sprintf('ALTER TABLE `%s` ADD COLUMN %s', $table, $suggest); 272 | case 'KEY': 273 | case 'UNIQUE_KEY': 274 | $suggest = str_replace(' KEY ', ' INDEX ', $suggest); 275 | return sprintf('ALTER TABLE `%s` ADD %s', $table, $suggest); 276 | case 'PRIMARY_KEY': 277 | return sprintf('ALTER TABLE `%s` ADD %s', $table, $suggest); 278 | } 279 | return ''; 280 | } 281 | 282 | /** 283 | * 生成修改的SQL 284 | * 285 | * @param $table 286 | * @param $type 287 | * @param $key 288 | * @param $suggest 289 | * @return string 290 | */ 291 | protected function alertTableModify($table, $type, $key, $suggest) 292 | { 293 | switch ($type) { 294 | case 'COLUMN': 295 | return sprintf('ALTER TABLE `%s` MODIFY COLUMN %s', $table, $suggest); 296 | case 'KEY': 297 | $key = substr($key, 4); 298 | $suggest = str_replace(' KEY ', ' INDEX ', $suggest); 299 | return sprintf('ALTER TABLE `%s` DROP INDEX %s,ADD %s', $table, $key, $suggest); 300 | case 'UNIQUE_KEY': 301 | $key = substr($key, 10); 302 | $suggest = str_replace(' KEY ', ' INDEX ', $suggest); 303 | return sprintf('ALTER TABLE `%s` DROP INDEX %s,ADD %s', $table, $key, $suggest); 304 | case 'PRIMARY_KEY': 305 | return sprintf('ALTER TABLE `%s` DROP PRIMARY KEY,ADD %s', $table, $suggest); 306 | } 307 | return ''; 308 | } 309 | } 310 | -------------------------------------------------------------------------------- /src/MysqlTool.php: -------------------------------------------------------------------------------- 1 | database = $database; 39 | $this->db = $db; 40 | $this->db->query('set sql_mode ="strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution";'); 41 | } 42 | 43 | /** 44 | * 获取所有表及表字段 45 | * 46 | * @return array 47 | */ 48 | public function getTable() 49 | { 50 | $field = [ 51 | 'table_name', 52 | 'table_comment', 53 | 'table_type', 54 | 'engine', 55 | ]; 56 | $sql = 'select ' . implode($field, ',') . ' from information_schema.tables where table_schema="' . $this->database . '"'; 57 | $result = $this->db->query($sql); 58 | 59 | $result = $this->keyToLower($result); 60 | $tables = []; 61 | foreach ($result as $item) { 62 | if (!in_array($item['table_name'], $this->exceptTable)) { 63 | $tables[] = $item; 64 | } 65 | } 66 | 67 | // 表字段 68 | foreach ($tables as $key => $value) { 69 | $sql = "select 70 | table_schema,table_name,column_name,extra,column_comment,data_type,column_type,column_default,is_nullable,column_key 71 | from information_schema.columns 72 | where table_name = '{$value['table_name']}' and table_schema = '{$this->database}'"; 73 | $result = $this->db->query($sql); 74 | $tables[$key]['column'] = $this->keyToLower($result); 75 | } 76 | return $tables; 77 | } 78 | 79 | /** 80 | * 获取所有主键 81 | * 82 | * @return array 83 | */ 84 | public function getPrimaryKey() 85 | { 86 | $sql = "select table_schema,table_name,column_name 87 | from information_schema.key_column_usage 88 | where constraint_name='primary' and table_schema='{$this->database}'"; 89 | $result = $this->db->query($sql); 90 | $result = $this->keyToLower($result); 91 | $primary = []; 92 | foreach ($result as $item) { 93 | $primary[] = $item['table_schema'] . '.' . $item['table_name'] . '.' . $item['column_name']; 94 | } 95 | return $primary; 96 | } 97 | 98 | /** 99 | * 获取所有外键 100 | * 101 | * @return array 102 | */ 103 | public function getForeignKey() 104 | { 105 | $sql = "select concat(table_name, '.', column_name) as foreign_key, 106 | referenced_table_schema as db, 107 | concat(referenced_table_name, '.', referenced_column_name) as field 108 | from information_schema.key_column_usage 109 | where table_schema = '{$this->database}' and referenced_table_name is not null"; 110 | $result = $this->db->query($sql); 111 | $result = $this->keyToLower($result); 112 | $foreignKey = []; 113 | foreach ($result as $item) { 114 | $foreignKey[$item['foreign_key']] = $item['db'] == $this->database ? $item['field'] : ($item['db'] . '.' . $item['field']); 115 | } 116 | return $foreignKey; 117 | } 118 | 119 | /** 120 | * 获取所有触发器 121 | * 122 | * @return array 123 | */ 124 | public function getTrigger() 125 | { 126 | $sql = "show triggers"; 127 | $result = $this->db->query($sql); 128 | $result = $this->keyToLower($result); 129 | $trigger = []; 130 | foreach ($result as $item) { 131 | $trigger[$item['table']][] = [ 132 | 'name' => $item['trigger'], 133 | 'event' => $item['event'], 134 | 'statement' => $item['statement'], 135 | 'timing' => $item['timing'] 136 | ]; 137 | } 138 | return $trigger; 139 | } 140 | 141 | /** 142 | * 获取所有非主键索引 143 | * 144 | * @return array 145 | */ 146 | public function getIndex() 147 | { 148 | $sql = "select table_name,index_name,column_name,index_type,non_unique 149 | from information_schema.statistics 150 | where index_schema = '{$this->database}' and index_name <> 'primary' 151 | order by index_name asc, seq_in_index asc"; 152 | $result = $this->db->query($sql); 153 | $result = $this->keyToLower($result); 154 | 155 | $map = []; 156 | foreach ($result as $key => $item) { 157 | if (!isset($map[$item['index_name']])) { 158 | $map[$item['index_name']] = $key; 159 | } else { 160 | $id = $map[$item['index_name']]; 161 | $result[$id]['column_name'] = $result[$id]['column_name'] . ',' . $item['column_name']; 162 | unset($result[$key]); 163 | } 164 | } 165 | 166 | $index = array(); 167 | foreach ($result as $item) { 168 | if (!isset($index[$item['table_name']])) $index[$item['table_name']] = []; 169 | $index[$item['table_name']][] = $item; 170 | } 171 | 172 | 173 | return $index; 174 | } 175 | 176 | /** 177 | * 获取文档内容 178 | * 179 | * @param array $columnDefaultComment 180 | * @param array $exceptTable 181 | * @return string 182 | */ 183 | public function getDocument($columnDefaultComment = [], $exceptTable = []) 184 | { 185 | $this->exceptTable = $exceptTable; 186 | $this->defaultComment = $columnDefaultComment; 187 | 188 | ob_start(); 189 | include __DIR__ . '/resources/dict.php'; 190 | $html = ob_get_contents(); 191 | ob_clean(); 192 | return $html; 193 | } 194 | 195 | 196 | /** 197 | * 生成表供应器 198 | * 199 | * @param string $path 200 | * @param string $namespace 201 | * @param array $tables 202 | */ 203 | public function buildTableProvider($path, $namespace, $tables = []) 204 | { 205 | if (!is_dir($path)) { 206 | mkdir($path, true); 207 | } 208 | 209 | $baseClass = [ 210 | 'db)) . '";', 227 | '', 228 | ' public function __construct(DB $db = null)', 229 | ' {', 230 | ' if (empty($db)) $db = unserialize(base64_decode($this->dbConfig));', 231 | ' parent::__construct($db);', 232 | ' }', 233 | '}', 234 | ]; 235 | file_put_contents($path . '/Base.php', implode("\r\n", $baseClass)); 236 | 237 | $tableInfo = $this->getTable(); 238 | $pks = $this->getPrimaryKey(); 239 | foreach ($tableInfo as $table) { 240 | if (!empty($tables) && !in_array($table['table_name'], $tables)) { 241 | continue; 242 | } 243 | $pkStr = " public \$pk = '';"; 244 | $class = [ 245 | ' " . $this->transform($column['data_type'], $column['column_type']) . ","; 270 | } 271 | } 272 | $class[] = ' ];'; 273 | $class[] = $pkStr; 274 | $class[] = '}'; 275 | $string = implode("\r\n", $class); 276 | file_put_contents($path . '/' . $fileName . '.php', $string); 277 | } 278 | } 279 | 280 | /** 281 | * 根据数据库字段类型转换 282 | * 283 | * @param $dataType 284 | * @param $columnType 285 | * @return int|string 286 | */ 287 | private function transform($dataType, $columnType) 288 | { 289 | $getInfo = function () use ($columnType) { 290 | $search = array_merge(range('a', 'z'), ['(', ')', "'"]); 291 | $columnType = str_replace($search, '', $columnType); 292 | return is_numeric($columnType) ? $columnType : explode(',', $columnType); 293 | }; 294 | $getResult = function () { 295 | $args = func_get_args(); 296 | return json_encode($args, JSON_UNESCAPED_UNICODE); 297 | }; 298 | switch ($dataType) { 299 | case 'tinyint': 300 | case 'smallint': 301 | case 'mediumint': 302 | case 'bigint': 303 | case 'integer': 304 | case 'int': 305 | $result = $getResult($dataType); 306 | break; 307 | case 'float': 308 | case 'double': 309 | case 'decimal': 310 | $info = $getInfo(); 311 | $info[1] = empty($info[1]) ? 2 : intval($info[1]); 312 | $info[0] = empty($info[0]) ? 10 : ($info[0] - $info[1]); 313 | $result = $getResult('randomFloat', $info[0], $info[1]); 314 | break; 315 | case 'char': 316 | $result = $getResult('getString', $getInfo()); 317 | break; 318 | case 'varchar': 319 | $length = $getInfo(); 320 | $length = $length > 16 ? 16 : intval($length); 321 | $result = $getResult('getString', $length); 322 | break; 323 | case 'tinytext': 324 | case 'text': 325 | case 'mediumtext': 326 | case 'longtext': 327 | $result = $getResult('getString', 32); 328 | break; 329 | case 'date': 330 | case 'time': 331 | case 'year': 332 | case 'datetime': 333 | case 'timestamp': 334 | $result = $getResult($dataType); 335 | break; 336 | case 'set': 337 | case 'enum': 338 | $result = $getResult('randomValue', $getInfo()); 339 | break; 340 | case 'json': 341 | $result = "'{}'"; 342 | break; 343 | default: 344 | $result = "null"; 345 | } 346 | return $result; 347 | } 348 | 349 | /** 350 | * KEY转小写 351 | * 352 | * @param $arr 353 | * @return array 354 | */ 355 | protected function keyToLower($arr) 356 | { 357 | $result = []; 358 | foreach ($arr as $key => $value) { 359 | $key = is_numeric($key) ? $key : strtolower($key); 360 | $value = is_array($value) ? $this->keyToLower($value) : $value; 361 | $result[$key] = $value; 362 | } 363 | return $result; 364 | } 365 | } -------------------------------------------------------------------------------- /src/Provider.php: -------------------------------------------------------------------------------- 1 | 'chinese.characters.csv', 53 | 'company' => 'company.csv', 54 | 'first_name' => 'first.name.csv', 55 | 'last_name' => 'last.name.csv', 56 | 'area' => 'area.json', 57 | 'payment' => 'payment.csv', 58 | 'bank' => 'bank.csv', 59 | 'color' => 'color.json', 60 | 'country' => 'country.csv', 61 | 'university' => 'university.csv', 62 | ]; 63 | 64 | /** 65 | * 属性 66 | */ 67 | private $property = [ 68 | 'name' => 'getName', 69 | 'first_name' => 'getFirstName', 70 | 'last_name' => 'getLastName', 71 | 'email' => 'getEmail', 72 | 'qq' => 'getQq', 73 | 'mobile' => 'getMobile', 74 | 'phone' => 'getPhone', 75 | 'postcode' => 'getPostCode', 76 | 'image_url' => 'getImageUrl', 77 | 'bitmap_url' => 'getBitmapUrl', 78 | 'company_name' => 'getCompanyName', 79 | 'id_card' => 'getIdCard', 80 | 'address' => 'getAddress', 81 | 'city' => 'getCity', 82 | 'uuid' => 'getUuid', 83 | 'ip' => 'getIp', 84 | 'ean8' => 'getEan8', 85 | 'ean13' => 'getEan13', 86 | 'payment' => 'getPayment', 87 | 'bank' => 'getBank', 88 | 'tinyint' => 'Number::randomTinyint', 89 | 'smallint' => 'Number::randomSmallint', 90 | 'mediumint' => 'Number::randomMediumint', 91 | 'bigint' => 'Number::randomBigint', 92 | 'int' => 'Number::randomInt', 93 | 'integer' => 'Number::randomInt', 94 | 'datetime' => 'Datetime::datetime', 95 | 'timestamp' => 'Datetime::datetime', 96 | 'year' => 'Datetime::year', 97 | 'date' => 'Datetime::date', 98 | 'time' => 'Datetime::time', 99 | 'color_name' => 'getColorName', 100 | 'color_hex' => 'getColorHex', 101 | 'color_rgb' => 'getColorRgb', 102 | 'version' => 'getVersion', 103 | 'country' => 'getCountry', 104 | 'university' => 'getUniversity', 105 | ]; 106 | 107 | /** 108 | * 资源 109 | * @var array 110 | */ 111 | private $resources = []; 112 | 113 | /** 114 | * 增长类属性 115 | * @var \stdClass 116 | */ 117 | private $increments; 118 | 119 | /** 120 | * @var \stdClass 121 | */ 122 | private $providers; 123 | 124 | /** 125 | * @var Number 126 | */ 127 | public $numberProvider; 128 | 129 | /** 130 | * @var Datetime 131 | */ 132 | public $datetimeProvider; 133 | 134 | /** 135 | * Provider constructor. 136 | */ 137 | public function __construct() 138 | { 139 | $this->increments = new \stdClass(); 140 | $this->providers = new \stdClass(); 141 | $this->numberProvider = new Number(); 142 | $this->datetimeProvider = new Datetime(); 143 | } 144 | 145 | /** 146 | * 获取资源 147 | * 148 | * @param $key 149 | * @return array 150 | */ 151 | public function getResource($key) 152 | { 153 | if (isset($this->resources[$key])) { 154 | return $this->resources[$key]; 155 | } 156 | 157 | $path = __DIR__ . '/resources/' . self::RESOURCES[$key]; 158 | if (pathinfo($path, PATHINFO_EXTENSION) == 'json') { 159 | $result = json_decode(file_get_contents($path), true); 160 | } else { 161 | $content = file($path); 162 | $split = function ($value) { 163 | return explode(',', trim($value)); 164 | }; 165 | if (count($content) == 1) { 166 | $result = $split($content[0]); 167 | } else { 168 | $result = array_map($split, $content); 169 | } 170 | } 171 | 172 | return $this->resources[$key] = $result; 173 | } 174 | 175 | /** 176 | * 随机字符串 177 | * 178 | * @param int $length 长度 179 | * @param int $type 0大小写,1小写,2大写 180 | * @return string 181 | */ 182 | public function getString($length = 8, $type = 0) 183 | { 184 | $chars = 'abcdefghijklmnopqrstuvwxyz'; 185 | $chars .= strtoupper($chars); 186 | $string = ''; 187 | for ($i = 0; $i < $length; $i++) { 188 | $string .= $chars{rand(0, 51)}; 189 | } 190 | return $type == 0 ? $string : ($type == 1 ? strtolower($string) : strtoupper($string)); 191 | } 192 | 193 | /** 194 | * 随机中文字符串 195 | * 196 | * @param int $length 长度 197 | * @return string 198 | */ 199 | public function getMbString($length = 8) 200 | { 201 | $chars = $this->getResource('chinese_characters'); 202 | $count = count($chars) - 1; 203 | $string = ''; 204 | for ($i = 0; $i < $length; $i++) { 205 | $string .= $chars[rand(0, $count)]; 206 | } 207 | return $string; 208 | } 209 | 210 | /** 211 | * 随机邮箱 212 | * 213 | * @return string 214 | */ 215 | public function getEmail() 216 | { 217 | $suffix = ['@qq.com', '@126.com', '@163.com', '@sina.com', '@yahoo.com', '@gmail.com', '@hotmail.com']; 218 | $chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; 219 | $length = rand(6, 10); 220 | $string = ''; 221 | for ($i = 0; $i < $length; $i++) { 222 | $string .= $chars{rand(0, 35)}; 223 | } 224 | return $string . $suffix[rand(0, 6)]; 225 | } 226 | 227 | /** 228 | * 获取qq 229 | * 230 | * @return string 231 | */ 232 | public function getQq() 233 | { 234 | $qq = strval(mt_rand(1, 9)); 235 | $length = rand(4, 8); 236 | for ($i = 0; $i < $length; $i++) { 237 | $qq .= rand(0, 9); 238 | } 239 | return $qq; 240 | } 241 | 242 | /** 243 | * 随机手机号码 244 | * 245 | * @return string 246 | */ 247 | public function getMobile() 248 | { 249 | $suffix = ['13', '15', '17', '18']; 250 | return $suffix[array_rand($suffix)] . rand(100000000, 999999999); 251 | } 252 | 253 | /** 254 | * 随机电话号码 255 | * 256 | * @return string 257 | */ 258 | public function getPhone() 259 | { 260 | return '0' . rand(20, 999) . '-' . rand(10000000, 99999999); 261 | } 262 | 263 | /** 264 | * 随机身份证号码 265 | * 266 | * @return string 267 | */ 268 | public function getIdCard() 269 | { 270 | // 区域code 271 | $area = $this->getResource('area'); 272 | $code = []; 273 | foreach ($area as $region) { 274 | if (substr($region['id'], -2) != '00') { 275 | $code[] = $region['id']; 276 | } 277 | } 278 | 279 | // 生日 280 | $time = time() - 86400 * rand(1, 20800); 281 | $date = date('Ymd', $time); 282 | 283 | $idCard = $this->randomValue($code) . $date . rand(1, 9) . rand(1, 9) . rand(1, 9); 284 | 285 | // 检验位 286 | $idCard = str_split($idCard); 287 | $weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; 288 | $sum = []; 289 | foreach ($idCard as $key => $value) { 290 | $sum[] = $value * $weight[$key]; 291 | } 292 | $lastIndex = array_sum($sum) % 11; 293 | $last = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; 294 | 295 | return implode('', $idCard) . $last[$lastIndex]; 296 | } 297 | 298 | /** 299 | * 随机邮政编码 300 | * 301 | * @return string 302 | */ 303 | public static function getPostcode() 304 | { 305 | return rand(1, 9) . rand(1000, 9999) . '0'; 306 | } 307 | 308 | /** 309 | * 数据随机值 310 | * 311 | * @param $arr 312 | * @return mixed 313 | */ 314 | public static function randomValue($arr) 315 | { 316 | return $arr[array_rand($arr)]; 317 | } 318 | 319 | /** 320 | * 获取随机图片 321 | * 322 | * @param int $width 323 | * @param int $height 324 | * @return string 325 | */ 326 | public function getImageUrl($width = 200, $height = 200) 327 | { 328 | return "http://lorempixel.com/g/{$width}/{$height}/"; 329 | } 330 | 331 | /** 332 | * 获取占位图 333 | * 334 | * @param int $width 335 | * @param int $height 336 | * @param string $txt 337 | * @return string 338 | */ 339 | public function getBitmapUrl($width = 200, $height = 200, $txt = 'image') 340 | { 341 | $txtSize = $txt ? floor($width / strlen($txt)) : 25; 342 | return "https://via.placeholder.com/{$width}x{$height}.png?text={$txt}"; 343 | } 344 | 345 | /** 346 | * 获取公司名称 347 | * 348 | * @return string 349 | */ 350 | public function getCompanyName() 351 | { 352 | $resource = $this->getResource('company'); 353 | return $this->randomValue($resource[0]) . $this->randomValue($resource[1]); 354 | } 355 | 356 | /** 357 | * 获取姓 358 | * 359 | * @return string 360 | */ 361 | public function getLastName() 362 | { 363 | $resource = $this->getResource('last_name'); 364 | return $this->randomValue($resource); 365 | } 366 | 367 | /** 368 | * 获取名 369 | * 370 | * @param int $gender 0随机,1男,2女 371 | * @return string 372 | */ 373 | public function getFirstName($gender = 0) 374 | { 375 | $resource = $this->getResource('first_name'); 376 | if ($gender == 1) { 377 | $resource = array_merge($resource[0], $resource[1]); 378 | } elseif ($gender == 2) { 379 | $resource = array_merge($resource[2], $resource[3]); 380 | } else { 381 | $resource = array_merge($resource[0], $resource[1], $resource[2], $resource[3]); 382 | } 383 | return $this->randomValue($resource); 384 | } 385 | 386 | /** 387 | * 获取姓名 388 | * 389 | * @param int $gender 0随机,1男,2女 390 | * @return string 391 | */ 392 | public function getName($gender = 0) 393 | { 394 | return $this->getLastName() . $this->getFirstName($gender); 395 | } 396 | 397 | /** 398 | * 地址 399 | * 400 | * @return string 401 | */ 402 | public function getAddress() 403 | { 404 | // 区域code 405 | $areas = $this->getResource('area'); 406 | $regions = []; 407 | $ids = []; 408 | foreach ($areas as $area) { 409 | $regions[$area['id']] = $area['name']; 410 | if (substr($area['id'], -2) != '00') { 411 | $ids[$area['id']] = $area['id']; 412 | } 413 | } 414 | $id = $this->randomValue($ids); 415 | $code = [ 416 | substr($id, 0, 2) . '0000', 417 | substr($id, 0, 4) . '00', 418 | $id, 419 | ]; 420 | 421 | $getName = function ($id) use ($regions) { 422 | return in_array($regions[$id], ['县', '市辖区']) ? '' : $regions[$id]; 423 | }; 424 | $address = $getName($code[0]) . $getName($code[1]) . $getName($code[2]); 425 | return $address; 426 | } 427 | 428 | /** 429 | * 地址 430 | * 431 | * @return string 432 | */ 433 | public function getCity() 434 | { 435 | // 区域code 436 | $areas = $this->getResource('area'); 437 | $regions = []; 438 | $ids = []; 439 | foreach ($areas as $area) { 440 | $regions[$area['id']] = $area['name']; 441 | if (substr($area['id'], -2) == '00' && substr($area['id'], -4) != '0000') { 442 | $ids[$area['id']] = $area['id']; 443 | } elseif (in_array($area['id'], [110000, 120000, 310000, 500000,])) { 444 | $ids[$area['id']] = $area['id']; 445 | } 446 | } 447 | $ids = array_diff($ids, [110100, 120100, 139000, 419000, 429000, 469000, 500100, 500200, 659000]); 448 | $id = $this->randomValue($ids); 449 | return $regions[$id]; 450 | } 451 | 452 | /** 453 | * 增加供给器 454 | * 455 | * @param $key 456 | * @param $callback 457 | */ 458 | public function addProvider($key, $callback) 459 | { 460 | if (isset($this->property[$key])) { 461 | trigger_error('属性' . $key . '已经存在', E_USER_ERROR); 462 | } 463 | $this->providers->$key = $callback; 464 | } 465 | 466 | /** 467 | * 初始化自增的供给器 468 | * 469 | * @param $key 470 | * @param int $start 471 | */ 472 | public function addIncrement($key, $start = 0) 473 | { 474 | if (isset($this->property[$key])) { 475 | trigger_error('属性' . $key . '已经存在', E_USER_ERROR); 476 | } 477 | $this->increments->$key = $start; 478 | } 479 | 480 | /** 481 | * uuid 482 | * 483 | * @return string 484 | */ 485 | public function getUuid() 486 | { 487 | return md5(uniqid() . '-' . getmypid() . '-' . rand(111111111, 999999999)); 488 | } 489 | 490 | /** 491 | * ip 492 | * 493 | * @return string 494 | */ 495 | public function getIp() 496 | { 497 | $ipLong = array( 498 | array('607649792', '608174079'), //36.56.0.0-36.63.255.255 499 | array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255 500 | array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255 501 | array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255 502 | array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255 503 | array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255 504 | array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255 505 | array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255 506 | array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255 507 | array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255 508 | ); 509 | $key = mt_rand(0, 9); 510 | $ip = long2ip(mt_rand($ipLong[$key][0], $ipLong[$key][1])); 511 | return $ip; 512 | } 513 | 514 | /** 515 | * 获取定长数字 516 | * 517 | * @param int $length 518 | * @return string 519 | */ 520 | public function getNumber($length = 5) 521 | { 522 | $number = mt_rand(0, 9); 523 | for ($i = 1; $i < $length; $i++) { 524 | $number .= mt_rand(0, 9); 525 | } 526 | return $number; 527 | } 528 | 529 | /** 530 | * 获取ean8 531 | * 532 | * @return string 533 | */ 534 | public function getEan8() 535 | { 536 | $countryCode = [690, 691, 692, 693, 694, 695]; 537 | $barcode = $this->randomValue($countryCode) . $this->getNumber(4); 538 | $barcode .= $this->getLastEan($barcode); 539 | return $barcode; 540 | } 541 | 542 | /** 543 | * 获取ean13 544 | * 545 | * @return string 546 | */ 547 | public function getEan13() 548 | { 549 | $countryCode = [690, 691, 692, 693, 694, 695]; 550 | $barcode = $this->randomValue($countryCode) . $this->getNumber(9); 551 | $barcode .= $this->getLastEan($barcode); 552 | return $barcode; 553 | } 554 | 555 | /** 556 | * 获取ean校验位 557 | * 558 | * @param $ean 559 | * @return string 560 | */ 561 | public function getLastEan($ean) 562 | { 563 | $length = strlen($ean); 564 | $sum = 0; 565 | for ($i = 0; $i < $length; $i++) { 566 | $value = intval($ean{$i}); 567 | if ($i % 2 == 0) { 568 | $sum += $sum; 569 | } else { 570 | $sum += $value * 3; 571 | } 572 | } 573 | return strval((10 - $sum % 10) % 10); 574 | } 575 | 576 | /** 577 | * 支付方式 578 | * 579 | * @return string 580 | */ 581 | public function getPayment() 582 | { 583 | $resource = $this->getResource('payment'); 584 | return $this->randomValue($resource); 585 | } 586 | 587 | /** 588 | * 银行 589 | * 590 | * @return string 591 | */ 592 | public function getBank() 593 | { 594 | $resource = $this->getResource('bank'); 595 | return $this->randomValue($resource); 596 | } 597 | 598 | /** 599 | * 下划线转驼峰 600 | * 601 | * @param string $string 602 | * @param bool $first 603 | * @return mixed 604 | */ 605 | public static function toHump($string, $first = false) 606 | { 607 | $string = preg_replace_callback( 608 | '/([-_]+([a-z]{1}))/i', 609 | function ($matches) { 610 | return strtoupper($matches[2]); 611 | }, 612 | $string 613 | ); 614 | return $first ? ucfirst($string) : $string; 615 | } 616 | 617 | /** 618 | * 驼峰转下划线 619 | * 620 | * @param string $string 621 | * @return mixed 622 | */ 623 | public static function toUnderline($string) 624 | { 625 | $string = preg_replace_callback( 626 | '/([A-Z]{1})/', 627 | function ($matches) { 628 | return '_' . strtolower($matches[0]); 629 | }, 630 | $string); 631 | return $string; 632 | } 633 | 634 | /** 635 | * 魔术方法 636 | * 637 | * @param $name 638 | * @return mixed 639 | */ 640 | public function __get($name) 641 | { 642 | if (isset($this->property[$name])) { 643 | $method = $this->property[$name]; 644 | if (stripos($method, '::')) { 645 | return call_user_func(__NAMESPACE__ . '\\' . $method); 646 | } else { 647 | return $this->$method(); 648 | } 649 | } else if (isset($this->increments->$name)) { 650 | return $this->increments->$name++; 651 | } else if (isset($this->providers->$name)) { 652 | return call_user_func_array($this->providers->$name, []); 653 | } 654 | return null; 655 | } 656 | 657 | /** 658 | * 颜色名称 659 | * 660 | * @return string 661 | */ 662 | public function getColorName() 663 | { 664 | $resource = $this->getResource('color'); 665 | $color = $this->randomValue($resource); 666 | return $color[0]; 667 | } 668 | 669 | /** 670 | * hex颜色 671 | * 672 | * @return string 673 | */ 674 | public function getColorHex() 675 | { 676 | $resource = $this->getResource('color'); 677 | $color = $this->randomValue($resource); 678 | return $color[1]; 679 | } 680 | 681 | /** 682 | * rgb颜色 683 | * 684 | * @return string 685 | */ 686 | public function getColorRgb() 687 | { 688 | $resource = $this->getResource('color'); 689 | $color = $this->randomValue($resource); 690 | return $color[2]; 691 | } 692 | 693 | /** 694 | * 版本号 695 | * 696 | * @return string 697 | */ 698 | public function getVersion() 699 | { 700 | return mt_rand(0, 9) . '.' . mt_rand(0, 20) . '.' . mt_rand(0, 20); 701 | } 702 | 703 | /** 704 | * 国家 705 | * 706 | * @return string 707 | */ 708 | public function getCountry() 709 | { 710 | $resource = $this->getResource('country'); 711 | return $this->randomValue($resource); 712 | } 713 | 714 | /** 715 | * 大学 716 | * 717 | * @return string 718 | */ 719 | public function getUniversity() 720 | { 721 | $resource = $this->getResource('university'); 722 | return $this->randomValue($resource); 723 | } 724 | 725 | /** 726 | * 区间值 727 | * 728 | * @param int $start 开始值 729 | * @param int $end 结束值 730 | * @param int $divisor 除数 731 | * @return float|int 732 | */ 733 | public function between($start = 0, $end = 2147483647, $divisor = 0) 734 | { 735 | $number = mt_rand($start, $end); 736 | if ($divisor) { 737 | $number = $number / $divisor; 738 | } 739 | return $number; 740 | } 741 | } --------------------------------------------------------------------------------