Thinkphp 代碼
取得客戶端IP位址
取得客戶端IP位址
$type表示回傳類型0 回傳IP位址1 回傳IPV4位址數字
function getclis_punction( = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
))[ {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
含 $. if(false !== $pos) unset($ arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT__ip']) { VER['HTTP_CLIENT_IP'] ;
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDRDR'];
$long = ip2long($ ip); $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); return $ip[$type];}
return $ip[$type];檔案位元組大小格式化 位元組格式化把位元組數格式為B K M G T 所描述的大小function byte_format($size, $dec=2){ $a = "array("f"B" KB", "MB", "GB", "TB", "PB"); $pos = 0; while ($size >= 1024) { $pos++ ; } return round($size,$dec)." ".$a[$pos];}或function getget_size(Bs,$u1){
$us = array('B'=>'K','K'=>'M','M'=>'G','G'=>'T');
return (($u!=='B')&&(!isset($us[$u]))||($s
}
顯示彩虹字串
用於顯示
顯示彩虹字串用來顯示function color_txt($str){ $len = mb_strlen($str); $colorTxt = ''>; $ colorTxt .= ''.mb_substr($str,$i,1,'utf-8').''; }return $colorTxt;}function rand_color(){ return '#'.sprintf("%02X",mt_rand(0,255)).sprintf(Up. "%02X",mt_rand(0,255));} 讓PHP更快的提供文件下載一般來說, 我們可以通過直接讓URLoot讓PHP更快的提供文件下載一般來說, 我們可以通過直接讓URLoot引導使用者下載檔案. 但是, 這樣做, 就沒辦法做一些統計, 權限檢查, 等等的工作. 於是, 很多時候, 我們採用讓PHP來做轉發, 為用戶提供文件下載. $file = "/tmp/dummy.tar.gz"; header("Content-type: application/octet-stream"); 。. ' . basename($file) . '"'); header("Content-Length: ". filesize($file)); readfile($file);
readfile($file);
如果檔案是中文名的話, 有的使用者可能下載後的檔案名稱是亂碼.
於是, 我們做一下修改(參考: :
攙 中文名 = "/mp/$file. tar.gz";
$filename = basename($file); header("Content-type: application/octet-stream"); /〜/處理檔名/< HTTP_USER_AGENT"]; $encoded_filename = urlencode($filename); $encoded_filename = str_replace("+", "%20", $enencoded_filename); ) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); } else if (preg_match("//Firefox", $c/Fi)" Content-Disposition: attachment; filename*="utf8''" . $filename . '"');} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
『 '"'); header("Content-Length: ". filesize($file)); readfile($file); 恩, 現在還有一個問題就是readfile, 雖然PHP的readfile嘗試實現的盡量高效, 不佔用PHP本身的內存, 但是實際上它還是需要採用MMAP(如果支持), 或者是一個固定的buffer去循環讀取文件, 直接輸出. 輸出的時候, 如果是Apache + PHP mod, 那麼還需要發送到Apache的輸出緩衝區. 最後才發送給用戶. 而對於Nginx + fpm如果他們分開部署的話, 那還會帶來額外的網絡IO . 那麼, 能不能不經過PHP這層, 直接讓Webserver直接把文件發送給用戶呢? 今天
我們可以使用Apache的module mod_xsendfile, 讓Apache直接發送這個檔案給使用者:
$file = "/tartmp/name.?php
$file = "/tartmp/name.?php
$file = "/tartmp/name.Sm.name.Sname.Sname.Sname.Sconnname.$base. );
header("Content-type: application/octet-stream");
//處理中文檔名
$ua = $_SERVER"HTTP ) ;
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {🀜〦〼 ="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; 。 attachment; filename="' . basename($file) . '"');
//讓Xsendfile發送檔案
header("X-Sendfile: $file"); Apache處理, 並且把回應的檔案直接傳送給Client.
Lighttpd和Nginx也有類似的模組, 大家有興趣的可以去找找看
Lighttpd和Nginx也有類似的模組, 大家有興趣的可以去找找看 apache環境下面隱藏URL位址中的index.phpRewriteCond %{REQUEST_FILENAME} !-d
(.* )$ index.php/$1 [QSA,PT,L]$last_space = false;
for ($i = 0, $j = count($tokens); $i
if (is_string($tokens[$i])) {$i false;
$stripStr .= $tokens[$i];
} else {
) //過濾各種PHP註解
case T_COMMENT:
case T_DOC_COMMENT:
break; case T_WHITESPACE:
if .= ' ';
$last_space = true;
中斷;
case T_START_HEREDOC: Š case T_ c "
中斷;
$stripStr .= "THINK;n";
for($ k = $ k
if(is_string($tokens[$k]) && 約 $i = $k;
中斷;
($tokens[$k][0] == T_CLOSE_TAG) {}
約 $last_space = false;
$stripStr .= $ $tokens[ $i][1];
}
}
}
🎔檢查字串是否為UTF8編碼
用於判斷某個字串是否採用UTF8編碼
function is_utf8($string){
return preg_match('%^(?:
[x09x0Ax0Dx20-x70 | [ xC2-xDF][ x80-xBF] # 非超長2 位元組
| xE0[xA0-xBF][x80-xBF] # 不包含超長
| xED[x80-x9F][ x80-xBF] # 排除代理
| xF0[x90-xBF][x80-xBF]{2} # 飛機1-3
. # 飛機4-15 | xF4[x80-x8F][x80-xBF]{2} #plane 16 )*$%xs', $string); SS安全過濾來自網絡,用於對字串進行XSS安全過濾。 function remove_xss($val) { // 刪除所有無法列印的字元。 CR(0a) 和LF(0b) 和TAB(9) 是允許的 // 這可以防止某些字元重新間距,例如$search = 'abcdefminxy')>
$搜尋.= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $search .= '1234567890!@#$%^&*()'; . _| '\'; for ($i = 0; $i // ;? 匹配;,這是可選的 // ;? 匹配;,這是可選的 // ;? 匹配;,這是可選的 // ;? 匹配;,這是可選的 // ;? 匹配;,這是可選的 // ;? 7}符合任何填入的零,這是可選的,最多8 個字元 // @ @ 搜尋十六進位值 $val = preg_replace('/([xX]0{0,8 }'.dechex( ord($search[$i])).';?)/i', $search[$i], $val); // 有; // @ @ 0{0, 7} 符合'0 ' 零到七次 $val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i ], $val) ; // 使用; } // 現在剩下的唯一空白攻擊是t、n 和r$ra1 = array('javascript', 'vbscript', '表達式', '小程式', '元', 'xml', '暗示', '連結', '風格', '腳本', '嵌入', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbefeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbefate' ', 'onbounce'、'oncellchange'、'onchange'、'onclick'、'oncontextmenu'、'oncontrolselect'、'oncopy'、'oncut'、'ondataavailable'、'ondatasetchanged'、'ondatasetcomplete'、'ondblclick'、 'ondactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus ', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onmove','onmoveend','onmovestart','onpaste','onpropertychange','onreadystatechange','onreset','onresize ', 'onresizeend'、'onresizestart'、'onrowenter'、'onrowexit'、'onrowsdelete'、'onrowsinserted'、'onscroll'、'onselect'、'onselectionchange'、'onselectstart'、'onstart'、'onstop'、 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2);
$found = true; //只要上引號取代了某些內容,就繼續替換
while ($found == true) {
$val_before = $val;
for ($i = 0; ); $i++) {
$pattern = '/';
for ($j = 0; $j
$pattern .= '(';
$ $pattern .= '|';
$pattern .= '|(�{0,8}([9|10|13]);)';
}
$pattern .= $ra[ $i][$j];
}
$pattern .= '/i';
ra[$i], 2); // 新增超過標籤
$val = preg_replace($pattern, $replacement, $val); // 過濾掉十六進位標籤
if ($val_before == $val) {
// }
}
}
return $val;
}
COOKIE 有效範例
cookie 方法是ThinkPHP 內建的函數,用於完成cookie 的設定、取得和刪除作業。 value'); //設定cookie
cookie('name','value',3600); //指定cookie儲存時間為1小時
進階設定
cookie('name','value',name','value', array('expire'=>3600,'prefix'=>'think_')); // 指定近和遠端
//下面的程式碼和上面
cookie('name','value', 'expire =3600&prefix=think_')
獲取
$value = cookie('name');
Cookie值,可用:cookie('name',null);
若要清空cookie,可用:
cookie(null); // 所有在目前設定前綴的cookie值
cookie(null,'think_'); // 清空指定前綴的所有cookie值
驗證碼不能顯示?通常都是BOM訊息惹的禍此代碼能解決驗證碼不能顯示問題.(批量去除BOM信息的代碼)有時,我們在本地測試環境中需要顯示驗證碼的地方沒有問題,一旦佈置到伺服器上去的時候.需要顯示驗證碼的地方無法顯示?如果你也碰到同樣問題,請往下看.問題的原因大部分是BOM頭信息造成的,通常thinkphp的設定檔都要去除BOM頭資訊.什麼是BOM頭資訊?百度一下就知道啦.我通常的解決辦法是,佈置到伺服器上去之後,新建一個去除所有檔案的BOM頭資訊的程式碼檔案.然後運行之即可.例如:我在伺服器根目錄新建一個delBom.php檔.運行http://www.xxx.com/delBom.php即可.程式碼如下: if ( isset($_GET['dir'])){ //設定檔目錄 $basedir=$_GET['dir']; }else{ $basedir = '.'; auto = 1; checkdir($basedir); function checkdir($basedir){ if ($dh = opendir($basedir)) { if ($dh = opendir($basedir)) { if ($file == false) { if ($file != '.' && $file != '..'){ if (!is_dir($basedir."/".$1)) { filename: $basedir/$file ".checkBOM("$basedir/$file")."
. fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
U方法使用範例,位址方法,在模型或範本中都可以使用U方法是ThinkPHP中用於自動產生URL位址的方法,能夠幫助你因為不同的環境和設定而自動產生對應的URL位址。 特點如下:1、自動識別目前的URL模式2、自動識別目前的PATH_INFO分隔符號3、網域名稱和二級網域支援4、偽靜態和錨點支援3、網域名稱和二級網域支援
路由位址支援因此,在使用U方法的時候,你基本上不需要關注當前使用的是什麼URL模式和什麼配置參數,按照U方法統一的規則調用即可,在實際生成URL地址的時候U方法會自動識別。 下面是一些基本的用法:// 目前模組的read操作位址,傳入參數id為5U('read','id=5'); 如果要傳入變數,則用:U('read','id='.$vo['id']); 如果你的U方法是在模板調用,一般需要寫成: 閱讀文章 產生Blog模組的index操作位址,並傳入更多的參數:U('blog /index','cate_id=5&type=1'); 當然,也可以使用陣列傳參:U('blog/index',array('cate_id'=>5,'type'=> 1)); 如果參數比較少,也可以直接在第一個參數中傳入:U('Blog/read?id=5'); U('Blog/cate?cate_id =1&status=1') 支援分組產生:U('Home/Blog/read?id=5'); // Home分組下面的blog模組的read操作地址
U('Admin/Blog/cate?cate_id=1&status=1');// Admin分組
表示
U方法會自動加上目前配置的偽靜態後綴,如果你配置了多個偽靜態後綴,則預設會加上第一個,如果需要指定偽靜態後綴,也可以使用:
U('Blog/read','id=1','xml');
表示輸出偽靜態後綴為.xml的URL位址
如果要使用U方法輸出路由位址,則需要在第一個參數前加上"/",例如:
U('/news/1');
則表示要產生的URL位址是news/1 這樣的路由位址。
如果需要產生有網域名稱的URL位址,可以使用:
U('Blog/read@blog.thinkphp.cn','id=1');
或
/read@blog','id=1'); 表示採用目前網域的blog二級網域名稱位址。 支援錨點產生(注意需要更新最新的Git版本才能支援)U('Blog/read#review','id=5'); 產生的URL地址最後會帶上#review 錨點,方便跳到評論部分。 設定圖片的HTTP緩存,也可以設定JS和CSS的如果是Apache環境下面,可以在.htaccess檔案中加入下面的程式碼,用於設定圖片的HTTP快取和有效期限(需要開啟apache的headers模組支援),減少網站的圖片資源請求壓力,提高訪問速度和你的pagespeed值^_^。
上面的程式碼設定了網站的圖片使用為期一周的HTTP緩存,當然,你一樣可以給js或css檔案加上http快取哦。
檢查字串中是否有外鏈
/**
* all_external_link 偵測字串是否包含外鏈
* @param string $text 文字
* @param string $host 對片外
* @?
*/function all_external_link($text. )) $host = $_SERVER['HTTP_HOST']; $reg = '/http(?:s?)://((?:[A-za-z0-9-]+.)+[A -za-z]{2,4})/'; preg_match_all($reg, $text, $data); $math = $data[1]; foreach ($math as $value) { if($value != $host) return false; } return僅用於Apache環境下面,可以在htaccess檔案中加入下面的程式碼,當造訪abc.com的時候會重新導向到www.abc.com,當然你也可以設定重新導向到其它的網域。$br = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/MSIE/i',$br)) {
IE MS. }elseif (preg_match('/Firefox/i ',$br)) {
$br = 'Firefox';
}elseif (preg_match('/Chrome/i',$br)) {
) 含atch ('/Safari/i',$br)) { $br = 'Safari'; }elseif (preg_match('/Opera/i',$br)) {; }else { $br = 'Other'; } return $br;
////取得訪客瀏覽語言
function GetLang(){
if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
LAN $lang = $_LANGUAGE']){
$lang = substr($lang,0,5);
if(preg_match("/zh-cn/i",$lang)){
@$lang = "簡體中文 }n; ("/zh/i",$lang)){
$lang = "繁體中文";
}else{
$lang = "English";
$lang = "English"; }else{return "取得瀏覽器語言失敗!";} } ////取得訪客作業系統 function GetOs(){$ER_o!
)){ $OS = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/win/i',$OS)) {(Fhi; '/mac/i',$OS)) {
$OS = 'MAC';
}elseif (preg_match('/linux/i',$OS)) {
}elseif (preg_match('/unix/i',$OS)) { $OS = 'Unix'; }elseif (preg_match('/bsd/i),$ = 'BSD'; }else { $OS = 'Other'; } turn } ////獲得訪客真實ip function Getip(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])){ -p_Hh_p; } if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ //取得代理ip $ips = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR); if($ ip){ $ips = array_unshift($ips,$ip); } for$ $ ){ if(!preg_match("/^(10|172.16|192.168)./i",$ips[$i])){//排除區域網路
break;
if($tip=="127.0.0.1" ){ //取得本地真實IP
return $this->get_onlineip();
}else{
return $tip }else{
return $tip }else{
return $tip ;
////取得本地真實IP
function get_onlineip() {
$mip = file_get_contents("http://city.ip138.com/city0.asp");
if($mip){
, $mip,$sip);
$p = array("/[/","/]/");
{ return "取得本機IP失敗! ";}
}
////依ip取得訪客所在地地名
function Getaddress($ip=''){ ->Getip();
}
$ipadd = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);/根據新浪介面取得
if($ipadd){
$charset = iconv("gbk","utf-8",$ipadd);
preg_matchipad_all"/[x }",$charset,$ipadds);
return $ipadds; //回傳一個二維陣列
}else{return "addree is ninone"; gifo = new get_gust_info();
echo "你的ip:".$gifo->Getip();
echo "
地點:";
$alds = $ipadaddress();Getaddress(); ($ipadds[0] as $value){
echo "rn ".iconv("utf-8","gbk",$value);
:".$gifo->GetBrowser(); echo "
瀏覽器語言:".$gifo->GetLang();
echo "
作業系統:".$gifo->GetOs();
?
URL安全的字串base64編碼和解碼
如果直接使用base64_encode和base64_decode方法的話,產生的字串可能不適用URL位址。以下的方法可以解決問題: URL安全的字串編碼:
function urlsafe_b64encode($string) {
$data = base64_encode($string);
','='),array('-','_',''),$data);
return $data;
}
URL安全的解碼:
URL安全的解碼:
function $string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
}
獲取客戶端瀏覽器資訊
/**
* 取得用戶端瀏覽器類型
* @param string $glue 瀏覽器類型和版本號碼之間的連接符號
* @return string|array 傳遞連接符號則傳回連結器類型和版本
* @return string|array 傳遞連接符號則傳回連結器類型和版本* @return string|array 傳遞連接符號則傳回連線否則直接回傳數組false為未知瀏覽器類型
*/
function get_client_browser($glue = null) {
$browser = array();
);客戶端資訊
/* 定義瀏覽器特性正規表示式*/
$regex = array(
'chrome' => '/(Chrome)/(d+.d+)/', 'firefox' => '/(Firefox)/(d+.d+)/', 'opera' (d+.d+)/', 'safari' => '/Version/(d+.d+.d) (Safari)/', );) );) $ { preg_match($reg, $agent, $data); if(!empty($data) && is_array($data)){為 $🠭🠟 🠟 = y $數據[2], $data[1]) : array($data[1], $data[2]); break; }(is_null ($glue) ? $browser : implode($glue, $browser));
}
時間戳友好化格式化函數顯示剛剛,幾秒前
將時間於現在時間相比顯示為多久以前發布的,如顯示為:剛剛、5秒前、5小時前、5天前..這種
/**
*
+-------------------------------------------- ------------------------
* Description 友善顯示時間
+---------------- -------------------------------------------------- --
* @param int $time 要格式化的時間戳預設為目前時間
+--------------------------- -----------------------------------------
* @return string $text 格式化後的時間戳
+------------------------------------------ --------------------------
* @author yijianqing
+--------------- -------------------------------------------------- ---
*/
function mdate( $time = NULL) {
$text = '';
$time = $time === NULL || $time > time() ? time() : intval($time);
$t = time
$t = time () - $time; //時間差(秒)
if ($t == 0)
$text = '剛';
elseif ($t
elseif ($t
$text = floor($t / 60) . '分鐘前'; //一小時內 * 60 * 24)
$text = floor($t / (60 * 60)) . '小時前'; // 一天內
elseif ($t
elseif ($t
$text = date('m月d日H:i', $time); //一個月內
elseif ($t
. d日', $time); //一年內
else
$text = date('Y年m月d日', $time); //一年前
return $d日', $time); //一年前
return $d
使用此函數,我們只需在前台用{$vo.time|mdate} 實現時間友好顯示了/**
* 將回傳的資料集轉換成樹
* @param array $list 資料集
* @param string * @param string $child 子節點名稱
* @param integer $root 根節點ID
* @return array 轉換後的樹
*/
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root=0) {
$tree = array( );// 建立Tree
if(is_array($list)) {
// 建立基於主鍵的陣列參考
建立 $referment for $referee( $data) {
$refer[$data[$pk]] =& $list[$key];
}
// 判斷是否有parent $parentId = $data[$pid]; if ($root == $parentId) { $ [$key]; }else{ if (isset($refer[$parentId])) { $parent[$child][] =& $list[$key]; } } } } return $tree;頭像時目前是這麼做的將上傳判斷程式碼段 /* if( !$upload->upload()) {// 上傳錯誤提示錯誤訊息 $this->error($upload->getErrorMsg()); }else{// 上傳成功取得上傳檔案資訊 }else{// 上傳成功取得上傳檔案資訊 info = $upload->getUploadFileInfo(); } */ 改為:$upload->upload();即使不上傳圖片也不提示錯誤, 然後在上傳頁面添加
在update()方法中做以下判斷:
if(is_null($info[0]["savename"])){
$['face'face' _POST['face'];}else{ $data['face']=$info[0]["savename"];}PH桿
合併數個組合因子的array_merge時,如果第一個參數為空,則會導致傳回結果為空。這個函數做了對應處理。 function MergeArray($list1,$list2){ if(!isEmpty($list1) && !isEmpty($list2))) 15 list2);
}
else return (isEmpty($list1)?(isEmpty($list2)?null:$list2):$list1);
}
function isEmpty($data)
}function isEmpty($data)🜎 hahoah> || false == $data || "" == $data;} Google翻譯插件調用,採用CURL調取調用Google翻譯的接口,需要開啟Google翻譯插件調用,採用CURL調取調用Googlecurl的接口,需要開啟Google翻譯外掛程式。 /* Google翻譯函數 by QQ366958903 目標語言 $sl 原語言 $iefunction translate($text='',$tl='zh-CN',$sl='auto',$ie='UTF-8'){
$ch = curl_init('http://translate.google.cn/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"&hl=zh-CN&sl={$sl}&ie={$ie}&tl={$tl}&text=".urlencode($text));
$html = curl_exec($ch);
preg_match('#(.*?)
return strip_tags($doc['1'],'
');
}
= '你好';
echo translate($text,'en');
?>
語言簡寫對應表
' >'阿爾巴尼亞語','ar'=>'阿拉伯語','az'=>'阿塞拜疆語ALPHA','ga'=>'愛爾蘭語','et'=> '愛沙尼亞語','be'=>'白俄羅斯語','bg'=>'保加利亞語','is'=>'冰島語','pl'=>'波蘭語','fa'=>'波斯語','af'=>'布爾文(南非荷蘭語)','da'=>'丹麥語','de'= >'德語','ru'=>'俄語','fr'=>'法語','tl'=>'菲律賓語','fi'=>'芬蘭語' ,'ka'=>'格魯吉亞語ALPHA','ht'=>'海地克里奧爾語ALPHA','ko'=>'韓語','nl'='荷蘭語','gl'=>'加利西亞語','ca'=>'加泰隆尼亞語','cs'=>'捷克語','hr '=>'克羅埃西亞語','lv'=>'拉脫維亞語','lt'=>'立陶宛語','ro'=>'羅馬尼亞語','mt'= >'馬耳他語','ms'=>'馬來語','mk'=>'馬其頓語','no'=>'挪威語','pt'=> '葡萄牙語','ja'=>'日語','sv'=>'瑞典語','sr'=>'塞爾維亞語','sk'=>'斯洛伐克語','sl'=>'斯洛維尼亞語','sw'=>'斯瓦希里語','th'=>'泰語','tr'=>'土耳其語','cy'=>'威爾斯語','uk'=>'烏克蘭語','eu'=>'西班牙的巴斯克語ALPHA','es'=>'西班牙文','iw'=>'希伯來文','el'=>'希臘文','hu'=>'匈牙利語','hy'=>'亞美尼亞語ALPHA','it'=>'義大利語','yi'=>'意第緒語','hi'=>'印地語','ur'= >'印度烏爾都語ALPHA','id'=>'印尼語','en'=>'英語','vi'=>'越南語','zh- TW'=>'中文(繁體)','zh-CN'=>'中文(簡體)', 備份資料庫,整個庫或備份部分錶全寫在模組在//相關設定 public $model = ''; public $content; ;public $dir_sep = '/'; 資料
function _initialize() {
parent::_initialize();
header("Content-type: /html; utf-8");
set_time_limit(0); 時
ini_set('memory_limit','500M');
$this->config = array(
$this->config = array(
' DB_BACKUP'), //是否開啟中使用 註解
); $this->dbName = C('DB_NAME'); $this->model = new Model(); //$sql = 'set interactive_timeout=24*3600 '; //閒置多少秒後斷開連結* +----------- -------------------------------------------------- -----------
* * @ 已備份資料清單
* +-------------------------- ----------------------------------------------
*/
function index() {
$path = $this->config['path'];
$fileArr = $this-> > $ value) {
if ($key > 1) {
// :s', filemtime($path . '/' . $value)) ;
$fileSize = filesize($path . '/' . $value) / 1024;
攝取 $fileSize = $fileSize
number_format($fileSize / 1024, 2) . ' MB'; $list[] = array(
'name' => $ fileTime,
'size' => $fileSize
}
$this->assign('list', $list);
$this->display();
$this->display();
/* -
* +----------------------------------------- -------------------------------
* * @ 取得資料表
* +------- -------------------------------------------------- ---------------
*/
function tablist() {
$list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}"); //得到表格中的資訊
//echo $Bastup-get this->assign('list', $list);
$this->display();
}
/* -
-------------------------------------------------- -------
* * @ 備份整個資料庫
* +------------------------------- -----------------------------------------
*/
function backall( ) {
$tables = $this->getTables();
if ($this->backup($tables)) {
');
} else {
$this->error('資料庫備份失敗!');
* +----------- -------------------------------------------------- -----------
* * @ 以表格備份,可大量
* +------------------------ ------------------------------------------------
*/
function backtables() {
$tab = $_REQUEST['tab'];
$
else
$tables[] = $tab;
if ($this->backup($tables)) {
if (is_array($tab))
$ 備份'); else $this->success('一項資料庫備份中 $this->error('資料庫備份失敗!'); } } //還原資料庫$this->success('資料還原成功! //刪除資料備份
function deletebak () {
if (unlink($this->config['path'] . $this->dir_sep . $_GET['file']) {
備用 錯誤! , '/public/ok');
} else {
$this->error('刪除備份失敗!'); * -
* +----- -------------------------------------------------- -----------------
* * @ 下載備份檔案
* +--------------------- -------------------------------------------------- -
*/
function downloadBak() {
$file_name = $_GET['file']; if (!file_exists($file_dir . "/" . $file_name)) { //檢查檔案是否存在
return false;
exit; $file = fopen($file_dir . "/" . $file_name, "r" ); // 開啟檔案
// 輸入檔案標籤
header('Content-Encoding: none'); stream");
header("Accept- Ranges: bytes");
header("Accept-Length: " . filesize($file_dir . "/" . $file_name));
header('Content-Transfer-Encoding: binary');
fileheader("ent-Disposition: fileheader("ent-Disposition: 79977775年之後為真實瀏覽器瀏覽文件). header('Pragma : no-cache');
header('Expires: 0');
file /" . $file_name));
fclose ($file);
exit;
}
}
* ---------------- / - ----------------------------------------------
* * @ 取得目錄下檔案陣列
* +---------------------------------------- ----------------------------------
* * @ $FilePath 目錄路徑
* * @ $Order 排序
* +----------------------------------------------- -------------------------
* * @ 取得指定目錄下的檔案列表,回傳數組
* +------ -------------------------------------------------- ----------------
*/
private function MyScandir($FilePath = './', $Order = 0) {
;
while ($filename = readdir($FilePath)) {
$fileArr[] = $filename der ort($fileArr) : rsort($fileArr);
return $fileArr;
}
/* * ************************************** ************************************************** **** */
/* -
* +----------------------------------- -------------------------------------
* * @ 讀取備份檔案
* + -------------------------------------------------- ----------------------
* * @ $fileName 檔案名稱
* +--------------- -------------------------------------------------- -------
*/
private function getFile($fileName) {
$this->content = '';
$this->content = ''; path'] . $this->dir_sep . $fileName);
if (is_file($fileName)) {
($ext == '. sql') {
$this->content = file_get_contents($fileName);
} elseif ($ == $this->content = implode('', gzfile($fileName ));
} else {
$this->error(' );); } else {
$this->error('檔案不存在!');
}
}
/* -
* +----------------------------------- -------------------------------------
* * @ 把資料寫入磁碟
* +------------------------------------------------- -----------------------
*/
private function setFile() {
$ reize = '';
$ reize = '';
🜠 ->dbName; $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $recognize . '_' . date('YmdHis') . '' . mt_rand(100000000, 999999999) . '.sql'); $path = $this->setPath($fileName); $this->error("無法建立備份目錄目錄'$path'"); } if ($this->config['isCompress'] == 0) {if (!file_put_contents($fileName, $this->content, LOCK_EX)) {
}
} else {
if (function_exists('gzwrite')) {
$Name .= '.g $gz = gzopen($fileName, 'wb')) {
gzwrite($gz, $ this->content);
gzclose($gz);
$this->error('寫入檔案失敗,請檢查磁碟空間或權限!');
}
} se {
$this->error('沒有開啟gzip擴充中!');
['isDownload']) {
$this->downloadFile($fileName );
}
}
private function trimPath($path) {
\ == , $path); } private function setPath($fileName) { $dirs = explode($this->dir_sep, dirname $ foreach ($ dirs as $dir) { $tmp .= $dir . $this->dir_sep; return $tmp; } return true; } //未測試 private function downloadFile($Name) {p header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($fileName)); header('Content-Disposition: attachment; filename=' . basename($fileName)); - * +- -------------------------------------------------- --------------------- * * @ 新增字串` ` * +-------------- -------------------------------------------------- -------- * * @ $str 字串 * +----------------------------- ------------------------------------------- * * @ 回` $str` * +------------------------------------------- ----------------------------- */ private function backquote($str) { return "`{$ str}`"; } /* - * +--------------------------------- --------------------------------------- * * @ 取得資料庫的所有表格* +----------------------------------------------- ------------------------- * * @ $dbName 資料庫名稱 * +------------ -------------------------------------------------- ---------- */ private function getTables($dbName = '') { if (!empty($dbName)) { 時期🠟 . $dbName; } else { $sql = 'SHOW TABLES '; he $info = array();
foreach ($result as $key => $val) {
$info[$key] = current($val);
} /* - * + -------------------------------------------------- ---------------------- * * @ 把傳過來的資料依指定長度分割成陣列 * +-------- -------------------------------------------------- -------------- * * @ $array 要分割的資料 * * @ $byte 要分割的長度 * +---------- -------------------------------------------------- ------------ * * @ 把陣列依指定長度分割,並回傳分割後的陣列 * +---------------- -------------------------------------------------- ------ */ private function chunkArrayByByte($array, $byte = 5120) { 我 $return = array(); foreach ($array as $v) { $sum += strlen($v); [] = $v; } elseif ($sum == $byte) { $return[++$i][] = $v; 1 $return[++$i][] = $v; $i++; $sum return $return; } /* - * +----------- -------------------------------------------------- ----------- * * @ 備份資料{ 備份每張表、檢視及資料} * +------------------ -------------------------------------------------- ---- * * @ $tables 需要備份的表格陣列 * +------------------------------ ------------------------------------------ */ private function backup($tables) { if (empty($tables)) $this->error('沒有需要備份的資料表中!'); by MySQLReback ' . date('Y-m-d H:i:s') . ' */'; foreach ($tables as $i => $table) {this quo ; //為表名增加中``tables
//取得目前表格的建立語句 if (!empty($ tableRs[0]["Create View"])) { $this->content .= "rn /* 創建視圖結構{$table} */"; $this->content .= "rn DROP VIEW IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create View"] . ";/* MySQLReback Separation */"; 含0]["Create Table"])) { $this->content .= "rn /* 建立表格結構{$table} */"DRP. EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create Table"] . ";/* MySQLReback Separation */";
SELECT * FROM {$table}"); $valuesArr = array(); 1
if (false != $tableDateRow) {
foreach ($y as &$v) {
//修正empty 為0的時候 返回tree
$v = 'null'; //為空設為null
else
. mysql_escape_string($v) . "'"; //非空加轉意符
}
$valuesArr[] = '(' . implode(',', $y) . ')';
}
}
$temp = $this->chunkArrayByByte($valuesArr);
if (is_array($temp)) {
$values = implode(',', $v) . ';/* MySQLReback Separation */';
($values != ';/* MySQLReback Separation */') {
$ $this->content .= "rn INSERT INTO {$table} VALUES {$values}";
}
}
// dump($this->content);
//
} if (!empty($this->content)) { $this->setFile(); }
* +-------- -------------------------------------------------- --------------
* * @ 還原資料
* +------------------------- -----------------------------------------------
* * @ $fileName 檔名
* +---------------------------------------- ----------------------------------
*/
private function recover_file($fileName) {
$this ->getFile($fileName);
if (!empty($this->content)) {
$content = explode(';/* MySQLReback - /' foreach ($content as $i => $sql) {
$sql = trim($sql);
$mes = $this->model->execute($ sql);
if (false === $mes) {
$table_change = array('null' => '''');
$sql = strtr($sql, $table_change);
$mes = $this->model->execute($sql);
}
if (false === $mes) { //如果遇到錯誤、記錄錯誤
$log_text = '下列程式碼還原遇到問題:';
text
set_log($log_text);}
} else {
$this->error('無法讀取備份檔案!');
}
?>
$this-> _get(); 用法範例自動過濾
$this->_get('a','b','c');
三個參數:
a、$_GETGET提交上來的變數名稱;
b、濾波函數(多用逗號隔開,如:'trim' / 'trim,String');
c、預設值;
錯誤代碼,錯誤頁面的函數
httpstatus('404');
將向客戶端發送一個404錯誤,並且錯誤頁面是可以自訂的。
將函數放在common.php內,自動載入即可隨意呼叫了
/**
* 回傳錯誤代碼,將錯誤頁放在入口文件目錄./Public/httpstatus下,命名為404.html,403.html,503.html等等
* @param $string 錯誤代碼
* @param $string 錯誤代碼
* @param $string 錯誤代碼
* @param $string 錯誤代碼
* @param $string 錯誤代碼
param $msg 錯誤訊息例如NOT FOUND,可以省略 */function httpstatus($string="404",$msg=""){ header header header header header header header header header header header header header ("http/1.1 {$string} {$msg}"); include './Public/httpstatus/'.$string.'.html'; exit;}
exit;