├── .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 |
|---|
| 序号 | 字段名 | 数据类型 | 默认值 | 允许非空 | 自动递增 | 是否主键 | 外键关系 | 备注 |
| 1 | id | int(10) unsigned | | NO | 是 | | | ID |
| 2 | username | varchar(20) | | NO | | | | 用户名 |
| 3 | name | varchar(20) | | NO | | | | 真实姓名 |
| 4 | sex | enum('2','1','0') | | NO | | | | 性别:1男2女0未知 |
| 5 | user_id | int(10) unsigned | 0 | NO | | | | user id |
| 6 | price | decimal(10,2) | 0.00 | NO | | | | 价格 |
| 7 | address | varchar(60) | | NO | | | | 地址 |
| 8 | remarks | varchar(128) | | NO | | | | 备注 |
| 9 | created_at | timestamp | | YES | | | | 创建时间 |
| 索引名称 | 唯一索引 | 索引类型 | 字段 |
| unique_username | 是 | BTREE | username |
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 .= '| ' . ($key + 1) . ' ' . $table['table_name'] . ' ' . $table['table_comment'] . ' | ' . $table['engine'] . ' |
';
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 .= '| ' . ($order + 1) . ' | ';
40 | $html .= '' . $column['column_name'] . ' | ';
41 | $html .= '' . $column['column_type'] . ' | ';
42 | $html .= '' . $column['column_default'] . ' | ';
43 | $html .= '' . $column['is_nullable'] . ' | ';
44 | $html .= '' . ($column['extra'] == 'auto_increment' ? '是' : ' ') . ' | ';
45 | $html .= '' . $primaryStr . ' | ';
46 | $html .= '' . $columnForeignKeyStr . ' | ';
47 | $html .= '' . $column['column_comment'] . ' | ';
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 .= '| ' . $trigger['name'] . ' | ';
65 | $html .= '' . $trigger['timing'] . ' | ';
66 | $html .= '' . $trigger['event'] . ' | ';
67 | $html .= '' . $trigger['statement'] . ' | ';
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 .= '| ' . $item['index_name'] . ' | ';
85 | $html .= '' . ($item['non_unique'] ? '否' : '是') . ' | ';
86 | $html .= '' . $item['index_type'] . ' | ';
87 | $html .= '' . $item['column_name'] . ' | ';
88 | $html .= '
';
89 | $html .= '';
90 | }
91 | }
92 |
93 | $html .= '
' . "\n";
94 | }
95 | ?>
96 |
97 |
98 |
99 |
100 |
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 | 
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 | 
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 | }
--------------------------------------------------------------------------------