\upload\install\includes\lib_auto_installer.php源码分析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了\upload\install\includes\lib_auto_installer.php源码分析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含27712字,纯文字阅读大概需要40分钟。
内容图文
1 <?php 2 3/** 4 * ECSHOP 安装程序 之 模型 5 * ============================================================================ 6 * * 版权所有 2005-2012 上海商派网络科技有限公司,并保留所有权利。 7 * 网站地址: http://www.ecshop.com; 8 * ---------------------------------------------------------------------------- 9 * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和 10 * 使用;不允许对程序代码以任何形式任何目的的再发布。 11 * ============================================================================ 12 * $Author: liuhui $ 13 * $Id: lib_installer.php 16368 2009-06-26 03:39:19Z liuhui $ 14*/ 15 16if (!defined(‘IN_ECS‘)) 17{ 18die(‘Hacking attempt‘); 19} 20 21/** 22 * 获得GD的版本号 23 * 24 * @access public 25 * @return string 返回版本号,可能的值为0,1,2 26*/ 27function get_gd_version() 28{ 29include_once(ROOT_PATH . ‘includes/cls_image.php‘); 30 31return cls_image::gd_version(); 32} 33 34/** 35 * 是否支持GD 36 * 37 * @access public 38 * @return boolean 成功返回true,失败返回false 39*/ 40function has_supported_gd() 41{ 42return get_gd_version() === 0 ? false : true; 43} 44 45/** 46 * 检测服务器上是否存在指定的文件类型 47 * 48 * @access public 49 * @param array $file_types 文件路径数组,形如array(‘dwt‘=>‘‘, ‘lbi‘=>‘‘, ‘dat‘=>‘‘) 50 * @return string 全部可写返回空串,否则返回以逗号分隔的文件类型组成的消息串 51*/ 52function file_types_exists($file_types) 53{ 54global$_LANG; 55 56$msg = ‘‘; 57foreach ($file_typesas$file_type => $file_path) 58 { 59if (!file_exists($file_path)) 60 { 61$msg .= $_LANG[‘cannt_support_‘ . $file_type] . ‘, ‘; 62 } 63 } 64 65$msg = preg_replace("/,\s*$/", ‘‘, $msg); 66 67return$msg; 68} 69 70/** 71 * 获得系统的信息 72 * 73 * @access public 74 * @return array 系统各项信息组成的数组 75*/ 76function get_system_info() 77{ 78global$_LANG; 79 80$system_info = array(); 81 82/* 检查系统基本参数 */ 83$system_info[] = array($_LANG[‘php_os‘], PHP_OS); 84$system_info[] = array($_LANG[‘php_ver‘], PHP_VERSION); 85 86/* 检查MYSQL支持情况 */ 87$mysql_enabled = function_exists(‘mysql_connect‘) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 88$system_info[] = array($_LANG[‘does_support_mysql‘], $mysql_enabled); 89 90/* 检查图片处理函数库 */ 91$gd_ver = get_gd_version(); 92$gd_ver = empty($gd_ver) ? $_LANG[‘not_support‘] : $gd_ver; 93if ($gd_ver > 0) 94 { 95if (PHP_VERSION >= ‘4.3‘ && function_exists(‘gd_info‘)) 96 { 97$gd_info = gd_info(); 98$jpeg_enabled = ($gd_info[‘JPG Support‘] === true) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 99$gif_enabled = ($gd_info[‘GIF Create Support‘] === true) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 100$png_enabled = ($gd_info[‘PNG Support‘] === true) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 101 } 102else 103 { 104if (function_exists(‘imagetypes‘)) 105 { 106$jpeg_enabled = ((imagetypes() & IMG_JPG) > 0) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 107$gif_enabled = ((imagetypes() & IMG_GIF) > 0) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 108$png_enabled = ((imagetypes() & IMG_PNG) > 0) ? $_LANG[‘support‘] : $_LANG[‘not_support‘]; 109 } 110else 111 { 112$jpeg_enabled = $_LANG[‘not_support‘]; 113$gif_enabled = $_LANG[‘not_support‘]; 114$png_enabled = $_LANG[‘not_support‘]; 115 } 116 } 117 } 118else 119 { 120$jpeg_enabled = $_LANG[‘not_support‘]; 121$gif_enabled = $_LANG[‘not_support‘]; 122$png_enabled = $_LANG[‘not_support‘]; 123 } 124$system_info[] = array($_LANG[‘gd_version‘], $gd_ver); 125$system_info[] = array($_LANG[‘jpeg‘], $jpeg_enabled); 126$system_info[] = array($_LANG[‘gif‘], $gif_enabled); 127$system_info[] = array($_LANG[‘png‘], $png_enabled); 128 129/* 检查系统是否支持以dwt,lib,dat为扩展名的文件 */ 130$file_types = array( 131 ‘dwt‘ => ROOT_PATH . ‘themes/default/index.dwt‘, 132 ‘lbi‘ => ROOT_PATH . ‘themes/default/library/member.lbi‘, 133 ‘dat‘ => ROOT_PATH . ‘includes/codetable/ipdata.dat‘ 134 ); 135$exists_info = file_types_exists($file_types); 136$exists_info = empty($exists_info) ? $_LANG[‘support_dld‘] : $exists_info; 137$system_info[] = array($_LANG[‘does_support_dld‘], $exists_info); 138 139/* 服务器是否安全模式开启 */ 140$safe_mode = ini_get(‘safe_mode‘) == ‘1‘ ? $_LANG[‘safe_mode_on‘] : $_LANG[‘safe_mode_off‘]; 141$system_info[] = array($_LANG[‘safe_mode‘], $safe_mode); 142 143return$system_info; 144} 145 146/** 147 * 获得数据库列表 148 * 149 * @access public 150 * @param string $db_host 主机 151 * @param string $db_port 端口号 152 * @param string $db_user 用户名 153 * @param string $db_pass 密码 154 * @return mixed 成功返回数据库列表组成的数组,失败返回false 155*/ 156function get_db_list($db_host, $db_port, $db_user, $db_pass) 157{ 158global$err, $_LANG; 159$databases = array(); 160$filter_dbs = array(‘information_schema‘, ‘mysql‘); 161$db_host = construct_db_host($db_host, $db_port); 162$conn = @mysql_connect($db_host, $db_user, $db_pass); 163 164if ($conn === false) 165 { 166$err->add($_LANG[‘connect_failed‘]); 167returnfalse; 168 } 169 keep_right_conn($conn); 170 171$result = mysql_query(‘SHOW DATABASES‘, $conn); 172if ($result !== false) 173 { 174while (($row = mysql_fetch_assoc($result)) !== false) 175 { 176if (in_array($row[‘Database‘], $filter_dbs)) 177 { 178continue; 179 } 180$databases[] = $row[‘Database‘]; 181 } 182 } 183else 184 { 185$err->add($_LANG[‘query_failed‘]); 186returnfalse; 187 } 188 @mysql_close($conn); 189 190return$databases; 191} 192 193/** 194 * 获得时区列表,如有重复值,只保留第一个 195 * 196 * @access public 197 * @return array 198*/ 199function get_timezone_list($lang) 200{ 201if (file_exists(ROOT_PATH . ‘install/data/inc_timezones_‘ . $lang . ‘.php‘)) 202 { 203include_once(ROOT_PATH . ‘install/data/inc_timezones_‘ . $lang . ‘.php‘); 204 } 205else 206 { 207include_once(ROOT_PATH . ‘install/data/inc_timezones_zh_cn.php‘); 208 } 209 210returnarray_unique($timezones); 211} 212 213/** 214 * 获得服务器所在时区 215 * 216 * @access public 217 * @return string 返回时区串,形如Asia/Shanghai 218*/ 219function get_local_timezone() 220{ 221if (PHP_VERSION >= ‘5.1‘) 222 { 223$local_timezone = date_default_timezone_get(); 224 } 225else 226 { 227$local_timezone = ‘‘; 228 } 229 230return$local_timezone; 231} 232 233/** 234 * 创建指定名字的数据库 235 * 236 * @access public 237 * @param string $db_host 主机 238 * @param string $db_port 端口号 239 * @param string $db_user 用户名 240 * @param string $db_pass 密码 241 * @param string $db_name 数据库名 242 * @return boolean 成功返回true,失败返回false 243*/ 244function create_database($db_host, $db_port, $db_user, $db_pass, $db_name) 245{ 246global$err, $_LANG; 247$db_host = construct_db_host($db_host, $db_port); 248$conn = @mysql_connect($db_host, $db_user, $db_pass); 249 250if ($conn === false) 251 { 252$err->add($_LANG[‘connect_failed‘]); 253 254returnfalse; 255 } 256 257$mysql_version = mysql_get_server_info($conn); 258 keep_right_conn($conn, $mysql_version); 259if (mysql_select_db($db_name, $conn) === false) 260 { 261$sql = $mysql_version >= ‘4.1‘ ? "CREATE DATABASE $db_name DEFAULT CHARACTER SET " . EC_DB_CHARSET : "CREATE DATABASE $db_name"; 262if (mysql_query($sql, $conn) === false) 263 { 264$err->add($_LANG[‘cannt_create_database‘]); 265returnfalse; 266 } 267 } 268 @mysql_close($conn); 269 270returntrue; 271} 272 273/** 274 * 保证进行正确的数据库连接(如字符集设置) 275 * 276 * @access public 277 * @param string $conn 数据库连接 278 * @param string $mysql_version mysql版本号 279 * @return void 280*/ 281function keep_right_conn($conn, $mysql_version=‘‘) 282{ 283if ($mysql_version === ‘‘) 284 { 285$mysql_version = mysql_get_server_info($conn); 286 } 287 288if ($mysql_version >= ‘4.1‘) 289 { 290mysql_query(‘SET character_set_connection=‘ . EC_DB_CHARSET . ‘, character_set_results=‘ . EC_DB_CHARSET . ‘, character_set_client=binary‘, $conn); 291 292if ($mysql_version > ‘5.0.1‘) 293 { 294mysql_query("SET sql_mode=‘‘", $conn); 295 } 296 } 297} 298 299/** 300 * 创建配置文件 301 * 302 * @access public 303 * @param string $db_host 主机 304 * @param string $db_port 端口号 305 * @param string $db_user 用户名 306 * @param string $db_pass 密码 307 * @param string $db_name 数据库名 308 * @param string $prefix 数据表前缀 309 * @param string $timezone 时区 310 * @return boolean 成功返回true,失败返回false 311*/ 312function create_config_file($db_host, $db_port, $db_user, $db_pass, $db_name, $prefix, $timezone) 313{ 314global$err, $_LANG; 315$db_host = construct_db_host($db_host, $db_port); 316 317$content = ‘<?‘ ."php\n"; 318$content .= "// database host\n"; 319$content .= "\$db_host = \"$db_host\";\n\n"; 320$content .= "// database name\n"; 321$content .= "\$db_name = \"$db_name\";\n\n"; 322$content .= "// database username\n"; 323$content .= "\$db_user = \"$db_user\";\n\n"; 324$content .= "// database password\n"; 325$content .= "\$db_pass = \"$db_pass\";\n\n"; 326$content .= "// table prefix\n"; 327$content .= "\$prefix = \"$prefix\";\n\n"; 328$content .= "\$timezone = \"$timezone\";\n\n"; 329$content .= "\$cookie_path = \"/\";\n\n"; 330$content .= "\$cookie_domain = \"\";\n\n"; 331$content .= "\$session = \"1440\";\n\n"; 332$content .= "define(‘EC_CHARSET‘,‘".EC_CHARSET."‘);\n\n"; 333$content .= "define(‘ADMIN_PATH‘,‘admin‘);\n\n"; 334$content .= ‘?>‘; 335 336$fp = @fopen(ROOT_PATH . ‘data/config.php‘, ‘wb+‘); 337if (!$fp) 338 { 339$err->add($_LANG[‘open_config_file_failed‘]); 340returnfalse; 341 } 342if (!@fwrite($fp, trim($content))) 343 { 344$err->add($_LANG[‘write_config_file_failed‘]); 345returnfalse; 346 } 347 @fclose($fp); 348 349returntrue; 350} 351 352/** 353 * 把host、port重组成指定的串 354 * 355 * @access public 356 * @param string $db_host 主机 357 * @param string $db_port 端口号 358 * @return string host、port重组后的串,形如host:port 359*/ 360function construct_db_host($db_host, $db_port) 361{ 362return$db_host . ‘:‘ . $db_port; 363} 364 365/** 366 * 安装数据 367 * 368 * @access public 369 * @param array $sql_files SQL文件路径组成的数组 370 * @return boolean 成功返回true,失败返回false 371*/ 372function install_data($sql_files) 373{ 374global$err; 375 376include(ROOT_PATH . ‘data/config.php‘); 377include_once(ROOT_PATH . ‘includes/cls_mysql.php‘); 378include_once(ROOT_PATH . ‘includes/cls_sql_executor.php‘); 379 380$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name); 381$se = new sql_executor($db, EC_DB_CHARSET, ‘ecs_‘, $prefix); 382$result = $se->run_all($sql_files); 383if ($result === false) 384 { 385$err->add($se->error); 386returnfalse; 387 } 388 389returntrue; 390} 391 392/** 393 * 创建管理员帐号 394 * 395 * @access public 396 * @param string $admin_name 397 * @param string $admin_password 398 * @param string $admin_password2 399 * @param string $admin_email 400 * @return boolean 成功返回true,失败返回false 401*/ 402function create_admin_passport($admin_name, $admin_password, $admin_password2, $admin_email) 403{ 404if(trim($_REQUEST[‘lang‘])!=‘zh_cn‘) 405 { 406global$err,$_LANG; 407$system_lang = isset($_POST[‘system_lang‘]) ? $_POST[‘system_lang‘] : ‘zh_cn‘; 408include_once(ROOT_PATH . ‘install/languages/‘ . $system_lang . ‘.php‘); 409 } 410else 411 { 412global$err,$_LANG; 413 } 414 415if ($admin_password === ‘‘) 416 { 417$err->add($_LANG[‘password_empty_error‘]); 418returnfalse; 419 } 420 421if ($admin_password === ‘‘) 422 { 423$err->add($_LANG[‘password_empty_error‘]); 424returnfalse; 425 } 426 427if (!(strlen($admin_password) >= 8 && preg_match("/\d+/",$admin_password) && preg_match("/[a-zA-Z]+/",$admin_password))) 428 { 429$err->add($_LANG[‘js_languages‘][‘password_invaild‘]); 430returnfalse; 431 } 432 433 434 435include(ROOT_PATH . ‘data/config.php‘); 436include_once(ROOT_PATH . ‘includes/cls_mysql.php‘); 437include_once(ROOT_PATH . ‘includes/lib_common.php‘); 438 439$nav_list = join(‘,‘, $_LANG[‘admin_user‘]); 440 441$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name); 442$sql = "INSERT INTO $prefix"."admin_user ". 443 "(user_name, email, password, add_time, action_list, nav_list)". 444 "VALUES ". 445 "(‘$admin_name‘, ‘$admin_email‘, ‘".$admin_password. "‘, " .gmtime(). ", ‘all‘, ‘$nav_list‘)"; 446if (!$db->query($sql, ‘SILENT‘)) 447 { 448$err->add($_LANG[‘create_passport_failed‘]); 449returnfalse; 450 } 451 452returntrue; 453} 454 455/** 456 * 安装预选商品类型 457 * 458 * @access public 459 * @param array $goods_types 预选商品类型 460 * @param string $lang 语言 461 * @return boolean 成功返回true,失败返回false 462*/ 463function install_goods_types($goods_types, $lang) 464{ 465global$err; 466 467if (!$goods_types) 468 { 469returntrue; 470 } 471 472include(ROOT_PATH . ‘data/config.php‘); 473include_once(ROOT_PATH . ‘includes/cls_mysql.php‘); 474$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name); 475 476if (file_exists(ROOT_PATH . ‘install/data/inc_goods_type_‘ . $lang . ‘.php‘)) 477 { 478include(ROOT_PATH . ‘install/data/inc_goods_type_‘ . $lang . ‘.php‘); 479 } 480else 481 { 482include(ROOT_PATH . ‘install/data/inc_goods_type_zh_cn.php‘); 483 } 484foreach ($attributesas$key=>$val) 485 { 486if (!in_array($key, $goods_types)) 487 { 488continue; 489 } 490 491if (!$db->query($val[‘cat‘], ‘SILENT‘)) 492 { 493$err->add($db->errno() .‘ ‘. $db->error()); 494returnfalse; 495 } 496$cat_id = $db->Insert_ID(); 497 498$sql = str_replace("{cat_id}", $cat_id, $val[‘attr‘]); 499if (!$db->query($sql, ‘SILENT‘)) 500 { 501$err->add($db->errno() .‘ ‘. $db->error()); 502returnfalse; 503 } 504 } 505 506returntrue; 507} 508 509/** 510 * 把一个文件从一个目录复制到另一个目录 511 * 512 * @access public 513 * @param string $source 源目录 514 * @param string $target 目标目录 515 * @return boolean 成功返回true,失败返回false 516*/ 517function copy_files($source, $target) 518{ 519global$err, $_LANG; 520 521if (!file_exists($target)) 522 { 523//if (!mkdir(rtrim($target, ‘/‘), 0777)) 524if (!mkdir($target, 0777)) 525 { 526$err->add($_LANG[‘cannt_mk_dir‘]); 527returnfalse; 528 } 529 @chmod($target, 0777); 530 } 531$dir = opendir($source); 532while (($file = @readdir($dir)) !== false) 533 { 534if (is_file($source . $file)) 535 { 536if (!copy($source . $file, $target . $file)) 537 { 538$err->add($_LANG[‘cannt_copy_file‘]); 539returnfalse; 540 } 541 @chmod($target . $file, 0777); 542 } 543 } 544closedir($dir); 545 546returntrue; 547} 548 549/** 550 * 其它设置 551 * 552 * @access public 553 * @param string $system_lang 系统语言 554 * @param string $disable_captcha 是否开启验证码 555 * @param array $goods_types 预选商品类型 556 * @param string $install_demo 是否安装测试数据 557 * @param string $integrate_code 用户接口 558 * @return boolean 成功返回true,失败返回false 559*/ 560function do_others($system_lang, $captcha, $goods_types, $install_demo, $integrate_code) 561{ 562global$err, $_LANG; 563 564/* 安装预选商品类型 */ 565if (!install_goods_types($goods_types, $system_lang)) 566 { 567$err->add(implode(‘‘, $err->last_message())); 568returnfalse; 569 } 570 571/* 安装测试数据 */ 572if (intval($install_demo)) 573 { 574if (file_exists(ROOT_PATH . ‘demo/‘. $system_lang . ‘.sql‘)) 575 { 576$sql_files = array(ROOT_PATH . ‘demo/‘. $system_lang . ‘.sql‘); 577 } 578else 579 { 580$sql_files = array(ROOT_PATH . ‘demo/zh_cn.sql‘); 581 } 582if (!install_data($sql_files)) 583 { 584$err->add(implode(‘‘, $err->last_message())); 585returnfalse; 586 } 587if (!copy_files(ROOT_PATH . ‘demo/brandlogo/‘, ROOT_PATH . ‘data/brandlogo/‘)) 588 { 589$err->add(implode(‘‘, $err->last_message())); 590returnfalse; 591 } 592if (!copy_files(ROOT_PATH . ‘demo/200905/goods_img/‘, ROOT_PATH . ‘images/200905/goods_img/‘)) 593 { 594$err->add(implode(‘‘, $err->last_message())); 595returnfalse; 596 } 597if (!copy_files(ROOT_PATH . ‘demo/200905/thumb_img/‘, ROOT_PATH . ‘images/200905/thumb_img/‘)) 598 { 599$err->add(implode(‘‘, $err->last_message())); 600returnfalse; 601 } 602if (!copy_files(ROOT_PATH . ‘demo/200905/source_img/‘, ROOT_PATH . ‘images/200905/source_img/‘)) 603 { 604$err->add(implode(‘‘, $err->last_message())); 605returnfalse; 606 } 607if (!copy_files(ROOT_PATH . ‘demo/afficheimg/‘, ROOT_PATH . ‘data/afficheimg/‘)) 608 { 609$err->add(implode(‘‘, $err->last_message())); 610returnfalse; 611 } 612if (!copy_files(ROOT_PATH . ‘demo/packimg/‘, ROOT_PATH . ‘data/packimg/‘)) 613 { 614$err->add(implode(‘‘, $err->last_message())); 615returnfalse; 616 } 617if (!copy_files(ROOT_PATH . ‘demo/cardimg/‘, ROOT_PATH . ‘data/cardimg/‘)) 618 { 619$err->add(implode(‘‘, $err->last_message())); 620returnfalse; 621 } 622 } 623 624include(ROOT_PATH . ‘data/config.php‘); 625include_once(ROOT_PATH . ‘includes/cls_mysql.php‘); 626$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name); 627 628/* 更新 ECSHOP 语言 */ 629$sql = "UPDATE $prefix"."shop_config SET value=‘" . $system_lang . "‘ WHERE code=‘lang‘"; 630if (!$db->query($sql, ‘SILENT‘)) 631 { 632$err->add($db->errno() .‘ ‘. $db->error()); 633returnfalse; 634 } 635 636/* 更新用户接口 */ 637if (!empty($integrate_code)) 638 { 639$sql = "UPDATE $prefix"."shop_config SET value=‘" . $integrate_code . "‘ WHERE code=‘integrate_code‘"; 640if (!$db->query($sql, ‘SILENT‘)) 641 { 642$err->add($db->errno() .‘ ‘. $db->error()); 643returnfalse; 644 } 645 } 646 647/* 处理验证码 */ 648if (!empty($captcha)) 649 { 650$sql = "UPDATE $prefix" . "shop_config SET value = ‘12‘ WHERE code = ‘captcha‘"; 651if (!$db->query($sql, ‘SILENT‘)) 652 { 653$err->add($db->errno() .‘ ‘. $db->error()); 654returnfalse; 655 } 656 } 657 658/* 更新用户接口配置 */ 659if (file_exists(ROOT_PATH .‘data/config_temp.php‘)) 660 { 661include(ROOT_PATH .‘data/config_temp.php‘); 662$sql = "UPDATE $prefix" . "shop_config SET value = ‘".serialize($cfg)."‘ WHERE code = ‘integrate_config‘"; 663if (!$db->query($sql, ‘SILENT‘)) 664 { 665$err->add($db->errno() .‘ ‘. $db->error()); 666returnfalse; 667 } 668 } 669 670returntrue; 671} 672 673/** 674 * 安装完成后的一些善后处理 675 * 676 * @access public 677 * @return boolean 成功返回true,失败返回false 678*/ 679function deal_aftermath() 680{ 681global$err, $_LANG; 682 683include(ROOT_PATH . ‘data/config.php‘); 684include_once(ROOT_PATH . ‘includes/cls_ecshop.php‘); 685include_once(ROOT_PATH . ‘includes/cls_mysql.php‘); 686 687$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name); 688 689/* 初始化友情链接 690 $sql = "INSERT INTO $prefix"."friend_link ". 691 "(link_name, link_url, link_logo, show_order)". 692 "VALUES ". 693 "(‘".$_LANG[‘default_friend_link‘]."‘, ‘http://www.ecshop.com/‘, ‘http://www.ecshop.com/images/logo/ecshop_logo.gif‘,‘0‘)"; 694 if (!$db->query($sql, ‘SILENT‘)) 695 { 696 $err->add($db->errno() .‘ ‘. $db->error()); 697 } 698 699 $sql = "INSERT INTO $prefix"."friend_link ". 700 "(link_name, link_url, show_order)". 701 "VALUES ". 702 "(‘".$_LANG[‘maifou_friend_link‘]."‘, ‘http://www.maifou.net/‘,‘1‘)"; 703 if (!$db->query($sql, ‘SILENT‘)) 704 { 705 $err->add($db->errno() .‘ ‘. $db->error()); 706 }*/ 707 708/* 更新 ECSHOP 安装日期 */ 709$sql = "UPDATE $prefix"."shop_config SET value=‘" .time(). "‘ WHERE code=‘install_date‘"; 710if (!$db->query($sql, ‘SILENT‘)) 711 { 712$err->add($db->errno() .‘ ‘. $db->error()); 713 } 714 715/* 更新 ECSHOP 版本 */ 716$sql = "UPDATE $prefix"."shop_config SET value=‘" .VERSION. "‘ WHERE code=‘ecs_version‘"; 717if (!$db->query($sql, ‘SILENT‘)) 718 { 719$err->add($db->errno() .‘ ‘. $db->error()); 720returnfalse; 721 } 722 723/* 写入 hash_code,做为网站唯一性密钥 */ 724$hash_code = md5(md5(time()) . md5($db->dbhash) . md5(time())); 725$sql = "UPDATE $prefix"."shop_config SET value = ‘$hash_code‘ WHERE code = ‘hash_code‘ AND value = ‘‘"; 726if (!$db->query($sql, ‘SILENT‘)) 727 { 728$err->add($db->errno() .‘ ‘. $db->error()); 729returnfalse; 730 } 731 732/* 写入安装锁定文件 */ 733$fp = @fopen(ROOT_PATH . ‘data/install.lock‘, ‘wb+‘); 734if (!$fp) 735 { 736$err->add($_LANG[‘open_installlock_failed‘]); 737returnfalse; 738 } 739if (!@fwrite($fp, "TRADE SHOP INSTALLED")) 740 { 741$err->add($_LANG[‘write_installlock_failed‘]); 742returnfalse; 743 } 744 @fclose($fp); 745 746returntrue; 747} 748 749/** 750 * 获得spt代码 751 * 752 * @access public 753 * @return string spt代码 754*/ 755function get_spt_code() 756{ 757include(ROOT_PATH . ‘data/config.php‘); 758include_once(ROOT_PATH . ‘includes/cls_ecshop.php‘); 759include_once(ROOT_PATH . ‘includes/cls_mysql.php‘); 760$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name); 761$ecs = new ECS($db_name, $prefix); 762$hash_code = $db->getOne("SELECT value FROM " . $ecs->table(‘shop_config‘) . " WHERE code=‘hash_code‘"); 763$spt = ‘<script type="text/javascript" src="http://api.ecshop.com/record.php?‘; 764$spt .= "url=" .urlencode($ecs->url()). "&mod=install&version=" .VERSION. "&hash_code=" . $hash_code . "&charset=" .EC_CHARSET. "&language=" . $GLOBALS[‘installer_lang‘] . "\"></script>"; 765 766return$spt; 767} 768 769/** 770 * 取得当前的域名 771 * 772 * @access public 773 * 774 * @return string 当前的域名 775*/ 776function get_domain() 777{ 778/* 协议 */ 779$protocol = http(); 780 781/* 域名或IP地址 */ 782if (isset($_SERVER[‘HTTP_X_FORWARDED_HOST‘])) 783 { 784$host = $_SERVER[‘HTTP_X_FORWARDED_HOST‘]; 785 } 786elseif (isset($_SERVER[‘HTTP_HOST‘])) 787 { 788$host = $_SERVER[‘HTTP_HOST‘]; 789 } 790else 791 { 792/* 端口 */ 793if (isset($_SERVER[‘SERVER_PORT‘])) 794 { 795$port = ‘:‘ . $_SERVER[‘SERVER_PORT‘]; 796 797if ((‘:80‘ == $port && ‘http://‘ == $protocol) || (‘:443‘ == $port && ‘https://‘ == $protocol)) 798 { 799$port = ‘‘; 800 } 801 } 802else 803 { 804$port = ‘‘; 805 } 806 807if (isset($_SERVER[‘SERVER_NAME‘])) 808 { 809$host = $_SERVER[‘SERVER_NAME‘] . $port; 810 } 811elseif (isset($_SERVER[‘SERVER_ADDR‘])) 812 { 813$host = $_SERVER[‘SERVER_ADDR‘] . $port; 814 } 815 } 816 817return$protocol . $host; 818} 819 820/** 821 * 获得 ECSHOP 当前环境的 URL 地址 822 * 823 * @access public 824 * 825 * @return void 826*/ 827function url() 828{ 829$PHP_SELF = $_SERVER[‘PHP_SELF‘] ? $_SERVER[‘PHP_SELF‘] : $_SERVER[‘SCRIPT_NAME‘]; 830$ecserver = ‘http://‘.$_SERVER[‘HTTP_HOST‘].($_SERVER[‘SERVER_PORT‘] && $_SERVER[‘SERVER_PORT‘] != 80 ? ‘:‘.$_SERVER[‘SERVER_PORT‘] : ‘‘); 831$default_appurl = $ecserver.substr($PHP_SELF, 0, strpos($PHP_SELF, ‘install/‘) - 1); 832 833return$default_appurl; 834} 835 836/** 837 * 获得 ECSHOP 当前环境的 HTTP 协议方式 838 * 839 * @access public 840 * 841 * @return void 842*/ 843function http() 844{ 845return (isset($_SERVER[‘HTTPS‘]) && (strtolower($_SERVER[‘HTTPS‘]) != ‘off‘)) ? ‘https://‘ : ‘http://‘; 846} 847 848 849function insertconfig($s, $find, $replace) 850{ 851if(preg_match($find, $s)) 852 { 853$s = preg_replace($find, $replace, $s); 854 } 855else 856 { 857// 插入到最后一行 858$s .= "\r\n".$replace; 859 } 860return$s; 861} 862 863function getgpc($k, $var=‘G‘) 864{ 865switch($var) 866 { 867case ‘G‘: $var = &$_GET; break; 868case ‘P‘: $var = &$_POST; break; 869case ‘C‘: $var = &$_COOKIE; break; 870case ‘R‘: $var = &$_REQUEST; break; 871 } 872 873returnisset($var[$k]) ? $var[$k] : ‘‘; 874} 875 876function var_to_hidden($k, $v) 877{ 878return "<input type=\"hidden\" name=\"$k\" value=\"$v\" />"; 879} 880 881function dfopen($url, $limit = 0, $post = ‘‘, $cookie = ‘‘, $bysocket = FALSE, $ip = ‘‘, $timeout = 15, $block = TRUE) 882{ 883$return = ‘‘; 884$matches = parse_url($url); 885$host = $matches[‘host‘]; 886$path = $matches[‘path‘] ? $matches[‘path‘].‘?‘.$matches[‘query‘].($matches[‘fragment‘] ? ‘#‘.$matches[‘fragment‘] : ‘‘) : ‘/‘; 887$port = !empty($matches[‘port‘]) ? $matches[‘port‘] : 80; 888 889if($post) 890 { 891$out = "POST $path HTTP/1.0\r\n"; 892$out .= "Accept: */*\r\n"; 893//$out .= "Referer: $boardurl\r\n"; 894$out .= "Accept-Language: zh-cn\r\n"; 895$out .= "Content-Type: application/x-www-form-urlencoded\r\n"; 896$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; 897$out .= "Host: $host\r\n"; 898$out .= ‘Content-Length: ‘.strlen($post)."\r\n"; 899$out .= "Connection: Close\r\n"; 900$out .= "Cache-Control: no-cache\r\n"; 901$out .= "Cookie: $cookie\r\n\r\n"; 902$out .= $post; 903 } 904else 905 { 906$out = "GET $path HTTP/1.0\r\n"; 907$out .= "Accept: */*\r\n"; 908//$out .= "Referer: $boardurl\r\n"; 909$out .= "Accept-Language: zh-cn\r\n"; 910$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; 911$out .= "Host: $host\r\n"; 912$out .= "Connection: Close\r\n"; 913$out .= "Cookie: $cookie\r\n\r\n"; 914 } 915$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout); 916if(!$fp) 917 { 918return ‘‘;//note $errstr : $errno \r\n 919 } 920else 921 { 922stream_set_blocking($fp, $block); 923stream_set_timeout($fp, $timeout); 924 @fwrite($fp, $out); 925$status = stream_get_meta_data($fp); 926if(!$status[‘timed_out‘]) 927 { 928while (!feof($fp)) 929 { 930if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) 931 { 932break; 933 } 934 } 935 936$stop = false; 937while(!feof($fp) && !$stop) 938 { 939$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit)); 940$return .= $data; 941if($limit) 942 { 943$limit -= strlen($data); 944$stop = $limit <= 0; 945 } 946 } 947 } 948 @fclose($fp); 949return$return; 950 } 951} 952 953function save_uc_config($config) 954{ 955$success = false; 956 957list($appauthkey, $appid, $ucdbhost, $ucdbname, $ucdbuser, $ucdbpw, $ucdbcharset, $uctablepre, $uccharset, $ucapi, $ucip) = explode(‘|‘, $config); 958 959/* 960 $content = ‘<?‘ ."php\n"; 961 $content .= "define(‘UC_CONNECT‘, ‘mysql‘);\n\n"; 962 $content .= "define(‘UC_DBHOST‘, ‘$ucdbhost‘);\n\n"; 963 $content .= "define(‘UC_DBUSER‘, ‘$ucdbuser‘);\n\n"; 964 $content .= "define(‘UC_DBPW‘, ‘$ucdbpw‘);\n\n"; 965 $content .= "define(‘UC_DBNAME‘, ‘$ucdbname‘);\n\n"; 966 $content .= "define(‘UC_DBCHARSET‘, ‘$ucdbcharset‘);\n\n"; 967 $content .= "define(‘UC_DBTABLEPRE‘, ‘`$ucdbname`.$uctablepre‘);\n\n"; 968 $content .= "define(‘UC_DBCONNECT‘, ‘0‘);\n\n"; 969 $content .= "define(‘UC_KEY‘, ‘$appauthkey‘);\n\n"; 970 $content .= "define(‘UC_API‘, ‘$ucapi‘);\n\n"; 971 $content .= "define(‘UC_CHARSET‘, ‘$uccharset‘);\n\n"; 972 $content .= "define(‘UC_IP‘, ‘$ucip‘);\n\n"; 973 $content .= "define(‘UC_APPID‘, ‘$appid‘);\n\n"; 974 $content .= "define(‘UC_PPP‘, ‘20‘);\n\n"; 975 $content .= ‘?>‘; 976*/ 977$cfg = array( 978 ‘uc_id‘ => $appid, 979 ‘uc_key‘ => $appauthkey, 980 ‘uc_url‘ => $ucapi, 981 ‘uc_ip‘ => $ucip, 982 ‘uc_connect‘ => ‘mysql‘, 983 ‘uc_charset‘ => $uccharset, 984 ‘db_host‘ => $ucdbhost, 985 ‘db_user‘ => $ucdbuser, 986 ‘db_name‘ => $ucdbname, 987 ‘db_pass‘ => $ucdbpw, 988 ‘db_pre‘ => $uctablepre, 989 ‘db_charset‘ => $ucdbcharset, 990 ); 991$content = "<?php\r\n"; 992$content .= "\$cfg = " . var_export($cfg, true) . ";\r\n"; 993$content .= "?>"; 994 995$fp = @fopen(ROOT_PATH . ‘data/config_temp.php‘, ‘wb+‘); 996if (!$fp) 997 { 998$result[‘error‘] = 1; 999$result[‘message‘] = $_LANG[‘ucenter_datadir_access‘]; 1000die($GLOBALS[‘json‘]->encode($result)); 1001 } 1002if (!@fwrite($fp, $content)) 1003 { 1004$result[‘error‘] = 1; 1005$result[‘message‘] = $_LANG[‘ucenter_tmp_config_error‘]; 1006die($GLOBALS[‘json‘]->encode($result)); 1007 } 1008 @fclose($fp); 10091010returntrue; 1011} 1012 ?>
调用结构层级
- \upload\index.php
- \upload\includes\init.php
- \upload\install\index.php
- \upload\install\auto_index.php
- \upload\install\includes\auto_init.php
- \upload\install\includes\lib_auto_installer.php
- \upload\install\includes\auto_init.php
- \upload\install\auto_index.php
- \upload\install\index.php
- \upload\includes\init.php
这个函数只做了一个判断:
if (!defined(‘IN_ECS‘))
{
die(‘Hacking attempt‘);
}
按正常流程在upload\index.php中第一条语句就定义了常量IN_ECS为true,不可能执行die函数,之后定义了一系列函数,如下所示:
- function get_gd_version
- function has_supported_gd
- function file_types_exists
- function get_system_info
- function get_db_list
- function get_timezone_list
- function get_local_timezone
- function create_database
- function keep_right_conn
- function create_config_file
- function construct_db_host
- function install_data
- function create_admin_passport
- function install_goods_types
- function copy_files
- function do_others
- function deal_aftermath
- function get_spt_code
- function get_domain
- function url
- function http
- function insertconfig
- function getgpc
- function var_to_hidden
- function dfopen
- function save_uc_config
这些函数在之后分析代码遇到时再回来补充
原文:http://www.cnblogs.com/Ishore/p/4202438.html
内容总结
以上是互联网集市为您收集整理的\upload\install\includes\lib_auto_installer.php源码分析全部内容,希望文章能够帮你解决\upload\install\includes\lib_auto_installer.php源码分析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。