Thinkphp コード
クライアント IP アドレスを取得します
クライアント IP アドレスを取得します
$type は戻り値の型を意味します 0 を返す IP アドレス 1 を返す IPV4 アドレス番号
function get_client_ip($type = 0) {
$ type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) {R $ Arr = Explode (',', $ _Server ['http_x_Forwarded_For'])
$ ip = トリム ($ arr [0]); isset ($ _server ['http_client_ip']) {
$ ip = $ _Server ['http_client_ip'] ;
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip ip2long($ ip );
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
ファイルバイトサイズのフォーマット
バイトフォーマットは、BK M G T
関数 byte_format($size, $dec=2){
$a = array("B", " KB", "MB) で記述されたサイズとしてバイト数をフォーマットします。 ", "GB", "TB", "PB");
$pos = 0;
while ($size >= 1024) {
$size /= 1024;
$ pos++;
}
return Round($size,$dec)." ".$a[$pos];
}
または
function get_size($s,$u='B',$p =1){
$us = array('B'=>'K','K'=>'M','M'=>'G','G'=>'T' ); (($u!=='B')&&(!isset($us[$u]))||($s
}
虹の文字列を表示するために使用されます。UTF8 と中国語をサポートしており、効果は次のとおりです。
function color_txt($str){
$len = mb_strlen($str);
$colorTxt = '';
for($i=0; $i<$len; $i++ ) {
$colorTxt .= ''.mb_substr($str,$i,1,'utf-8').'' ;
}
return $colorTxt;
}
function rand_color(){
return '#'.sprintf("%02X",mt_rand(0,255)).sprintf("%02X", mt_rand(0,255) )).sprintf("%02X",mt_rand(0,255));
}
PHP でファイルのダウンロードを高速化しましょう
一般的に言えば、ドキュメントの下にあるファイルへの URL を直接指すことができます。ルートはユーザーにファイルをダウンロードするように誘導します
ただし、これを行うと、統計や権限チェックなどを行うことができないため、多くの場合、PHP を使用してユーザーにファイルのダウンロードを提供します。
$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");
header(' Content-Disposition:attachment; filename="' .basename($file) . '"');
header("Content-Length: ".filesize($file));
readfile($file);
しかし、これには問題があります。つまり、ファイル名が中国語の場合、一部のユーザーは文字化けしたファイル名をダウンロードする可能性があります。そこで、いくつかの変更を加えてみましょう (参照: :
$file)。 = "/tmp/中文名.tar.gz";
$filename =basename($file);
header("Content-type: application/octet-stream");
//中国語ファイルの処理 Name
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match(" /MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua )) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition:attachment; filename="' . $filename . '"');
}
header('Content-Disposition:attachment; filename="' . $filename . '"') '"');
header("Content-Length: ".filesize($file));
readfile($file);
さて、だいぶ良くなったように見えますが、まだ問題があります。 PHP の readfile は可能な限り効率的であり、PHP 自体のメモリを占有しないように努めていますが、実際には、ファイルをループして直接出力するために MMAP (サポートされている場合) または固定バッファを使用する必要があります。
出力する際、Apache + PHP modの場合はApacheの出力バッファに送信する必要がありますが、Nginx + fpmの場合は別々にデプロイされている場合も同様に送信されます。追加のネットワーク IO をもたらす
それで、Web サーバーは PHP 層を経由せずにユーザーに直接ファイルを送信できますか?
今日、興味深い記事を見つけました: How I PHP: X-SendFile.
Apache のモジュール mod_xsendfile を使用して、Apache にこのファイルをユーザーに直接送信させることができます:
$file = "/tmp/中文名.tar.gz";
$filename =basename($ file);
header("Content-type: application/octet-stream");
//中国語ファイル名の処理
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename );
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition:attachment; filename*="utf8'') " . $filename . '"');
} else {
header('Content-Disposition:attachment; filename="' . $filename . '"');
}
header('Content-Disposition :attachment; .basename($file) .'"');
// Xsendfile にファイルを送信させます
header("X-Sendfile: $file");
X-Sendfile header Apache によって処理され、応答ファイルはクライアントに直接送信されます
Lighttpd と Nginx にも同様のモジュールがあります。興味がある場合は、それを探してください
htaccess ファイルを非表示に設定します。 Index.php
for Apache 環境下で URL アドレスの Index.php を非表示にする
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !- f
RewriteRule ^( .*)$index.php/$1 [QSA,PT,L]
PHP コード内の空白とコメントを削除します
PHP には組み込みがありますphp_strip_whitespace メソッドは、PHP ファイルを読み取り、コード内の空白とコメントを削除しますが、空白とコメントを削除するためのコンテンツの直接読み取りはサポートしていません。次のメソッドは文字列コンテンツの読み取りをサポートしており、ThinkPHP フレームワークにはこのメソッドが組み込まれています。
/**
* コード内の空白とコメントを削除します
* @param string $content code content
* @return string
*/
functionstrip_whitespace($content) {
$stripStr = '';
//PHP ソースコードを分析します
$tokens = token_get_all($content);
$last_space = false;
for ($i = 0, $j = count($tokens); $i < $j; $i++) {
= false;
case T_COMMENT: D Case T_Doc_Comment:
Break;
// スペースをフィルタリングします
case t_whitespace:
if (! $ Last_space) {
$ last_space = '';
Break;
case T_START_HEREDOC:
$stripStr .= "<< Break; case T_END_HEREDOC: $stripStr .= "THINK;n"; for($ k = $i+1; $j +) { if(is_string($tokens[$k]) && $tokens[$k] == ';') { $i = $k; Break; } else if($tokens[$k][0] == T_CLOSE_TAG) { ブレーク; } } ブレーク; デフォルト: $last_space = false; $stripStr .= $tokens[$i][1]; } } } return $stripStr; } 检查文字符串かどうかUTF8编码 特定の文字列がUTF8を採用しているかどうかを判断するための関数です function is_utf8($string){ return preg_match('%^(?: [x09x0Ax0Dx20-x7E] #
$ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = array('onabort', 'onactivate '、'onafterprint'、'onafterupdate'、'onbeforeactivate'、'onbeforecopy'、'onbeforecut'、'onbeforedeactivate'、'onbeforeeditfocus'、'onbeforepaste'、'onbeforeprint'、'onbeforeunload'、'onbeforeupdate'、'onblur'、 'onbounce'、'oncellchange'、'onchange'、'onclick'、'oncontextmenu'、'oncontrolselect'、'oncopy'、'oncut'、'ondataavailable'、'ondatasetchanged'、'ondatasetcomplete'、'ondblclick'、'ondeactivate '、'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 < sizeof($ra); $i++) {
$pattern = '/';
for ($j = 0; $j < strlen($ra[$i]); $j++) {
if ($j > 0) {
$pattern .= '(';
$pattern .= '([xX]0{0,8}([9ab]);)';
$pattern .= ' |';
$pattern .= '|(�{0,8}([9|10|13]);)';
$pattern .= ')*';
}
$pattern .= $ra[ $i][$j];
}
$pattern .= '/i';
$replacement = substr($ra[$i], 0, 2).'
$val = preg_replace($pattern, $replacement, $val); // 16 進タグを除外します
if ($val_before == $val) {
// 置換は行われなかったため、ループを終了します
$found = false;
}
}
}
return $val;
}
COOKIE 使用法の例
cookie メソッドは、Cookie の設定、取得、および削除操作を完了するために使用される ThinkPHP 内にある関数です。価値'); //設置cookie
cookie('name','value',3600); // 指定Cookie保存時間は1時間です
高品質設置
cookie('name','value',array('expire'=>3600,'prefix'=>'think_')); // 指定有效期和前缀
// 下面の代码和上面等效
cookie('name','value','expire=3600&prefix=think_')
获取
$value = cookie(' name');
事前パラメータが設定されているかどうか、cookie メソッドが自動的に判断します。
Cookie をクリアする必要がある場合は、次を使用できます:
cookie(null); // 現在設定されているプレフィックスのすべての Cookie 値をクリアします
cookie(null,'think_') // すべての Cookie 値をクリアします指定されたプレフィックス
の検証コードが表示されない場合、このコードは BOM 情報が表示されない問題を解決します (BOM 情報を一括削除するコード)。
ローカルのテスト環境で検証コードを表示する必要がある場合があります。サーバーにデプロイすると、検証コードが表示される必要がある場所に表示されなくなります。同じ問題が発生した場合は、以下をお読みください。
ほとんどの問題は BOM ヘッダー情報によって引き起こされます。通常、すべての設定ファイルは BOM ヘッダー情報を削除する必要があります。BOM ヘッダー情報とは何ですか?
私の通常の解決策は、BOM を削除する新しいコード ファイルを作成することです。サーバーにデプロイした後、すべてのファイルからヘッダー情報を取得します。次に、それを実行します。例: http://www.xxx.com/delBom を実行するだけで、新しい delBom.php ファイルが作成されます。コードは次のとおりです:
if (isset($_GET['dir']){ //ファイルディレクトリを設定します
$basedir=$_GET['dir'];
}else{
$basedir = '.';
}
$auto = 1;
function checkdir($basedir){
if ($dh = opendir($basedir) )) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..'){
if (! is_dir($basedir."/".$file)) {
echo "ファイル名: $basedir/$file ".checkBOM("$basedir/$file")."
"
}else{
$dirname = $basedir."/".$file;
checkdir($dirname) }
}
}
}
}
機能チェックBOM ($filename) {
$auto;
$contents = file_get_contents ($filename) = substr($contents, 0, 1); ($contents, 1, 1);
$charset[3] = substr ($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) ) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $残り);
return ("BOM が見つかりました。自動的に削除されました。_http://www.k686.com ;/font>");
} else {
return ("< ;font color=red>BOM が見つかりました。");
}
}
else return ("BOM が見つかりません.");
}
関数書き換え ($filename, $data) {
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum , $data);
fclose($filenum);
?>
U メソッドの使用例は、モデルまたはテンプレートで使用できます
U メソッドThinkPHP で URL アドレスを自動的に生成します。これは、環境や構成が異なる場合に役立ちます。対応する URL アドレスが自動的に生成されます。
機能は次のとおりです:
1. 現在の URL パターンを自動的に識別します
2. 現在の PATH_INFO 区切り文字を自動的に識別します
3. 擬似静的およびアンカー ポイントをサポートします。サポート
5. ルーティング アドレス サポート
したがって、U メソッドを使用する場合、現在使用されている URL モードと設定パラメーターを意識する必要はなく、U の統一ルールに従って呼び出すだけで済みます。実際に URL アドレスを生成する際には、U メソッドが自動的に認識されます。
以下はいくつかの基本的な使用法です:
//現在のモジュールの読み取り操作アドレス、受信パラメータIDは5です
U('read','id=5');
必要に応じて変数を渡すには、次を使用します:
U('read','id='.$vo['id']);
U メソッドがテンプレートで呼び出される場合、通常は次のようにする必要があります。次のように記述します:
ブログモジュールのインデックス操作アドレスを生成して渡しますその他のパラメータ:
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'); // ホームグループ下のブログモジュールの読み取り操作アドレス
U('Admin/Blog/cate?cate_id=1&status=1'); / 管理者グループ化
は、
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');
または
U('Blog /read@blog','id=1');
は、現在のドメイン名の第 2 レベルのブログ ドメイン名アドレスを表します。
アンカー ポイントの生成をサポートします (サポートするには、最新の Git バージョンを更新する必要があることに注意してください)
U('Blog/read#review','id=5');
生成された URL アドレスコメントセクションに簡単にジャンプできるように、最後の #review アンカーに含まれます。
画像のHTTPキャッシュを設定します。JSとCSSも設定できます
Apache環境の場合は、.htaccessファイルに次のコードを追加してHTTPキャッシュと有効期間を設定できます画像の削除 (Apache のヘッダー モジュールのサポートをオンにする必要があります)、Web サイトの画像リソース要求のプレッシャーが軽減され、アクセス速度とページ速度の値が向上します^_^。
Header set Cache-Control "max-age=604800"
FilesMatch>
上記のコードは、Web サイト上の画像に対して 1 週間の HTTP キャッシュを設定します。 もちろん、http キャッシュを js または css ファイルに追加することもできます。
文字列
/**
* all_external_link 文字列に外部リンクが含まれているかどうかを確認します
* @param string $text text
* @param string $ホストドメイン名
* @return boolean 外部リンクがある場合は false、外部リンクがない場合は true
*/
function all_external_link($text = '', $host = '') {
if (empty($ホスト )) $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) { A if ($ value! = $ Host) Return false;
return true; abc.com にアクセスすると、当然、www.abc.com にリダイレクトされます。他のドメイン名へのリダイレクトを設定することもできます。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^abc.com$ [NC]
RewriteRule ^(.*)$ http://www.abc.com/$1 [R =301,L]
PHPはクライアントのIP、地理情報、ブラウザ情報、ローカルの実IPを取得します
// クライアントのIPを取得する関数、地理情報、ブラウザ、ローカルの実IP
class get_gust_info {
////訪問者のブラウザタイプを取得する
function GetBrowser(){
if(!empty($_SERVER['HTTP_USER_AGENT'])) {
$br = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/MSIE/i',$br)) {
$br = 'MSIE';
}else if (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 = 'その他';
}
return $br;
}else{return "ブラウザ情報の取得に失敗しました!";}
}
/ ///訪問者のブラウザ言語を取得します
function GetLang(){
if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$lang = substr($lang,0,5);
if(preg_match("/zh-cn/i",$lang)){
$lang = "簡体字中国語";
}elseif(preg_match ("/zh/i",$lang)){
$lang = "繁体字中国語";
}else{
} $lang = "英語";
}
return $lang;
}else{return "ブラウザ言語の取得に失敗しました!";}
}
////ゲスト オペレーティング システムを取得します
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';
}else {
} $OS = 'その他';
}
を使用する を使用する を使用する を使用する を使用する を使用する を使用する を使用する を使用する‐‐‐‐‐ } } } } } } } }
////訪問者の実際の IP を取得します
関数 Getip(){
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ //プロキシ IP を取得
$ips =explode(',',$ _SERVER['HTTP_X_FORWARDED_FOR']);
}
if($ ip){
$ips = array_unshift($ips,$ip)
}
$count = count($ips);
for($i=0;$i<$count;$i++ ){
if(!preg_match("/^(10|172.16|192.168)./i",$ips[$i])){/ /LAN ip を除外します
$ip = $ips[$i];
}
}
$tip = empty($_SERVER['REMOTE_ADDR']) ? '];
if($tip=="1 27.0.0.1" ;
関数 get_onlineip() {
$mip = file_get_contents("http://city.ip138.com/city0.asp");
if($ mip){
preg_match( "/[.*]/"、$ mip、$ sip); 「ローカルIPの取得に失敗しました!」 ";}
}
////IP に基づいて訪問者の場所名を取得します
function Getaddress($ip=''){
if(empty($ip)){
$ip = $this ->Getip();
}
$ipadd = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);// Sina API インターフェースの取得によると
if($ipadd){
$charset = iconv("gbk","utf-8",$ipadd);
preg_match_all("/[x{4e00}-x{9fa5) }]+ /u",$charset,$ipadds);
return $ipadds; //二次元配列を返す
}else{return "addree is none";}
}
}
$gifo = new get_gust_info();
echo "あなたの IP:".$gifo->Getip();
echo "
Location:";
$ipadds = $gifo-> ;Getaddress( );
foreach($ipadds[0] as $value){
echo "rn ".iconv("utf-8","gbk",$value); br/>ブラウザの種類: " .$gifo->GetBrowser();
echo "
ブラウザ言語:".$gifo->GetLang();
echo "
オペレーティングシステム:".$gifo->GetOs();
?>
URL の安全な文字列の Base64 エンコードとデコード
base64_encode メソッドとbase64_decode メソッドを直接使用する場合、生成された文字列は URL アドレスに適さない可能性があります。次の方法でこの問題を解決できます: URL セーフな文字列エンコーディング:
function urlsafe_b64encode($string) {
$data =base64_encode($string);
$data = str_replace(array('+','/ ', '='),array('-','_',''),$data);
return $data;
}
URL 安全な文字列デコード:
function urlsafe_b64decode( $string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ( $mod4) {
$data .= substr('====', $mod4);
}
returnbase64_decode($data);
}
顧客の取得 ブラウザ情報の終了
/**
* クライアントのブラウザの種類を取得します
* @param string $glue ブラウザの種類とバージョン番号の間のコネクタ
* @return string|array コネクタを渡すと、ブラウザの種類とバージョン番号が接続され、文字列が返されます それ以外の場合不明なブラウザタイプの場合は配列 false を直接返します
*/
function get_client_browser($glue = null) {
$browser = array();
$agent = $_SERVER['HTTP_USER_AGENT'] //クライアント情報を取得します
/* ブラウザー機能の正規表現を定義します*/
$regex = array(
' => '/(Chrome)/(d+.d+)/',
'/(Firefox) /(d+.d+)/',
'opera' => '/ (Opera)/(d+.d+)/',
'safari' => '/バージョン/(d+.d+.d) (Safari)/',
);
foreach($regex as $type => $reg) {
use using through through off ' s ' through out through ‐ through ‐ ‐ ‐ preg_match($ reg、$ data); safari '? false : (is_null($glue) ? $browser : implode($glue, $browser));
}
タイムスタンプに優しい書式設定関数は、ほんの数秒前に
Weiboの一部で表示されましたシステムでは、多くの場合、現在時刻と比較してどれくらい前の時刻かを表示する必要があります。たとえば、今、5 秒前、5 時間前、5 日前などです。このような
/**
*
+------------------------------------------ ------ ------------------------
* 説明 フレンドリー表示時間
+-------- -------- -------------------------------------- -------- --
* @param int $time フォーマットされるタイムスタンプはデフォルトで現在時刻になります
+-------- ---------- --------------------------------------
* @return string $text format 変換されたタイムスタンプ
+-------------------------------------- ---------- ------------------------
* @author yijianqing
+----- ---------- -------------------------------------- ---------- ---
* /
function mdate($time = NULL) {
$text = '';
$time = $time === NULL || $time > time() : intval($) time) ;
$t = time() - $time; //時差 (秒)
if ($t == 0)
$text = 'just';
elseif ($t
$text = $t . '秒前'; // 1分以内
elseif ($t
' 分前' / / 1 時間以内
elseif ($t
$text = Floor($t / (60 * 60)) . // 1 日以内
elseif ($ t
$text = フロア($time/(60*60*24)) ==1 ? '昨日' . date('H:i', $time) : '一昨日' . date('H:i', $time) // 昨日と一昨日
elseif ($t < ; 60 * 60 * 24 *30)
through //1年以内
else
この関数を使用すると、
{$vo.time|mdate}
を使用するだけで時刻をわかりやすく表示できます。手前にある
返されたデータセットをツリー構造に変換します
/**
* 返されたデータセットをツリーに変換します
* @param array $list データセット
* @param string $pk 主キー
* @param string $pid 親ノード名
* @param string $child子ノード名
* @param integer $root ルートノードID
* @return array 変換後のツリー
*/
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root=0) {
$tree = array ();// ツリーを作成します
if(is_array($list)) {
// 主キーに基づいて配列参照を作成します
$refer = array();
foreach ($list as $key => $ data) // 判定 $parent は存在するか? Id = $data[$pid];
if ($root == $parentId) {
}else{
$list[$key]
アバター編集〜アバターを変更しない場合これは現在完了しており、判定コードスニペットがアップロードされます / * if(! $upload->upload()) {// アップロード エラー メッセージ $this->error($upload->getErrorMsg()); }else{// 正常に取得 ファイル情報をアップロード $info = $upload->getUploadFileInfo();} */ は次のように変更されました: $upload->upload();$info = $upload->getUploadFileInfo();
この方法では、画像がアップロードされていなくてもエラーは表示されず、 update()メソッド内で以下の判定を行う: if(is_null($info[0]["savename "]) ){ $data['face']=$_POST['face'];}else{ $data['face']=$info[0]["savename"];
}
配列関数のマージ PHP のネイティブ array_merge を呼び出すとき、最初のパラメーターが空の場合、戻り結果は空になります。この関数はそれに応じてそれを処理します。 function MergeArray($list1,$list2){ if(!isEmpty($list1) && !isEmpty($list2)) {使用する 使用する を通じて ' s ' s ' through ' s ‐ ‐ ‐ ‐ to } else return (isEmpty($list1)?(isEmpty($list2)?null:$list2):$list1);}function isEmpty($data){ return null == $data || false == $data || "" == $data;} Google 翻訳プラグイン呼び出し、CURL を使用して呼び出します Google 翻訳を呼び出すためのインターフェイスカールのサポートをオンにする必要があります。 /* QQ366958903 による Google 翻訳機能 $text 翻訳するテキスト $tl ターゲット言語 $sl 元の言語 $ie 文字エンコーディング */
function 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('#(.*?)
echo translation($text,'en');
?> sq'=>'アルバニア語',
'ar'=>'アラビア語',
'az'= >'アゼルバイジャン ALPHA',
'ga'=>'アイルランド語',
'et'=>'エストニア語',
'be'=>'ベラルーシ語',
'bg'=> ;'ブルガリア語',
'is'=>'アイスランド語',
'pl'=>'ポーランド語',
'fa'=>'ペルシア語',
'af'=>'ブール語 (アフリカーンス語)',
'da '=>'デンマーク語',
'de'=>'ドイツ語',
'ru'=>'ロシア語',
'fr'=> 'フランス語',
'tl' =>'フィリピン語',
'fi'=>'フィンランド語',
'ka'=>'グルジア語アルファ',
'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'=>'INDIUURDUALLPHA',
'id'=>'インドネシア語',
'en'=>'英語',
'vi'=>' ',
'zh-TW'=>'中国語 (繁体字)',
'zh-CN'=>'中国語 (簡体字)',
バックアップ データベース、全体をバックアップできますライブラリまたは部分テーブルのバックアップ
はすべてモジュールに書き込まれます。ライブラリ全体をバックアップすることも、テーブルの部分バックアップ
を選択することもできます。クラスbaksqlaction {public $ config = '';
public $dir_sep = '/'; header("Content-type: text/html;charset= utf-8");
$this-> config = array(
' s ' s ‐ ‐ ‐ ‐ ‐ $this->config = array(
('Db_backup'), バックアップ ファイルはどこにありますか 'iscompress' = & gt; / GZIP 圧縮を開くかどうか [Unbound] 'isdownload' = & gt; 0 // バックアップ完了後にファイルをダウンロードするかどうか [未テスト] ); $this->dbName = C(' DB_NAME'); t;model = new Model(); //$sql = ' set interaction_timeout=24*3600'; ------------------------------------ -------------- ---- * * @ バックアップデータ一覧 * +--------------------- -------------- ------------------------------------ --- ($fileArr as $key => $ path);&lt; $ list [] = array( 'name' =&gt; $ value、}}}}} fist to fist); $ this-&gt; display(); ------------------------------------ * * @ データシートを入手 * +-- -------------------------------------- ----------- -------------------- */ function tablist() {$list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}"); //テーブル情報を取得します
//echo $Backup->getLastSql() ;
------------------------------------------- --- -------------
* * @ データベース全体をバックアップします
* +--------- ----- -------------------------------------- -----
* /
function backall() {
$tables = $this->getTables();
if ($this->backup($tables)) {
$this ->success('データベースのバックアップ成功! ', '/public/ok');
} else {
* +- -------------------- ------------------------------ -------------------- -
* * @ テーブルによるバックアップ、バッチ利用可能
* +------------- --------------------- ----------------------------- --------
" $this->成功( 「データベースのバックアップが成功しました!」 '); S Else
$ this-> 成功しました (' データベースのバックアップが成功しました! ','/public/ok '); );
backup
関数deletebak(){
if(unlink($ this-&gt; config ['path']。$ this-&gt; dir_sep。$ _get ['file']){
$this-> 成功 ('バックアップの削除に成功しました!', '/Public/OK'); ------------------------ ------------------------ --
* * @ バックアップファイルをダウンロード
* +------------ ------------------------ ------------------------ ----------
*/
function downloadBak() {
$ file_name = $_GET['file'];
$file_dir = $this->config['path'] ;! If (! File_exists ($ file_dir. "/". $ FILE_NAME) {// ファイルがあるかどうかを確認します存在します
Return false;
} else {
$ file = FOPEN ($ file_dir. "/". $ file_name, "r") // ファイルを開きます
// ファイルタグを入力します
header ('Content-Encoding: None'); ");
header("Accept-Ranges: bytes");
header("Accept-Length: " . filesize($file_dir . "/" . $file_name) );
header('Content-Transfer-Encoding: binary');
header("Content-Disposition:attachment; filename=" . $file_name) // ダウンロードのためにブラウザに実際のファイル名を提供します
header('プラグマ: no-cache'); header('Expires: 0');
------------------------ ------------------------ * * @ ディレクトリ内のファイルの配列を取得します * +------ --------------------------------- --------------- --------------- * * @ $FilePath ディレクトリ パス * * @ $Order Sort
* +-------------- ------------------------------------ --------------- ----------- * * @ 指定したディレクトリ内のファイル一覧を取得し、配列を返します * +------ ------------ -------------------------------------- ----------- ---- */プライベート機能myscandir($ filepath = './'、$ order = 0){ "$ filepath = opendir($ filepath);
}
/* * ************************************** ***** ********************************************** **** */
/* -
* * +----------------------------------- --- --------------------------------------
* * @ バックアップファイルを読み込む
* + -------------------------------------------------- - ------------
* * @ $fileName ファイル名
* +------------- -------------------------------------------------- -- -------
*/
プライベート関数 getFile($fileName) {
$this->content = '';
$fileName = $this->trimPath($this- > $ext == '.sql') {
$this->content = file_get_contents($fileName); de(' ', gzfile($fileName));
$this->error( 'ファイルが存在しません!'); -------------------------------------- -------- * * @ データをディスクに書き込みます * +---------------------------- ------------ ---------------------------------- */ プライベート関数 setFile() { $recognize = '' ; $recognize = $this->dbName; ,,,,; s') .mt_rand(100000000) , 999999999) .sql'); $path = $this->setPath($fileName); {t $ This- & gt; " バックアップ ディレクトリを作成できません'$ PATH' ");Le If (! File_put_contents ($ FILENAME, $ This-& GT; Content, Lock_ex)) { $ This- & GT Error ('' ファイルの書き込みに失敗しました。ディスク容量またはアクセス許可を確認してください! '); }} else {gzwrite($ gz、$ this-&gt; content);} @ this-&gt; & gt; Downloadfile ($ FILENAME); }}} プライベート関数 Trimpath ($ PATH) { Return Str_replace (Array ('/', '// -,' \\ ') $tmp = '; 7 )) return $tmp; ob_end_clean(); header("キャッシュ制御: 再検証が必要、ポストチェック=0、事前チェック=0"); header('Content-Description: ファイルTransfer'); header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($fileName)); header('Content-Disposition:attachment; filename=' .basename($fileName)); readfile($fileName); } /* - * +-------- ------------------------ ---------------------------- ------ * * @ 文字列に ` ` を追加 * +---- ------------------------- ------------------------- ------------------ * * @ $str string * +------------------- ------------------------ ------------------------ --- * * @ Return `$str` * +--------- ------------------------ ------------------------ -------------- */ プライベート関数バッククォート($ str) { 。 ------------------------
* * @ データベースのすべてのテーブルを取得します * +---- ------------------------------------ -------------- -------------------- * * @ $dbName データベース名 * +-- --------------- ------------------------------------ --------------- ----- */ プライベート関数 getTables($dbName = '') { if (!empty($dbName)) {
$sql = 'SHOW TABLES '; t = $this-> ;モデル->クエリ($sql) ; $info = array();
/ *-
* +--------------------------------------------------------------------------------------------------------- ------- -----------------------
* * @ 渡されたデータを指定された長さに応じて配列に分割します
* + ---------------------------------------------------- ------- ---------------
* * @ $array 分割するデータ
* * @ $byte 分割する長さ
* + ---------------------------------------------------- --------- -------------
* * @ 指定された長さに従って配列を分割し、分割された配列を返します
* +------ ---------------------------------------------------- --------- -------
*/
プライベート関数 chunkArrayByte($array, $byte = 5120) {
$i = 0;
$sum = 0;
$ return = array();
$ sum += strlen($ v); through using を使用して out through out out out out out out out out out -- $return[++$i][ ] = $v;}
/* -
* +---------------------- -------------------------------------- ----------- -------------
* * @ データのバックアップ {各テーブル、ビュー、データをバックアップ}
* * +---- ------------ -------------------------------------- ------------ ------
* * @ $tables バックアップが必要なテーブル配列
* +------------ ---------------- ---------------------------------- ----------------
*/
プライベート関数バックアップ($tables) {
このファイルは MySQLReback ' date(' によって作成されます。 Y-m-d H:i:s') . ' */';
foreach ($tables as $i => $table) { $table = $this-> ; // テーブル名を追加します。 「$ Tablers = $&gt;」 rnドロップビューが存在する場合{$ table};/ * mysqlreback分離 */"。$ Tablers [0] [" Create View "]。";/ * mysqlreback分離 */"; = "rn DROP TABLE IF EXISTS {$table};/* MySQLReback の分離 */ " . $tableRs[0]["Create Table"] . ";/* MySQLReback の分離 */";
$ tableDateRow = $this- >model->query("SELECT * FROM {$table}");S if (FALSE! = $ Tabledaterow) {
Foreach ($ TableACH ($ TableDaterow as & $ Y) { Foreach ($ y as & $ v) { if ($ v == '') //空を0の場合、ツリーを返すように修正します else $v = "'" . "'"; ; /* MySQLReback 分離 */'; if ($values != ';/* MySQLReback Separation */') { >content . = "rn INSERT INTO {$table} VALUES {$values }"; dump($this->content); //}
/* -
* +-- --------------------------------- ----------------- ------------------
* * @ データを復元
* +---- ---------------------------------------------------- --------------- ---
* * @ $fileName ファイル名
* +-------- ---------------------------------------------------- -----
*/
プライベート関数recover_file($fileName ) {
-& gt; content) {
$ SQL = TRIM ($ SQL);
IF (! 空 ($ SQL)) {
$ MES = $this->model->execute($sql); $table_change = array('null' = > '''');
$ sql = strtr($ sql、$ table_change);エラーが発生した場合、エラーを記録します。
$this->_get(); 自動フィルタリングの使用例 $this->_get('a','b','c'); 3 つのパラメータ: a , $ _GET 送信された変数名 b、フィルター関数 ('trim' / 'trim, String' など)。指定されたエラー コードとエラー ページを返す単純な関数httpsstatus('404'); はクライアントに 404 エラーを送信し、エラー ページはカスタマイズできます。 関数をcommon.phpに置くと、自動的にロードされ、自由に呼び出すことができます/** * エラー コードを返し、エラー ページをエントリ ファイル ディレクトリ ./Public/httpstatus に配置します。名前は 404.html、403.html、503.html などです。 * @param $string エラー コード * @ param $msg NOT FOUNDなどのエラーメッセージは省略可能*/function httpstatus($string="404",$msg="") { header ("http/1.1 {$string} {$msg}"); include './Public/httpstatus/'.$string.'.html'; exit;}