db.php 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351
  1. <?php
  2. $config = array();
  3. $config['db']['host'] = '121.42.172.1';
  4. $config['db']['username'] = '';
  5. $config['db']['password'] = '';
  6. $config['db']['port'] = '3306';
  7. $config['db']['database'] = '';
  8. $config['temp'] =str_replace("\\", '/',dirname(__FILE__))."/cache/";//临时目录
  9. $config['db']['charset'] = 'utf8';
  10. $config['db']['pconnect'] = 0;
  11. $config['db']['tablepre'] = 'ims_';
  12. $config['wx']['appid'] = 'wxe00001';//微信APPID
  13. $config['wx']['appsn'] = '12345678';//微信APPSN
  14. $config['domain'] = "http://".$_SERVER['HTTP_HOST']."/";//域名
  15. date_default_timezone_set('Asia/Shanghai');
  16. require 'db/db.class.php';
  17. /**
  18. * 初始化 pdo 对象实例
  19. * @return object->PDO
  20. */
  21. function pdo() {
  22. global $config;
  23. static $db;
  24. if(empty($db)) {
  25. $db = new DB($config['db']['database']);
  26. }
  27. return $db;
  28. }
  29. /**
  30. * 执行一条非查询语句
  31. *
  32. * @param string $sql
  33. * @param array or string $params
  34. * @return mixed
  35. * 成功返回受影响的行数
  36. * 失败返回FALSE
  37. */
  38. function pdo_query($sql, $params = array()) {
  39. return pdo()->query($sql, $params);
  40. }
  41. /**
  42. * 执行SQL返回第一个字段
  43. *
  44. * @param string $sql
  45. * @param array $params
  46. * @param int $column 返回查询结果的某列,默认为第一列
  47. * @return mixed
  48. */
  49. function pdo_fetchcolumn($sql, $params = array(), $column = 0) {
  50. return pdo()->fetchcolumn($sql, $params, $column);
  51. }
  52. /**
  53. * 执行SQL返回第一行
  54. *
  55. * @param string $sql
  56. * @param array $params
  57. * @return mixed
  58. */
  59. function pdo_fetch($sql, $params = array()) {
  60. return pdo()->fetch($sql, $params);
  61. }
  62. /**
  63. * 执行SQL返回全部记录
  64. *
  65. * @param string $sql
  66. * @param array $params
  67. * @return mixed
  68. */
  69. function pdo_fetchall($sql, $params = array(), $keyfield = '') {
  70. return pdo()->fetchall($sql, $params, $keyfield);
  71. }
  72. /**
  73. * 更新记录
  74. *
  75. * @param string $table
  76. * @param array $data
  77. * 要更新的数据数组
  78. * array(
  79. * '字段名' => '值'
  80. * )
  81. * @param array $params
  82. * 更新条件
  83. * array(
  84. * '字段名' => '值'
  85. * )
  86. * @param string $glue
  87. * 可以为AND OR
  88. * @return mixed
  89. */
  90. function pdo_update($table, $data = array(), $params = array(), $glue = 'AND') {
  91. return pdo()->update($table, $data, $params, $glue);
  92. }
  93. /**
  94. * 更新记录
  95. *
  96. * @param string $table
  97. * @param array $data
  98. * 要更新的数据数组
  99. * array(
  100. * '字段名' => '值'
  101. * )
  102. * @param boolean $replace
  103. * 是否执行REPLACE INTO
  104. * 默认为FALSE
  105. * @return mixed
  106. */
  107. function pdo_insert($table, $data = array(), $replace = FALSE) {
  108. return pdo()->insert($table, $data, $replace);
  109. }
  110. /**
  111. * 删除记录
  112. *
  113. * @param string $table
  114. * @param array $params
  115. * 更新条件
  116. * array(
  117. * '字段名' => '值'
  118. * )
  119. * @param string $glue
  120. * 可以为AND OR
  121. * @return mixed
  122. */
  123. function pdo_delete($table, $params = array(), $glue = 'AND') {
  124. return pdo()->delete($table, $params, $glue);
  125. }
  126. /**
  127. * 返回lastInsertId
  128. *
  129. */
  130. function pdo_insertid() {
  131. return pdo()->insertid();
  132. }
  133. function pdo_begin() {
  134. pdo()->begin();
  135. }
  136. function pdo_commit() {
  137. pdo()->commit();
  138. }
  139. function pdo_rollback() {
  140. pdo()->rollBack();
  141. }
  142. /**
  143. * 获取pdo操作错误信息列表
  144. * @param bool $output 是否要输出执行记录和执行错误信息
  145. * @param array $append 加入执行信息,如果此参数不为空则 $output 参数为 false
  146. * @return array
  147. */
  148. function pdo_debug($output = false, $append = array()) {
  149. return pdo()->debug($output, $append);
  150. }
  151. /**
  152. * 执行SQL文件
  153. */
  154. function pdo_run($sql) {
  155. return pdo()->run($sql);
  156. }
  157. function pdo_fieldexists($tablename, $fieldname = '') {
  158. return pdo()->fieldexists($tablename, $fieldname);
  159. }
  160. function pdo_indexexists($tablename, $indexname = '') {
  161. return pdo()->indexexists($tablename, $indexname);
  162. }
  163. /**
  164. * 获取所有字段,用于过滤字段
  165. * @param string $tablename 原始表名
  166. * @return array 所有表名 array('col1','col2');
  167. */
  168. function pdo_fetchallfields($tablename){
  169. $fields = pdo_fetchall("DESCRIBE {$tablename}", array(), 'Field');
  170. $fields = array_keys($fields);
  171. return $fields;
  172. }
  173. function tablename($table) {
  174. global $config;
  175. return $config['db']['tablepre'] .$table;
  176. }
  177. /**
  178. * emoji编码解码
  179. * en是编码 de是解码
  180. */
  181. /**
  182. *
  183. * 测试变量 数组 对象
  184. *
  185. * 数组
  186. */
  187. if (!function_exists('dump')) {
  188. function dump($arr){
  189. echo '<pre>'.print_r($arr,TRUE).'</pre>';
  190. }
  191. }
  192. function emoji($str,$is='en'){
  193. if('en'==$is){
  194. if(!is_string($str))return $str;
  195. if(!$str || $str=='undefined')return '';
  196. $text = json_encode($str);
  197. $text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i",function($str){
  198. return addslashes($str[0]);
  199. },$text);
  200. return json_decode($text);
  201. }else{
  202. $text = json_encode($str);
  203. $text = preg_replace_callback('/\\\\\\\\/i',function($str){
  204. return '\\';
  205. },$text);
  206. return json_decode($text);
  207. }
  208. }
  209. /**
  210. *
  211. * @param 时间戳 $time
  212. * 友好时间显示
  213. * @return
  214. */
  215. function timeline($time){
  216. if(time()<=$time){
  217. return date("Y-m-d H:i:s",$time);
  218. }else{
  219. $t = time()-$time;
  220. $f = array(
  221. '31536000'=>'年',
  222. '2592000'=>'个月',
  223. '604800'=>'星期',
  224. '86400'=>'天',
  225. '3600'=>'小时',
  226. '60'=>'分钟',
  227. '1'=>'秒'
  228. );
  229. foreach($f as $k=>$v){
  230. if(0 != $c = floor($t/(int)$k)){
  231. return $c.$v.'前';
  232. }
  233. }
  234. }
  235. }
  236. /**
  237. *
  238. * @param 文件地址 $file
  239. *
  240. * @return 文件扩展名,不含.
  241. */
  242. function file_ext($file){
  243. return strtolower(pathinfo($file,4));
  244. }
  245. /**
  246. * 表格转化数组,一般用于抓取数据
  247. * @param table表格 $table
  248. *
  249. * @return 表格数组
  250. */
  251. function table_arr($table) {
  252. $table = preg_replace("'<table[^>]*?>'si","",$table);
  253. $table = preg_replace("'<tr[^>]*?>'si","",$table);
  254. $table = preg_replace("'<td[^>]*?>'si","",$table);
  255. $table = str_replace("</tr>","{tr}",$table);
  256. $table = str_replace("</td>","{td}",$table);
  257. //去掉 HTML 标记
  258. $table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);
  259. //去掉空白字符
  260. $table = preg_replace("'([rn])[s]+'","",$table);
  261. $table = preg_replace('/&nbsp;/',"",$table);
  262. $table = str_replace(" ","",$table);
  263. $table = str_replace(" ","",$table);
  264. $table = explode('{tr}', $table);
  265. array_pop($table);
  266. foreach ($table as $key=>$tr) {
  267. $td = explode('{td}', $tr);
  268. array_pop($td);
  269. $td_array[] = $td;
  270. }
  271. return $td_array;
  272. }
  273. /**
  274. * POST提交数据
  275. * @param 地址 $url
  276. * @param 信息 $msg
  277. *
  278. * @return
  279. */
  280. function post($url,$msg){//post ssl
  281. $ch = curl_init();
  282. if (class_exists('\CURLFile')) {
  283. curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
  284. } else {
  285. if (defined('CURLOPT_SAFE_UPLOAD')) {
  286. curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
  287. }
  288. }
  289. //$msg = array('media'=>"@".$filepath);
  290. //5.6+ $msg = array('media'=>new \CURLFile($filepath));
  291. preg_match('/https:\/\//',$url)?$ssl=TRUE:$ssl=FALSE;
  292. curl_setopt($ch, CURLOPT_POST, 1);
  293. curl_setopt($ch, CURLOPT_URL,$url);
  294. if($ssl){
  295. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  296. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  297. }
  298. curl_setopt($ch, CURLOPT_POSTFIELDS,$msg);
  299. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  300. $data = curl_exec($ch);
  301. curl_close($ch);
  302. return $data;
  303. }
  304. /**
  305. * GET数据
  306. * @param undefined $url
  307. *
  308. * @return
  309. */
  310. function get($url){
  311. $ch = curl_init();
  312. preg_match('/https:\/\//',$url)?$ssl=TRUE:$ssl=FALSE;
  313. curl_setopt($ch, CURLOPT_URL,$url);
  314. curl_setopt($ch, CURLOPT_HEADER, 0);
  315. if($ssl){
  316. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  317. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  318. }
  319. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  320. $data = curl_exec($ch);
  321. curl_close($ch);
  322. return $data;
  323. }
  324. /**
  325. 导出csv数据,不支持大数据,大数据用分页导出
  326. $arr = array(
  327. array('用户名','密码','邮箱'),
  328. array(
  329. array('A用户','123456','xiaohai1@zhongsou.com'),
  330. array('B用户','213456','xiaohai2@zhongsou.com'),
  331. array('C用户','123456','xiaohai3@zhongsou.com')
  332. ));
  333. putcsv("导出文件",$arr);
  334. *
  335. * 导出csv模板
  336. $arr = array(array('用户名','密码','邮箱'));
  337. putcsv("导出模板",$arr);
  338. * 文件名不带.csv,自动加
  339. * $filename 导出文件名
  340. * $arr 导出数组
  341. */
  342. function putcsv($filename,$arr){
  343. if(empty($arr)){
  344. return false;
  345. }
  346. $export_str = implode(',',$arr[0])."\n";
  347. if(!empty($arr[1])){
  348. foreach($arr[1] as $k=>$v){
  349. $export_str .= implode(',',$v)."\n";
  350. }
  351. }
  352. header("Content-type:application/vnd.ms-excel");
  353. header("Content-Disposition:attachment;filename=".$filename.date('Y-m-d-H-i-s').".csv");
  354. ob_start();
  355. ob_end_clean();
  356. echo "\xEF\xBB\xBF".$export_str;//解决WPS和excel不乱码
  357. }
  358. /**
  359. 导入csv,编码ANSI
  360. read.csv数据
  361. 商户名称, 昵称, 手机号
  362. 惠吃惠喝, 会吃,18291443322
  363. egeme, 依加米,18923451622
  364. 徐汇区,上海,18291447788
  365. 衣服, 买衣服,18291448824
  366. 米掌柜, MI,18291448822
  367. * $path = 'read.csv';
  368. $arr= getcsv($path);
  369. * 导入csv返回数组,注意导入文件一定要是ANSI编码,也就是WPS和excel打开不乱码
  370. * $path 文件路径
  371. * */
  372. function getcsv($path){
  373. $handle = fopen($path,'r');
  374. $dataArray = array();
  375. while($data = fgetcsv($handle)){
  376. $num = count($data);
  377. for($i=0;$i<$num;$i++){
  378. $dataArray[$row][$i] = mb_convert_encoding($data[$i],"utf-8",'GBK');
  379. }
  380. $row++;
  381. }
  382. return $dataArray;
  383. }
  384. /**
  385. * 是否微信
  386. *
  387. * @return
  388. */
  389. function is_weixin() {
  390. $agent = $_SERVER ['HTTP_USER_AGENT'];
  391. if (! strpos ( $agent, "icroMessenger" )) {
  392. return false;
  393. }
  394. return true;
  395. }
  396. /**
  397. * 隐藏手机中间四位
  398. * @param 手机号 $phone
  399. *
  400. * @return
  401. */
  402. function hidetel($phone){
  403. $IsWhat = preg_match('/(0[0-9]{2,3}[-]?[2-9][0-9]{6,7}[-]?[0-9]?)/i',$phone);
  404. if($IsWhat == 1){
  405. return preg_replace('/(0[0-9]{2,3}[-]?[2-9])[0-9]{3,4}([0-9]{3}[-]?[0-9]?)/i','$1****$2',$phone);
  406. }else{
  407. return preg_replace('/(1[3587]{1}[0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone);
  408. }
  409. }
  410. /**
  411. *
  412. * @param 生成字符长度 $len
  413. * @param 生成类型默认大小写数字,0大小写 1数字 2大写 3小写 4中文 $type
  414. * @param 添加字符后缀 $addChars
  415. *
  416. * @return
  417. */
  418. function rand_str($len=6,$type='',$addChars='') {
  419. $str ='';
  420. switch($type) {
  421. case 0:
  422. $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.$addChars;
  423. break;
  424. case 1:
  425. $chars= str_repeat('0123456789',3);
  426. break;
  427. case 2:
  428. $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.$addChars;
  429. break;
  430. case 3:
  431. $chars='abcdefghijklmnopqrstuvwxyz'.$addChars;
  432. break;
  433. case 4:
  434. $chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借".$addChars;
  435. break;
  436. default :
  437. $chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars;
  438. break;
  439. }
  440. if($len>10 ) {
  441. $chars= $type==1? str_repeat($chars,$len) : str_repeat($chars,5);
  442. }
  443. if($type!=4) {
  444. $chars = str_shuffle($chars);
  445. $str = substr($chars,0,$len);
  446. }else{
  447. for($i=0;$i<$len;$i++){
  448. $str.= strcut($chars,1, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),0);
  449. }
  450. }
  451. return $str;
  452. }
  453. /*
  454. 生成唯一订单号
  455. 表名 ,字段名,前缀
  456. */
  457. function ordersn($table, $field, $prefix)
  458. {
  459. $billno = date('YmdHis') . rand_str(6,1);
  460. while (1) {
  461. $count = pdo_fetchcolumn('select count(*) from ' . tablename($table) . ' where ' . $field . '=:billno limit 1', array(':billno' => $billno));
  462. if ($count <= 0) {
  463. break;
  464. }
  465. $billno = date('YmdHis') .rand_str(6,1);
  466. }
  467. return $prefix . $billno;
  468. }
  469. /**
  470. *
  471. * @param 字符串 $str
  472. * @param 长度 $length
  473. * @param 开始位置 $start
  474. * @param 是否显示... $suffix
  475. * @param 编码 $charset
  476. *
  477. * 截取字符串
  478. */
  479. function cut_str($str,$length, $start=0, $suffix=true,$charset="utf-8") {
  480. if(function_exists("mb_substr"))
  481. $slice = mb_substr($str, $start, $length, $charset);
  482. elseif(function_exists('iconv_substr')) {
  483. $slice = iconv_substr($str,$start,$length,$charset);
  484. if(false === $slice) {
  485. $slice = '';
  486. }
  487. }else{
  488. $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  489. $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  490. $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  491. $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  492. preg_match_all($re[$charset], $str, $match);
  493. $slice = join("",array_slice($match[0], $start, $length));
  494. }
  495. return $suffix ? $slice.'...' : $slice;
  496. }
  497. /**
  498. *
  499. * @param 字节大小 $size
  500. * @param 保留小数位数 $dec
  501. *
  502. * 格式化文件大小
  503. */
  504. function file_size($size, $dec=2) {
  505. $a = array("B", "KB", "MB", "GB", "TB", "PB");
  506. $pos = 0;
  507. while ($size >= 1024) {
  508. $size /= 1024;
  509. $pos++;
  510. }
  511. return round($size,$dec)." ".$a[$pos];
  512. }
  513. /**
  514. *
  515. * @param 文件名或路径 $file
  516. *
  517. * 删除文件夹或文件
  518. */
  519. function file_delete($file){
  520. if (empty($file))
  521. return false;
  522. if (@is_file($file))
  523. return @unlink($file);
  524. $ret = true;
  525. if ($handle = @opendir($file)) {
  526. while ($filename = @readdir($handle)){
  527. if ($filename == '.' || $filename == '..')
  528. continue;
  529. if (!file_delete($file . '/' . $filename))
  530. $ret = false;
  531. }
  532. } else {
  533. $ret = false;
  534. }
  535. @closedir($handle);
  536. if ( file_exists($file) && !rmdir($file) ){
  537. $ret = false;
  538. }
  539. return $ret;
  540. }
  541. /*概率算法
  542. proArr array(100,200,300,400)
  543. function get_prize(){//获取中奖
  544. $prize_arr = array(
  545. array('id'=>1,'prize'=>'平板电脑','v'=>1),
  546. array('id'=>2,'prize'=>'数码相机','v'=>1),
  547. array('id'=>3,'prize'=>'音箱设备','v'=>1),
  548. array('id'=>4,'prize'=>'4G优盘','v'=>1),
  549. array('id'=>5,'prize'=>'10Q币','v'=>1),
  550. array('id'=>6,'prize'=>'下次没准就能中哦','v'=>95),
  551. );
  552. foreach ($prize_arr as $key => $val) {
  553. $arr[$val['id']] = $val['v'];
  554. }
  555. $ridk = get_rand($arr); //根据概率获取奖项id
  556. $res['yes'] = $prize_arr[$ridk-1]['prize']; //中奖项
  557. unset($prize_arr[$ridk-1]); //将中奖项从数组中剔除,剩下未中奖项
  558. shuffle($prize_arr); //打乱数组顺序
  559. for($i=0;$i<count($prize_arr);$i++){
  560. $pr[] = $prize_arr[$i]['prize'];
  561. }
  562. $res['no'] = $pr;
  563. return $res;
  564. }
  565. */
  566. function get_rand($proArr) {
  567. $result = '';
  568. $proSum = array_sum($proArr);
  569. foreach ($proArr as $key => $proCur) {
  570. $randNum = mt_rand(1, $proSum);
  571. if ($randNum <= $proCur) {
  572. $result = $key;
  573. break;
  574. } else {
  575. $proSum -= $proCur;
  576. }
  577. }
  578. unset ($proArr);
  579. return $result;
  580. }
  581. /**
  582. * 去除空格 换行
  583. * @param undefined $str
  584. *
  585. * @return
  586. */
  587. function trim_str($str)
  588. {
  589. $str = trim($str);
  590. $str = preg_replace("/\t/","",$str);
  591. $str = preg_replace("/\r\n/","",$str);
  592. $str = preg_replace("/\r/","",$str);
  593. $str = preg_replace("/\n/","",$str);
  594. $str = preg_replace("/ /","",$str);
  595. return trim($str); //返回字符串
  596. }
  597. /**
  598. *
  599. * @param 字符串 $string
  600. * @param 要查找字符串 $find
  601. *
  602. * 是否包含子字符串
  603. */
  604. function find_str($string, $find) {
  605. return !(strpos($string, $find) === FALSE);
  606. }
  607. /**
  608. * 获取ip
  609. *
  610. * @return
  611. */
  612. function get_ip(){
  613. $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
  614. if(!preg_match("/^\d+\.\d+\.\d+\.\d+$/", $ip)){
  615. $ip = '0';
  616. }
  617. return $ip;
  618. }
  619. /**
  620. * 生成avatar头像
  621. * @param 邮箱 $email
  622. * @param 大小 $s
  623. * @param undefined $d
  624. * @param undefined $g
  625. *
  626. * @return
  627. */
  628. function get_avatar($email='', $s=40, $d='mm', $g='g') {
  629. $hash = md5($email);
  630. $avatar = "http://www.gravatar.com/avatar/$hash?s=$s&d=$d&r=$g";
  631. return $avatar;
  632. }
  633. /**
  634. *
  635. * @param 要编码内容 $string
  636. * @param ENCODE加密 默认解密 $operation
  637. * @param 蜜月 $key
  638. * @param undefined $expiry
  639. *
  640. * @return
  641. */
  642. /**
  643. * 获得使用内存
  644. *
  645. * @return 内存大小
  646. */
  647. function get_memory(){
  648. return round((memory_get_usage()/1024/1024),3)."M";
  649. }
  650. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  651. $ckey_length = 4;
  652. $keya = md5(substr($key, 0, 16));
  653. $keyb = md5(substr($key, 16, 16));
  654. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
  655. $cryptkey = $keya.md5($keya.$keyc);
  656. $key_length = strlen($cryptkey);
  657. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  658. $string_length = strlen($string);
  659. $result = '';
  660. $box = range(0, 255);
  661. $rndkey = array();
  662. for($i = 0; $i <= 255; $i++) {
  663. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  664. }
  665. for($j = $i = 0; $i < 256; $i++) {
  666. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  667. $tmp = $box[$i];
  668. $box[$i] = $box[$j];
  669. $box[$j] = $tmp;
  670. }
  671. for($a = $j = $i = 0; $i < $string_length; $i++) {
  672. $a = ($a + 1) % 256;
  673. $j = ($j + $box[$a]) % 256;
  674. $tmp = $box[$a];
  675. $box[$a] = $box[$j];
  676. $box[$j] = $tmp;
  677. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  678. }
  679. if($operation == 'DECODE') {
  680. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  681. return substr($result, 26);
  682. } else {
  683. return '';
  684. }
  685. } else {
  686. return $keyc.str_replace('=', '', base64_encode($result));
  687. }
  688. }
  689. /**
  690. * 生成随即颜色
  691. *
  692. * @return
  693. */
  694. function rand_color(){
  695. $char='abcdef0123456789';
  696. $str='';
  697. for($i=0;$i<6;$i++){
  698. $str .= substr($char,mt_rand(0,15),1);
  699. }
  700. return '#'.$str;
  701. }
  702. /**
  703. *
  704. * @param 时间戳 $time
  705. * @param 颜色 $color
  706. * 24小时内红色
  707. * @return
  708. */
  709. function timered($time,$color='red')
  710. {
  711. if((time()-$time)>24*3600)
  712. {
  713. return timeline($time);
  714. }
  715. else
  716. {
  717. return '<span style="color:'.$color.'">'.timeline($time).'</span>';
  718. }
  719. }
  720. /*
  721. 内部方法
  722. show 数组转换xml格式或json格式或数组输出
  723. $code 状态码
  724. $message 返回信息
  725. $data 数组
  726. $type 类型默认json 支持xml array参数
  727. */
  728. function _arr2json($code,$message='',$data = array()){
  729. if(!is_numeric($code)){
  730. return '';
  731. }
  732. $arr =array(
  733. 'code'=>$code,
  734. 'message'=>$message,
  735. 'data'=>$data
  736. );
  737. echo json_encode($arr);
  738. exit;
  739. }
  740. function _xml2encode($data){
  741. $d = '';
  742. $attr = '';
  743. foreach($data as $k=>$v){
  744. if(is_numeric($k)){
  745. $attr = "id='{$k}'";
  746. $k ="item";
  747. }
  748. $d .= "<{$k} {$attr}>";
  749. $d .=is_array($v)?self::_xml2encode($v) : $v;
  750. $d .="</{$k}>";
  751. }
  752. return $d;
  753. }
  754. function _arr2xml($code,$message='',$data = array()){
  755. if(!is_numeric($code)){
  756. return '';
  757. }
  758. $arr =array(
  759. 'code'=>$code,
  760. 'message'=>$message,
  761. 'data'=>$data
  762. );
  763. header("Content-Type:text/xml");
  764. $xml="";
  765. $xml .= '<?xml version="1.0" encoding="utf-8"?>';
  766. $xml .='<root>';
  767. $xml .="<code>{$code}</code>";
  768. $xml .="<message>{$message}</message>";
  769. $xml .="<data>";
  770. $xml .=_xml2encode($data);
  771. $xml .="</data>";
  772. $xml .='</root>';
  773. echo $xml;
  774. }
  775. function show($code,$message='',$data = array(),$type='json'){
  776. if(!is_numeric($code)){
  777. return '';
  778. }
  779. $arr =array(
  780. 'code'=>$code,
  781. 'message'=>$message,
  782. 'data'=>$data
  783. );
  784. $type = isset($_GET['format'])?$_GET['format']:$type;
  785. if('json' == $type){
  786. _arr2json($code,$message,$data);
  787. exit;
  788. }elseif('xml' ==$type){
  789. _arr2xml($code,$message,$data);
  790. exit;
  791. }elseif('array' ==$type){
  792. echo '<pre>'.print_r($data,TRUE).'</pre>';
  793. }
  794. }
  795. /**
  796. *
  797. * @param 数组 $arr
  798. * @param 层级 $level
  799. * @param undefined $ptagname
  800. *
  801. * 数组转换xml
  802. */
  803. function arr2xml($arr, $level = 1, $ptagname = '') {
  804. $s = $level == 1 ? "<xml>" : '';
  805. foreach($arr as $tagname => $value) {
  806. if (is_numeric($tagname)) {
  807. $tagname = $value['TagName'];
  808. unset($value['TagName']);
  809. }
  810. if(!is_array($value)) {
  811. $s .= "<{$tagname}>".(!is_numeric($value) ? '<![CDATA[' : '').$value.(!is_numeric($value) ? ']]>' : '')."</{$tagname}>";
  812. } else {
  813. $s .= "<{$tagname}>".self::arr2xml($value, $level + 1)."</{$tagname}>";
  814. }
  815. }
  816. $s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
  817. return $level == 1 ? $s."</xml>" : $s;
  818. }
  819. /**
  820. xml转换数组
  821. */
  822. function xml2arr($xml) {
  823. if (empty($xml)) {
  824. return array();
  825. }
  826. $result = array();
  827. $xmlobj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
  828. if($xmlobj instanceof SimpleXMLElement) {
  829. $result = json_decode(json_encode($xmlobj), true);
  830. if (is_array($result)) {
  831. return $result;
  832. } else {
  833. return array();
  834. }
  835. } else {
  836. return $result;
  837. }
  838. }
  839. /*
  840. 创建文件或文件夹
  841. 参数是数组
  842. file_create(["qq/","qq.txt","qqq/tt/"]);
  843. */
  844. function file_create($files) {
  845. foreach ($files as $key => $value) {
  846. if(substr($value, -1) == '/'){
  847. mkdir($value, 0777, true);
  848. }else{
  849. @file_put_contents($value, '');
  850. }
  851. }
  852. }
  853. //分页函数
  854. function pager($tcount, $pindex, $psize = 15, $url = '', $context = array('before' => 5, 'after' => 4, 'ajaxcallback' => '')) {
  855. global $_W;
  856. $pdata = array(
  857. 'tcount' => 0,
  858. 'tpage' => 0,
  859. 'cindex' => 0,
  860. 'findex' => 0,
  861. 'pindex' => 0,
  862. 'nindex' => 0,
  863. 'lindex' => 0,
  864. 'options' => ''
  865. );
  866. if($context['ajaxcallback']) {
  867. $context['isajax'] = true;
  868. }
  869. $pdata['tcount'] = $tcount;
  870. $pdata['tpage'] = ceil($tcount / $psize);
  871. if($pdata['tpage'] <= 1) {
  872. return '';
  873. }
  874. $cindex = $pindex;
  875. $cindex = min($cindex, $pdata['tpage']);
  876. $cindex = max($cindex, 1);
  877. $pdata['cindex'] = $cindex;
  878. $pdata['findex'] = 1;
  879. $pdata['pindex'] = $cindex > 1 ? $cindex - 1 : 1;
  880. $pdata['nindex'] = $cindex < $pdata['tpage'] ? $cindex + 1 : $pdata['tpage'];
  881. $pdata['lindex'] = $pdata['tpage'];
  882. if($context['isajax']) {
  883. if(!$url) {
  884. $url = $_W['script_name'] . '?' . http_build_query($_GET);
  885. }
  886. $pdata['faa'] = 'href="javascript:;" onclick="p(\'' . $_W['script_name'] . $url . '\', \'' . $pdata['findex'] . '\', ' . $context['ajaxcallback'] . ')"';
  887. $pdata['paa'] = 'href="javascript:;" onclick="p(\'' . $_W['script_name'] . $url . '\', \'' . $pdata['pindex'] . '\', ' . $context['ajaxcallback'] . ')"';
  888. $pdata['naa'] = 'href="javascript:;" onclick="p(\'' . $_W['script_name'] . $url . '\', \'' . $pdata['nindex'] . '\', ' . $context['ajaxcallback'] . ')"';
  889. $pdata['laa'] = 'href="javascript:;" onclick="p(\'' . $_W['script_name'] . $url . '\', \'' . $pdata['lindex'] . '\', ' . $context['ajaxcallback'] . ')"';
  890. } else {
  891. if($url) {
  892. $pdata['faa'] = 'href="?' . str_replace('*', $pdata['findex'], $url) . '"';
  893. $pdata['paa'] = 'href="?' . str_replace('*', $pdata['pindex'], $url) . '"';
  894. $pdata['naa'] = 'href="?' . str_replace('*', $pdata['nindex'], $url) . '"';
  895. $pdata['laa'] = 'href="?' . str_replace('*', $pdata['lindex'], $url) . '"';
  896. } else {
  897. $_GET['page'] = $pdata['findex'];
  898. $pdata['faa'] = 'href="' . $_W['script_name'] . '?' . http_build_query($_GET) . '"';
  899. $_GET['page'] = $pdata['pindex'];
  900. $pdata['paa'] = 'href="' . $_W['script_name'] . '?' . http_build_query($_GET) . '"';
  901. $_GET['page'] = $pdata['nindex'];
  902. $pdata['naa'] = 'href="' . $_W['script_name'] . '?' . http_build_query($_GET) . '"';
  903. $_GET['page'] = $pdata['lindex'];
  904. $pdata['laa'] = 'href="' . $_W['script_name'] . '?' . http_build_query($_GET) . '"';
  905. }
  906. }
  907. $html = ' <div class="page-hd bg-gray" style="height:32px;">
  908. <div class="pager" id="pager"><div class="pager-left">';
  909. $html .= "<div class=\"pager-first\"><a {$pdata['faa']} class=\"pager-nav\">首页</a></div>";
  910. $html .= "<div class=\"pager-pre\"><a {$pdata['paa']} class=\"pager-nav\">上一页</a></div>";
  911. $html .='</div><div class="pager-cen">
  912. ' .$pindex.'/'.$pdata['tpage'].'
  913. </div><div class="pager-right">';
  914. $html .= "<div class=\"pager-next\"><a {$pdata['naa']} class=\"pager-nav\">下一页</a></div>";
  915. $html .= "<div class=\"pager-end\"><a {$pdata['laa']} class=\"pager-nav\">尾页</a></div>";
  916. $html .= '</div></div></div>';
  917. return $html;
  918. }
  919. /**
  920. *
  921. * @param undefined $type 弹出类型 1,2,3
  922. * @param undefined $info 提示语
  923. * @param undefined $url 跳转地址
  924. *
  925. * @return
  926. */
  927. function alert($type=1,$info="",$url=""){
  928. if(1==$type){//自动关闭
  929. $strs = empty($info)?"":"alert('$info');";
  930. echo "<script>".$strs."document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
  931. WeixinJSBridge.call('closeWindow');});</script>";exit;
  932. }elseif(2==$type){//显示跳转中...
  933. $urls = empty($url)?"":'location.href="'.$url.'";';
  934. $strs = empty($info)?"正在跳转中...":$info;
  935. echo "<meta charset='utf-8'>";
  936. die('<script type="text/javascript">document.write("<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=0\"><div style=\"font-size:16px;margin:30px auto;text-align:center;\">'.$strs.'</div>");document.addEventListener("WeixinJSBridgeReady", function onBridgeReady() {WeixinJSBridge.call("hideOptionMenu");'.$urls.'});</script>');
  937. }elseif(3==$type){//普通弹出,跳转
  938. $strs = empty($info)?"":"alert('$info');";
  939. $urls = empty($url)?"":'location.href="'.$url.'";';
  940. die('<script type="text/javascript">'.$strs.$urls.'</script>');
  941. }elseif(4==$type){//蓝色i
  942. echo "<meta charset='utf-8'>";
  943. die('<script>document.write("<title>'.$info.'</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=0\"><link rel=\"stylesheet\" href=\"https://res.wx.qq.com/open/libs/weui/0.4.3/weui.min.css\"><div class=\"weui_msg\"><div class=\"weui_icon_area\"><i class=\"weui_icon_info weui_icon_msg\"></i></div><div class=\"weui_text_area\"><h4 class=\"weui_msg_title\">'.$info.'</h4></div></div>");document.addEventListener("WeixinJSBridgeReady", function onBridgeReady() {WeixinJSBridge.call("hideOptionMenu");});</script>');
  944. }elseif(5==$type){//红色警告!
  945. echo "<meta charset='utf-8'>";
  946. die('<script>document.write("<title>'.$info.'</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=0\"><link rel=\"stylesheet\" href=\"https://res.wx.qq.com/open/libs/weui/0.4.3/weui.min.css\"><div class=\"weui_msg\"><div class=\"weui_icon_area\"><i class=\"weui_icon_msg weui_icon_warn\"></i></div><div class=\"weui_text_area\"><h4 class=\"weui_msg_title\">'.$info.'</h4></div></div>");document.addEventListener("WeixinJSBridgeReady", function onBridgeReady() {WeixinJSBridge.call("hideOptionMenu");});</script>');
  947. }elseif(6==$type){//绿色成功√
  948. echo "<meta charset='utf-8'>";
  949. die('<script>document.write("<title>'.$info.'</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=0\"><link rel=\"stylesheet\" href=\"https://res.wx.qq.com/open/libs/weui/0.4.3/weui.min.css\"><div class=\"weui_msg\"><div class=\"weui_icon_area\"><i class=\"weui_icon_msg weui_icon_success\"></i></div><div class=\"weui_text_area\"><h4 class=\"weui_msg_title\">'.$info.'</h4></div></div>");document.addEventListener("WeixinJSBridgeReady", function onBridgeReady() {WeixinJSBridge.call("hideOptionMenu");});</script>');
  950. }
  951. }
  952. /*
  953. 发送文本类型客服消息
  954. *openid和文本内容
  955. */
  956. function send_kefu($openid,$content) {
  957. load()->classs('weixin.account');
  958. $token =WeAccount::token();
  959. $msg = '{
  960. "touser":"'.$openid.'",
  961. "msgtype":"text",
  962. "text":
  963. {
  964. "content":"'.$content.'"
  965. }
  966. }';
  967. $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$token;
  968. post($url,$msg);
  969. }
  970. /**
  971. * 发送模板消息
  972. * @param 用户id $openid
  973. * @param 模板id $tpl_id
  974. * @param 数组 $postdata
  975. * @param 打开地址 $url
  976. * @param 标题背景色 $topcolor
  977. *
  978. $arr = array();
  979. $dataarr =array(
  980. '五一放假通知','本校教务处','管理员','2016-4-28','学校决定五一放假3天,祝大家玩得愉快','点击查看详情'
  981. );
  982. $ss = '{{first.DATA}}
  983. 学校:{{keyword1.DATA}}
  984. 通知人:{{keyword2.DATA}}
  985. 时间:{{keyword3.DATA}}
  986. 通知内容:{{keyword4.DATA}}
  987. {{remark.DATA}}';
  988. preg_match_all('/{{(.*).DATA}}/',$ss,$rs);
  989. foreach($rs[1] as $k=>$v){
  990. $arr[$v] = array(
  991. 'value'=>$dataarr[$k]
  992. );
  993. }
  994. $arr['first']['color']='#04be02';
  995. $arr['remark']['color']='#18b4ed';
  996. send_tpl($openid,'3oiem69kUht504hUJRvd9UgZzaGJrBauNNOH9yB6sq4', $arr,'http://weixin.yoby123.cn/app/index.php?i=1&c=entry&do=fm&m=yoby_game','#FF683F');
  997. */
  998. function send_tpl($openid, $tpl_id, $postdata, $url = '', $topcolor = '#FF683F'){
  999. $token =WeAccount::token();
  1000. $data = array();
  1001. $data['touser'] = $openid;
  1002. $data['template_id'] = trim($tpl_id);
  1003. $data['url'] = trim($url);
  1004. $data['topcolor'] = trim($topcolor);
  1005. $data['data'] = $postdata;
  1006. $data = json_encode($data);
  1007. $post_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={$token}";
  1008. $response = post($post_url, $data);
  1009. return true;
  1010. }
  1011. /**
  1012. *
  1013. * @param 媒体id $meid
  1014. * 下载多媒体图片
  1015. * @return
  1016. */
  1017. function get_media($meid){
  1018. $token = WeAccount::token();
  1019. $data =get("https://api.weixin.qq.com/cgi-bin/media/get?access_token=$token&media_id=$meid");
  1020. return $data;
  1021. }
  1022. /**
  1023. * 上传多媒体
  1024. * @param 文件名 $filename
  1025. * @param 类型 $type
  1026. *
  1027. * @return
  1028. */
  1029. function set_media($filename,$type='image'){
  1030. $token = WeAccount::token();
  1031. $curl = curl_init ();
  1032. if (class_exists ( '/CURLFile' )) {
  1033. curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, true );
  1034. $msg = array (
  1035. 'fieldname' => new \CURLFile ( realpath ( $filename ), 'image/jpeg' )
  1036. );
  1037. } else {
  1038. $msg = array('media'=>'@'.$filename);
  1039. if (defined ( 'CURLOPT_SAFE_UPLOAD' )) {
  1040. curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, false );
  1041. }
  1042. }
  1043. curl_setopt ( $curl, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=$token&type=$type");
  1044. curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
  1045. curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );
  1046. if (! empty ( $msg )) {
  1047. curl_setopt ( $curl, CURLOPT_POST, 1 );
  1048. @curl_setopt ( $curl, CURLOPT_POSTFIELDS, $msg );
  1049. }
  1050. curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
  1051. $data = curl_exec ( $curl );
  1052. curl_close ( $curl );
  1053. return $data;
  1054. }
  1055. /**
  1056. *
  1057. * @param 图片路径 $src
  1058. *
  1059. * @return 图片信息
  1060. */
  1061. function get_img($src){
  1062. if(empty($src)){
  1063. return '';
  1064. }
  1065. $srcarr = getimagesize($src);
  1066. $arr = array(1=>'gif','jpg','png');
  1067. return $srcarr[0]."X".$srcarr[1]." ".$arr[$srcarr[2]];
  1068. }
  1069. /**
  1070. *
  1071. * @param 是否返回base64 $isbaseb4
  1072. * @param 是否调试 $isdebug
  1073. * 使用oauth方式获取,用于服务号
  1074. * @return
  1075. */
  1076. function get_userinfo($isbaseb4=false,$isdebug=false){
  1077. $userinfo = array();
  1078. if($isdebug){
  1079. $userinfo = array('openid' => 'oT-ihv9XGkJbX9owJiLZcZPAJcog', 'nickname' => '狸小狐', 'headimgurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png', 'province' => '山东', 'city' => '青岛');
  1080. }else{
  1081. load()->model('mc');
  1082. $userinfo = mc_oauth_userinfo();
  1083. }
  1084. return $isbaseb4?urlencode(base64_encode(json_encode($userinfo))):$userinfo;
  1085. }
  1086. /**
  1087. *
  1088. * @param $openid
  1089. * 判断用户是否关注,不填写openid自动获取当前用户openid,关注返回1,其他都返回0
  1090. * @return
  1091. */
  1092. function is_follow($openid = '')
  1093. {
  1094. global $_W;
  1095. $openid = (empty($openid))?$_W['openid']:$openid;
  1096. if (!empty($openid))
  1097. {
  1098. $rs = pdo_fetch('select follow from ' . tablename('mc_mapping_fans') . ' where openid=:openid and uniacid=:uniacid limit 1', array(':openid' => $openid, ':uniacid' => $_W['uniacid']));
  1099. $followed = ($rs['follow'] == 1)?1:0;
  1100. return $followed;
  1101. }else{
  1102. return 0;
  1103. }
  1104. }
  1105. /**
  1106. * 生成唯一id字符串
  1107. */
  1108. function get_id(){
  1109. return md5(uniqid());
  1110. }
  1111. // php获取当前访问的完整url地址
  1112. function get_url() {
  1113. $url = 'http://';
  1114. if (isset ( $_SERVER ['HTTPS'] ) && $_SERVER ['HTTPS'] == 'on') {
  1115. $url = 'https://';
  1116. }
  1117. if ($_SERVER ['SERVER_PORT'] != '80') {
  1118. $url .= $_SERVER ['HTTP_HOST'] . ':' . $_SERVER ['SERVER_PORT'] . $_SERVER ['REQUEST_URI'];
  1119. } else {
  1120. $url .= $_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI'];
  1121. }
  1122. // 兼容后面的参数组装
  1123. if (stripos ( $url, '?' ) === false) {
  1124. $url .= '?t=' . time ();
  1125. }
  1126. return $url;
  1127. }
  1128. /**
  1129. * 字符串与数组互相转换,转换自动判断是否数组
  1130. */
  1131. function str2arr($var,$str=','){
  1132. if(is_array($var)){
  1133. return implode($str,$var);
  1134. }else{
  1135. return explode($str,$var);
  1136. }
  1137. }
  1138. /**
  1139. * 生成日志
  1140. */
  1141. function logging($str){
  1142. load()->func('logging');
  1143. logging_run($str);
  1144. }
  1145. /**
  1146. * 判断是否utf8编码
  1147. * @param undefined $string
  1148. *
  1149. * @return
  1150. */
  1151. function is_utf8($string)
  1152. {
  1153. $c = 0;
  1154. $b = 0;
  1155. $bits = 0;
  1156. $len = strlen($string);
  1157. for($i=0; $i<$len; $i++)
  1158. {
  1159. $c = ord($string[$i]);
  1160. if($c > 128)
  1161. {
  1162. if(($c >= 254)) return false;
  1163. elseif($c >= 252) $bits=6;
  1164. elseif($c >= 248) $bits=5;
  1165. elseif($c >= 240) $bits=4;
  1166. elseif($c >= 224) $bits=3;
  1167. elseif($c >= 192) $bits=2;
  1168. else return false;
  1169. if(($i+$bits) > $len) return false;
  1170. while($bits > 1)
  1171. {
  1172. $i++;
  1173. $b=ord($string[$i]);
  1174. if($b < 128 || $b > 191) return false;
  1175. $bits--;
  1176. }
  1177. }
  1178. }
  1179. return true;
  1180. }
  1181. /**
  1182. * 判断是否 ajax请求
  1183. *
  1184. * @return
  1185. */
  1186. function is_ajax()
  1187. {
  1188. if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') return true;
  1189. if(isset($_GET['HTTP_X_REQUESTED_WITH']) && $_GET['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') return true;
  1190. return false;
  1191. }
  1192. /**
  1193. * 格式化金额
  1194. * @param undefined $str
  1195. *
  1196. * @return
  1197. */
  1198. function get_money($str){
  1199. return number_format($str, 2, '.', '');
  1200. }
  1201. /**
  1202. * 根据IP返回地址
  1203. *
  1204. * @return
  1205. */
  1206. function get_ipaddress()
  1207. {
  1208. $json = file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json');
  1209. $arr =json_decode($json,TRUE);
  1210. if($arr['ret']==1){
  1211. $arr1 = array();
  1212. $arr1['country'] = $arr['country'];
  1213. $arr1['province'] = $arr['province'];
  1214. $arr1['city'] = $arr['city'];
  1215. }else{
  1216. $arr1='';
  1217. }
  1218. return $arr1;
  1219. }
  1220. /**
  1221. * 计算两地之间距离
  1222. * @param undefined $lat1 经度1
  1223. * @param undefined $lng1 纬度1
  1224. * @param undefined $lat2 经度2
  1225. * @param undefined $lng2 纬度2
  1226. * @param 1 $len_type 1是米,2,千米
  1227. * @param undefined $decimal,保留两位小数
  1228. *
  1229. * @return
  1230. */
  1231. function get_distance($lat1, $lng1, $lat2, $lng2, $len_type = 1, $decimal = 2)
  1232. {
  1233. $pi = 3.1415926000000001;
  1234. $er = 6378.1369999999997;
  1235. $radLat1 = ($lat1 * $pi) / 180;
  1236. $radLat2 = ($lat2 * $pi) / 180;
  1237. $a = $radLat1 - $radLat2;
  1238. $b = (($lng1 * $pi) / 180) - (($lng2 * $pi) / 180);
  1239. $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + (cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))));
  1240. $s = $s * $er;
  1241. $s = round($s * 1000);
  1242. if (1 < $len_type)
  1243. {
  1244. $s /= 1000;
  1245. }
  1246. return round($s, $decimal);
  1247. }
  1248. /**
  1249. *
  1250. * @param undefined $appid
  1251. * @param undefined $secret
  1252. * @param undefined $snsapi,snsapi_userinfo
  1253. * @param undefined $expired
  1254. *
  1255. * @return
  1256. */
  1257. function get_oauth($appid, $secret, $snsapi = 'snsapi_base', $expired = '600')
  1258. {
  1259. global $_W;
  1260. $wxuser = $_COOKIE[$_W['config']['cookie']['pre'] . $appid];
  1261. if ($wxuser === NULL)
  1262. {
  1263. $code = ((isset($_GET['code']) ? $_GET['code'] : ''));
  1264. if (!($code))
  1265. {
  1266. $url =$_W['siteurl'];
  1267. $oauth_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($url) . '&response_type=code&scope=' . $snsapi . '&state=wxbase#wechat_redirect';
  1268. header('Location: ' . $oauth_url);
  1269. exit();
  1270. }
  1271. load()->func('communication');
  1272. $getOauthAccessToken = ihttp_get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code');
  1273. $json = json_decode($getOauthAccessToken['content'], true);
  1274. if (!(empty($json['errcode'])) && (($json['errcode'] == '40029') || ($json['errcode'] == '40163')))
  1275. {
  1276. $url = $_W['siteurl'];
  1277. $parse = parse_url($url);
  1278. if (isset($parse['query']))
  1279. {
  1280. parse_str($parse['query'], $params);
  1281. unset($params['code']);
  1282. unset($params['state']);
  1283. $url = $_W['siteroot'] . $parse['path'] . '?' . http_build_query($params);
  1284. }
  1285. $oauth_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($url) . '&response_type=code&scope=' . $snsapi . '&state=wxbase#wechat_redirect';
  1286. header('Location: ' . $oauth_url);
  1287. exit();
  1288. }
  1289. if ($snsapi == 'snsapi_userinfo')
  1290. {
  1291. $userinfo = ihttp_get('https://api.weixin.qq.com/sns/userinfo?access_token=' . $json['access_token'] . '&openid=' . $json['openid'] . '&lang=zh_CN');
  1292. $userinfo = $userinfo['content'];
  1293. }
  1294. else if ($snsapi == 'snsapi_base')
  1295. {
  1296. $userinfo = array();
  1297. $userinfo['openid'] = $json['openid'];
  1298. }
  1299. $userinfostr = json_encode($userinfo);
  1300. isetcookie($appid, $userinfostr, $expired);
  1301. return $userinfo;
  1302. }
  1303. return json_decode($wxuser, true);
  1304. }