diff --git a/application/install/controller/Index.php b/application/install/controller/Index.php index 0f44caabdc1b6c24aaeed4f8f5fbb5f1ef83130f..daf2a6b533307fd989b471db4d5699d71052cefd 100644 --- a/application/install/controller/Index.php +++ b/application/install/controller/Index.php @@ -63,6 +63,7 @@ class Index extends Common public function Index() { $this->IsInstall(); + new \base\Behavior(['msg'=>'协议阅读']); return $this->fetch(); } @@ -77,6 +78,7 @@ class Index extends Common public function Check() { $this->IsInstall(); + new \base\Behavior(['msg'=>'环境检测']); return $this->fetch(); } @@ -91,6 +93,7 @@ class Index extends Common public function Create() { $this->IsInstall(); + new \base\Behavior(['msg'=>'数据信息填写']); return $this->fetch(); } @@ -104,6 +107,15 @@ class Index extends Common */ public function Successful() { + // 检测是否是新安装 + if(is_dir(ROOT.'public/install') && !file_exists(ROOT.'public/install/install.lock')) + { + if(empty($_GET['s']) || stripos($_GET['s'], 'install') === false) + { + $url = __MY_URL__.'index.php?s=/install/index/index'; + exit(header('location:'.$url)); + } + } return $this->fetch(); } @@ -122,6 +134,7 @@ class Index extends Common $ret = $this->ParamsCheck($params); if($ret['code'] != 0) { + new \base\Behavior(['msg'=>'参数校验['.json_encode($ret).']']); return $ret; } @@ -130,7 +143,8 @@ class Index extends Common { if(!is_writable(ROOT.'config/database.php')) { - return DataReturn('配置文件没有权限', -1); + new \base\Behavior(['msg'=>'配置文件没有权限[./config/database.php'.']']); + return DataReturn('配置文件没有权限[./config/database.php'.']', -1); } } @@ -138,6 +152,7 @@ class Index extends Common $db = $this->DbObj($params); if(!is_object($db)) { + new \base\Behavior(['msg'=>'数据库连接失败']); return DataReturn('数据库连接失败', -1); } @@ -155,6 +170,7 @@ class Index extends Common { $db = $this->DbObj($params, $params['DB_NAME']); } else { + new \base\Behavior(['msg'=>'数据库创建失败']); return DataReturn('数据库创建失败', -1); } } else { @@ -162,6 +178,7 @@ class Index extends Common } if(!is_object($db)) { + new \base\Behavior(['msg'=>'数据库连接失败']); return DataReturn('数据库连接失败', -1); } @@ -259,8 +276,11 @@ return [ php; if(@file_put_contents(ROOT.'config/database.php', $db_str) === false) { + new \base\Behavior(['msg'=>'配置文件创建失败']); return DataReturn('配置文件创建失败', -1); } + + new \base\Behavior(['msg'=>'安装成功']); return DataReturn('安装成功', 0); } @@ -277,6 +297,7 @@ php; { if(!file_exists(ROOT.'public/install/shopxo.sql')) { + new \base\Behavior(['msg'=>'数据库sql文件不存在']); return DataReturn('数据库sql文件不存在', -1); } @@ -313,6 +334,7 @@ php; 'success' => $success, 'failure' => $failure, ]; + new \base\Behavior(['msg'=>'sql运行 成功['.$success.']条, 失败['.$failure.']条']); if($failure > 0) { return DataReturn('sql运行失败['.$failure.']条', -1); @@ -337,10 +359,12 @@ php; $data = $db->query("select version() AS version"); if(empty($data[0]['version'])) { + new \base\Behavior(['msg'=>'查询数据库版本失败']); return DataReturn('查询数据库版本失败', -1); } else { if($data[0]['version'] < 5.0) { + new \base\Behavior(['msg'=>'数据库版本过低', 'mysql_version'=>$data[0]['version']]); return DataReturn('数据库版本过低', -1); } } @@ -359,8 +383,8 @@ php; */ private function DbNameCreate($db, $db_name) { - $sql = "CREATE DATABASE IF NOT EXISTS {$db_name} DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci"; - if($db->query($sql) !== false) + $sql = "CREATE DATABASE {$db_name} DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci"; + if($db->execute($sql) !== false) { return $this->IsDbExist($db, $db_name); } diff --git a/application/install/view/index/check.html b/application/install/view/index/check.html index 6ea4dbcf5ca3295bb79f23bb53cf4a516149b2ed..f0981e6be247fe4f3331cf958b1977818cb8bf33 100644 --- a/application/install/view/index/check.html +++ b/application/install/view/index/check.html @@ -251,24 +251,6 @@ - - mysqli_connect 函数 - 支持 - - - 支持 - - 不支持 - - - - - √ - - × - - - file_get_contents 函数 支持 @@ -395,6 +377,24 @@ + + pdo 类 + 支持 + + + 支持 + + 不支持 + + + + + √ + + × + + + ZipArchive 类 支持 diff --git a/extend/base/Behavior.php b/extend/base/Behavior.php new file mode 100755 index 0000000000000000000000000000000000000000..a0b0c555932e47ca604c93b24625df72d084fcf1 --- /dev/null +++ b/extend/base/Behavior.php @@ -0,0 +1,415 @@ + $this->GetUserCookie(), + 'host' => $this->GetUrl('host'), + 'server_port' => $this->GetServerPort(), + 'server_ip' => $this->GetServerIP(), + 'url' => $this->GetUrl('url'), + 'request_url' => $this->GetUrl('request'), + 'source_url' => $this->GetSourceUrl(), + 'client_ip' => $this->GetClientIP(), + 'os' => $this->GetOs(), + 'browser' => $this->GetBrowser(), + 'method' => $this->GetMethod(), + 'scheme' => $this->GetScheme(), + 'version' => $this->GetHttpVersion(), + 'client' => $this->GetClinet(), + 'php_os' => PHP_OS, + 'php_version' => PHP_VERSION, + 'php_sapi_name' => php_sapi_name(), + 'client_date' => date('Y-m-d H:i:s'), + 'ymd' => date('Ymd'), + 'ver' => str_replace('v', '', APPLICATION_VERSION), + ); + + // 描述信息 + if(!empty($param['msg'])) + { + $data['msg'] = $param['msg']; + } + + // mysql版本 + if(!empty($param['mysql_version'])) + { + $data['mysql_version'] = $param['mysql_version']; + } + + // 上报数据 + $url = 'http://report.shopxo.net/install.php'; + if(function_exists('curl_init')) + { + $this->CurlPost($url, $data); + } else { + $this->FsockopenPost($url, $data); + } + } + + /** + * [CurlPost curl post] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2016-12-03T21:58:54+0800 + * @param [string] $url [请求地址] + * @param [array] $post [发送的post数据] + */ + private function CurlPost($url, $post) + { + $options = array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => false, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $post, + ); + + $ch = curl_init($url); + curl_setopt_array($ch, $options); + + $result = curl_exec($ch); + curl_close($ch); + + return $result; + } + + /** + * [FsockopenPost fsockopen方式] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2016-12-03T21:58:54+0800 + * @param [string] $url [url地址] + * @param [string] $data [发送参数] + */ + private function FsockopenPost($url, $data = '') + { + $row = parse_url($url); + $host = $row['host']; + $port = isset($row['port']) ? $row['port'] : 80; + $file = $row['path']; + $post = ''; + while (list($k,$v) = each($data)) + { + if(isset($k) && isset($v)) $post .= rawurlencode($k)."=".rawurlencode($v)."&"; //转URL标准码 + } + $post = substr( $post , 0 , -1 ); + $len = strlen($post); + $fp = @fsockopen( $host ,$port, $errno, $errstr, 10); + if (!$fp) { + return "$errstr ($errno)\n"; + } else { + $receive = ''; + $out = "POST $file HTTP/1.0\r\n"; + $out .= "Host: $host\r\n"; + $out .= "Content-type: application/x-www-form-urlencoded\r\n"; + $out .= "Connection: Close\r\n"; + $out .= "Content-Length: $len\r\n\r\n"; + $out .= $post; + fwrite($fp, $out); + while (!feof($fp)) { + $receive .= fgets($fp, 128); + } + fclose($fp); + $receive = explode("\r\n\r\n",$receive); + unset($receive[0]); + return implode("",$receive); + } + } + + /** + * [GetScheme http类型] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:04:33+0800 + */ + private function GetScheme() + { + return empty($_SERVER['HTTPS']) ? 'HTTP' : 'HTTPS'; + } + + /** + * [GetClinet 客户端] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:04:56+0800 + */ + private function GetClinet() + { + return empty($_SERVER['HTTP_USER_AGENT']) ? '' : $_SERVER['HTTP_USER_AGENT']; + } + + /** + * [GetHttpVersion http版本] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:04:43+0800 + */ + private function GetHttpVersion() + { + return empty($_SERVER['SERVER_PROTOCOL']) ? '' : str_replace(array('HTTP/', 'HTTPS/'), '', $_SERVER['SERVER_PROTOCOL']); + } + + /** + * [GetMethod 请求类型] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:04:23+0800 + */ + private function GetMethod() + { + return empty($_SERVER['REQUEST_METHOD']) ? '' : $_SERVER['REQUEST_METHOD']; + } + + /** + * [GetOs 用户操作系统] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:02:06+0800 + */ + private function GetOs() + { + if(!empty($_SERVER['HTTP_USER_AGENT'])) + { + $os = $_SERVER['HTTP_USER_AGENT']; + if(preg_match('/win/i', $os)) + { + $os = 'Windows'; + } elseif (preg_match('/mac/i',$os)) + { + $os = 'MAC'; + } elseif (preg_match('/linux/i', $os)) + { + $os = 'Linux'; + } elseif (preg_match('/unix/i', $os)) + { + $os = 'Unix'; + } elseif (preg_match('/bsd/i', $os)) + { + $os = 'BSD'; + } elseif (preg_match('/iphone/i', $os)) + { + $os = 'iPhone'; + } elseif (preg_match('/android/i', $os)) + { + $os = 'Android'; + } else { + $os = 'Other'; + } + return $os; + } + return 'unknown'; + } + + /** + * [GetBrowser 用户浏览器] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:03:14+0800 + */ + private function GetBrowser() + { + if(!empty($_SERVER['HTTP_USER_AGENT'])) + { + $br = $_SERVER['HTTP_USER_AGENT']; + if(preg_match('/MSIE/i', $br)) + { + $br = 'MSIE'; + } elseif(preg_match('/Firefox/i', $br)) + { + $br = 'Firefox'; + } elseif(preg_match('/Chrome/i', $br)) + { + $br = 'Chrome'; + } elseif(preg_match('/Safari/i', $br)) + { + $br = 'Safari'; + } elseif (preg_match('/Opera/i', $br)) + { + $br = 'Opera'; + } else { + $br = 'Other'; + } + return $br; + } + return 'unknown'; + } + + /** + * [GetUrl 获取url地址] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:29:03+0800 + * @param [string] $type [host:host地址, url:url地址, request:完整url地址] + */ + private function GetUrl($type = 'url') + { + // 当前host + $host = empty($_SERVER['HTTP_HOST']) ? '' : $_SERVER['HTTP_HOST']; + + // 是否获取host + if($type == 'host') + { + return $host; + } + + // http类型 + $http = empty($_SERVER['HTTPS']) ? 'http' : 'https'; + + // 根目录 + if(!empty($_SERVER['SCRIPT_NAME'])) + { + $root = substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/')+1); + } else { + if(!empty($_SERVER['PHP_SELF'])) + { + $root = substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')+1); + } + } + + // url 或 request + if($type == 'url') + { + return $http.'://'.$host.$root; + } else { + if(!empty($_SERVER['REQUEST_URI'])) + { + return $http.'://'.$host.$_SERVER['REQUEST_URI']; + } + } + } + + /** + * [GetServerIP 获取服务器ip] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:34:24+0800 + */ + private function GetServerIP() + { + return empty($_SERVER['SERVER_ADDR']) ? '' : $_SERVER['SERVER_ADDR']; + } + + /** + * [GetServerPort 获取当前web端口] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:35:42+0800 + */ + private function GetServerPort() + { + return empty($_SERVER['SERVER_PORT']) ? 80 : $_SERVER['SERVER_PORT']; + } + + /** + * [GetClientIP 获取用户ip] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T16:00:10+0800 + * @param [boolean] $long [是否转换成整数] + */ + function GetClientIP($long = false) + { + $onlineip = ''; + if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')) + { + $onlineip = getenv('HTTP_CLIENT_IP'); + } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) + { + $onlineip = getenv('HTTP_X_FORWARDED_FOR'); + } elseif(getenv('REMOTE_ADDR' ) && strcasecmp(getenv('REMOTE_ADDR'),'unknown')) + { + $onlineip = getenv('REMOTE_ADDR'); + } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')) + { + $onlineip = $_SERVER['REMOTE_ADDR']; + } + if($long) + { + $onlineip = sprintf("%u", ip2long($realip)); + } + return $onlineip; + } + + /** + * [GetSourceUrl 获取来源url地址] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T15:57:00+0800 + */ + private function GetSourceUrl() + { + return empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER']; + } + + /** + * [GetUserCookie 获取用户cookieid] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T15:55:12+0800 + */ + private function GetUserCookie() + { + if(!empty($_COOKIE['behavior_user_cookie'])) return $_COOKIE['behavior_user_cookie']; + + $user_cookie = $this->GetUserNumberRand(); + setcookie('behavior_user_cookie', $user_cookie); + return $user_cookie; + } + + /** + * [GetUserNumberRand 生成用户cookie编号] + * @author Devil + * @blog http://gong.gg/ + * @version 0.0.1 + * @datetime 2017-04-11T15:56:14+0800 + */ + private function GetUserNumberRand() + { + $str = date('YmdHis'); + for($i=0; $i<6; $i++) $str .= rand(0, 9); + return $str; + } +} +?> \ No newline at end of file