$val) { $string[$key] = sqlEncode($val); } } else { $string = addslashes($string); } return $string; } //去掉SQL编码 function sqlDecode($string) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = sqlDecode($val); } } else { $string = stripslashes($string); } return $string; } //将对象全部转换成数组 function deObject2Array($obj){ if(gettype($obj) == object) $obj = get_object_vars($obj); if(count($obj) > 0) { foreach($obj as $k=>$v){ if(gettype($v) == object){ $obj[$k] = deObject2Array($v); } } } return $obj; } //HTML代码编码 function htmlEncode($string) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = shtmlspecialchars($val); } } else { $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1', str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string)); } return $string; } function myjson_encode($code){ $code = json_encode($code); return preg_replace("#\\\u([0-9a-f]{4,4})#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $code); } function myjson_decode($code){ $code = json_decode($code); return preg_replace("#\\\u([0-9a-f]{4,4})#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $code); } //获取文件内容 function getFile($filename,$clearBOM=1){ $content = ''; if(function_exists('file_get_contents')) { @$content = file_get_contents($filename); } else { if(@$fp = fopen($filename, 'r')) { @$content = fread($fp, filesize($filename)); @fclose($fp); } } //清除BOM信息 if($clearBOM==1){ $charset[1]=substr($content, 0, 1); $charset[2]=substr($content, 1, 1); $charset[3]=substr($content, 2, 1); if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191) { $content=substr($content,3); } } return $content; } //写入文件 function setFile($filename, $writetext, $openmod='w') { if(@$fp = fopen($filename, $openmod)) { flock($fp, 2); fwrite($fp, $writetext); fclose($fp); return true; } else { return false; } } //字符串解密加密 function aen($string, $operation = 'DECODE', $key = '', $expiry = 0) { $ckey_length = 4; // 随机密钥长度 取值 0-32; // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。 // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方 // 当此值为 0 时,则不产生随机密钥 $key = md5($key ? $key : 'IAmCiNiao!!!'); $keya = md5(substr($key, 0, 16)); $keyb = md5(substr($key, 16, 16)); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { return $keyc.str_replace('=', '', base64_encode($result)); } } //抓取数据方法封装 /* $url : 抓取的url路径 $postArray : POST的数据,默认为空 $con : 更多设置,array(CURLOPT_COOKIE=>'cookname=cookval&cn2=cv2') */ function getHttpPage($url,$postArray='',$con=''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_TIMEOUT, 10000); //超时时间(秒) if(is_array($postArray)){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$postArray); } if(is_array($con)){ foreach($con as $key => $value){ curl_setopt($ch,$key,$value); } } $html = curl_exec($ch); curl_close($ch); return $html; } //检查邮箱是否有效 function isEmail($email) { return strlen($email) > 6 && preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $email); } //当前时间 function now(){ return date("Y-m-d H:i:s"); } /* 取字符串左右 left('abcde',-1) = abcd */ function left($str,$len){ if((int)$len>0){ return mb_substr($str,0,$len,'utf8'); }else{ return mb_substr($str,0,len($str)+$len,'utf8'); } } function right($str,$len){ if($len>0){ return mb_substr($str,len($str)-$len,len($str),'utf8'); }else{ return mb_substr($str,abs($len),len($str),'utf8'); } } function len($str){ return mb_strlen($str,'utf8'); } /* 字符串查找,同JS中的indexOf 未找到返回 -1 (被查找的字符串,要查找的,从前还是后:默认前) */ function indexOf($str,$find,$rev=0){ if($rev==0){ $res=stripos($str,$find); }else{ $res=strripos($str,$find); } if(isn($res)){ return -1; }else{ return $res; } } //跳转到指定页面 function jsgoto($url){ header("refresh:0;url=$url"); echo ""; } //判断是否为空值 function isn($str){ if(is_array($str)){ return 0; } if(is_null($str) || strlen($str)==0){ return 1; }else{ return 0; } } //获取客户端IP function getip(){ 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']; } return $onlineip; } //是否数字简写 function isNum($str){ $isnum = 0; if(is_numeric($str)) $isnum = 1; return $isnum; } //替代die函数 function we($str){ @DB::closeall(); if(gettype($str)=='string'){ echo $str; }else{ print_r($str); } exit; } //Request方法简写 function rq($name){ return $_GET[$name]; } function rf($name){ return $_POST[$name]; } function r($name){ return $_REQUEST[$name]; } function _rq($name){ return sqlDecode(rq($name)); } function _rf($name){ return sqlDecode(rf($name)); } function _r($name){ return sqlDecode(r($name)); } //获取当前周的第一天的日期时间戳 function getWeekStartTime($date){ $ntime=strtotime($date); $week = date('W',$ntime); $dayNum = 0; for($i = 1;$i<8;$i++){ $difTime = date('W',strtotime(date("Ymd",$ntime))-(60*60*24*$i)); if($week == $difTime) $dayNum++; } $weekStart = strtotime(date("Ymd",$ntime))-(60*60*24*$dayNum); return $weekStart; } //时间相加 function dateAdd($unit = "d",$int,$date) { $date_time_array = getdate(strtotime($date)); $hours = $date_time_array["hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array["seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"] ; $year = $date_time_array["year"] ; switch ($unit) { case "yyyy": $year +=$int; break; case "q": $month +=($int*3); break; case "m": $month +=$int; break; case "y": $day+=$int; break; case "d": $day+=$int; break; case "w": $day+=$int; break; case "ww": $day+=($int*7); break; case "h": $hours+=$int; break; case "n": $minutes+=$int; break; case "s": $seconds+=$int; break; } $timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year); return date("Y-m-d H:i:s",$timestamp); } ##SQL语句类 class DB{ public static $conns = array(); /* 取得数据库连接资源 从serverconfig中载入$_CONFIG['db']配置项 */ public function getconnG(){ global $_CONFIG; return self::conndb($_CONFIG['db']); } /* 连接数据库,配置文件格式 array( 'ip'=>'localhost', #数据库服务器IP 'username'=>'root', #用户名 'pwd'=>'root', #密码 'database'=>'game3', #数据库名 'charset'=>'utf8', #默认编码 ) */ public function conndb($dbconf){ $key = $dbconf['database'] .'_'. $dbconf['username'] .'_'. $dbconf['pwd']; if(self::$conns[$key]){ return self::$conns[$key]; } $conn = @mysql_connect($dbconf['ip'].($dbconf['port'] && $dbconf['port']!=''?':'.$dbconf['port']:''), $dbconf['username'], $dbconf['pwd']); if(!$conn)self::error("数据库服务器连接超时"); $db = @mysql_select_db($dbconf['database'],$conn); if(!$db)self::error("{$dbconf['database']}读取错误"); mysql_query("SET NAMES '".$dbconf['charset']."'",$conn); self::$conns[$key]=$conn; return $conn; } /*关闭数据库*/ public function closeall(){ foreach(self::$conns as $key=>$val){ @mysql_close($val); @mysql_free_result(); self::$conns = array(); } } /*返回数据库记录集*/ public function exe($sql){ if($sql=='') self::error('exe时SQL语句必须存在'); $conn = self::getconnG(); $res = @mysql_query($sql,$conn); if(mysql_error($conn)) self::error(); return $res; unset($res,$conn); } /* 事务方式执行SQL语句,sql可以是字符串或数组 多条SQL语句以 ; 号切分,语句中不得含有;号 */ public function exesql($sql,$count=false){ if(isn($sql)) self::error('EXESQL时SQL语句必须存在'); global $exesqlCount; $errnum = 0; $errorTxt = ''; $exesqlCount = array(); if(is_array($sql)){ $sql = implode($sql,';'); } $sqlArr = split (';',$sql); $conn = self::getconnG(); mysql_query('BEGIN',$conn); #开启事务 foreach ($sqlArr as $sqltxt) { $sqltxt = trim($sqltxt); if($sqltxt=='') continue; $res = mysql_query($sqltxt,$conn); if(mysql_error($conn)){ $errnum++; #SQL语句有误 $errorTxt .= mysql_error($conn) . "\r\n"; }else{ if(!$count) continue; #根据SQL语句,增加记录值 if(strtoupper(left($sqltxt,6))=="SELECT"){ array_push($exesqlCount,mysql_num_rows($res)); }else if(strtoupper(left($sqltxt,6))=="INSERT"){ array_push($exesqlCount,mysql_insert_id()); }else{ array_push($exesqlCount,mysql_affected_rows()); } } } if($errnum>0){ #回滚数据 mysql_query("ROLLBACK",$conn); self::error($errorTxt); return false; }else{ mysql_query("COMMIT",$conn); return true; } unset($sqlArr,$conn,$res,$errorTxt,$errnum); } /*记录集转数组*/ public function getrow($rs,$fmttype=1){ $conf=array(MYSQL_NUM,MYSQL_ASSOC,MYSQL_BOTH); $res = mysql_fetch_array($rs,$conf[$fmttype]); if(is_array($res))$res = array_change_key_case($res); return $res; unset($res,$conf); } /*取sql语句第一行第一列的值*/ public function getval($sql){ $res = self::getrow(self::exe($sql),0); if(!is_array($res)){ return ''; }else{ return $res[0]; } unset($res); } /* 取SQL语句结果数组 indexkey为结果数组的key用数据库的哪个列 */ public function getarray($sql,$indexkey=''){ $res = array(); $sqlres = self::exe($sql); while($row=self::getrow($sqlres)){ if($indexkey==''){ $res[] = $row; }else{ $res[$row[$indexkey]] = $row; } } return $res; unset($res,$sqlres,$row); } /* 取SQL语句结果数组的第一条记录 */ public function getone($sql){ $res = self::getarray($sql); if(count($res)==0){ return array(); }else{ return $res[0]; } unset($res); } /* 处理所有出错信息 $errMsg自定义的出错信息 */ public function error($errMsg=''){ if ($errMsg == "") { $m = "mysql error:\r\n
"; $m .= mysql_errno() . ":" . mysql_error () . "\r\n
"; $m .= 'URL:'.$_SERVER["REQUEST_URI"]; echo $m; }else{ $m .= "mysql error:\r\n
"; $m .= $errMsg . "\r\n
"; $m .= 'URL:'.$_SERVER["REQUEST_URI"]; echo $m; } $log="=====================================\r\n
"; $log .= date("Y-m-d H:i:s")."\r\n
"; $log .= $m ."\r\n
"; echo $log; //@file_put_contents("game/log/database.log",$log,FILE_APPEND); unset($m); exit(); } /* 更新SQL语句 $tablename 表名 $param 更新数据,字符串或array $where 更新条件 返回SQL语句 */ public function update($tablename,$param,$where=''){ if(!is_array($param)){ self::error("UPDATE语句错误:param类型不符"); } $paramArr=array(); foreach($param as $key => $val){ if(is_array($val)){ array_push($paramArr,"`$key`=".$val[0]); }else{ array_push($paramArr,"`$key`='".addslashes($val)."'"); } } $param = implode(',',$paramArr); unset($paramArr,$key,$val); return 'UPDATE `'.strtolower(trim($tablename)) .'` SET '. $param . ($where ? ' WHERE ' . $where : ''); } /* 插入SQL语句 $tablename 表名 $param 插入数据array 返回SQL语句 */ public function insert($tablename,$param){ if(!is_array($param)){ self::error("INSERT语句错误:param类型不符"); } $paramArr=array(); foreach($param as $key => $val){ array_push($paramArr,"`$key`='".addslashes($val)."'"); } $param = implode(',',$paramArr); unset($paramArr,$key,$val); return 'INSERT INTO `'.strtolower(trim($tablename)) .'` SET '. $param; } /* 删除SQL语句 $tablename 表名 $where 删除条件 返回SQL语句 */ public function delete($tablename,$where=''){ if (!$where) { self::error("删除函数必须指定条件"); return 0; } return 'DELETE FROM `' . $tablename . '` WHERE ' . $where; } /* 查询SQL语句 $fields 字段 $tablename 表名 $where 条件 $orderby 排序 $limit 记录条数 返回SQL语句 */ public function select($fields,$tablename,$where='',$orderby='',$limit=''){ $sql = 'SELECT ' . $fields . ' FROM `' . $tablename .'`' . ($where ? ' WHERE ' . $where : '') . ($orderby ? ' ORDER BY ' . $orderby . ' ':'') . ($limit ? ' limit ' . $limit : ''); return $sql; unset($sql); } } ##MEMCACHE类 class CACHE{ public static $conns = array(); #根据配置文件,取连接资源 function getconnG(){ global $_CONFIG; return self::connCache($_CONFIG['memcache']); } #连接到memcache public function connCache($dbconf){ $key = $dbconf['ip'] .'.'. $dbconf['port']; if(self::$conns[$key]){ return self::$conns[$key]; } $conn = memcache_pconnect($dbconf['ip'], $dbconf['port']); //采用持久连接 //$conn = memcache_connect($dbconf['ip'], $dbconf['port']); self::$conns[$key]=$conn; return $conn; } #设置缓存内容 public function set($key,$val,$timeout=0){ return memcache_set(self::getconnG(),$key,$val,0,$timeout);#timeout秒后超时 } #读取缓存内容 public function get($key){ return memcache_get(self::getconnG(),$key); } #删除指定key缓存 public function del($key,$delay=0){ return memcache_delete(self::getconnG(),$key,$delay); #delay秒后删除 } #删除所有缓存 public function delall(){ memcache_flush(self::getconnG()); } #关闭连接 public function close(){ @memcache_close(self::getconnG()); } } ##游戏SESSIOON类 class SESS{ public static $init = 0; public static $preKey = 'CiNiAoSeSs'; #初始化session public function initSession(){ if(self::$init==1) return; global $_CONFIG; #加载配置文件,将session保存到memecahe header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); //ini_set("session.save_handler","memcache"); //ini_set("session.save_path",$_CONFIG['memcache']['ip'].":".$_CONFIG['memcache']['port']); ini_set('session.gc_maxlifetime',86400*7); /*可以修改为使用文件方式保存session ini_set("session.save_handler","files"); session_save_path( "session/"); */ session_start(); self::$init = 1; } #读取session public function get($key){ self::initSession(); return $_SESSION[self::$preKey.$key]; } #设置session public function set($key,$val){ self::initSession(); $_SESSION[self::$preKey.$key] = $val; } #删除指定session public function del($key){ self::initSession(); unset($_SESSION[self::$preKey.$key]); } #删除所有session public function delall(){ self::initSession(); session_destroy(); } } ?>