Thinkphp-Code
Client-IP-Adresse abrufen
Client-IP-Adresse abrufen
$type bedeutet Rückgabetyp 0 Rückgabe-IP-Adresse 1 Rückgabe IPV4-Adressnummer
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'])) {
$arr = explosion( ',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($ arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR '] ;
}
// Rechtliche Überprüfung der IP-Adresse
$long = ip2long($ip);
$ip = $long array($ ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
Formatierung der Dateibytegröße
Byteformatierung formatiert die Bytezahl als die durch B K M G T beschriebene Größe
Funktion 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];
}
oder
function get_size($s,$ u='B ',$p=1){
$us = array('B'=>'K','K'=>'M','M'=>' G',' G'=>'T');
return (($u!=='B')&&(!isset($us[$u]))||($s< ;1024)) ?(number_format($s,$p)." $u"):(get_size($s/1024,$us[$u],$p));
}
Regenbogenzeichenfolge anzeigen
wird zum Anzeigen der Regenbogenzeichenfolge verwendet, unterstützt UTF8 und Chinesisch, der Effekt ist wie folgt:
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(" X",mt_rand(0,255)).sprintf(" >Lassen Sie PHP Datei-Downloads schneller bereitstellen
Im Allgemeinen können wir die URL direkt auf eine Datei verweisen, die sich unter der Dokumentstammdatei befindet, um Benutzer zum Herunterladen von Dateien zu führen
Auf diese Weise ist es jedoch nicht möglich, einige Statistiken, Berechtigungsprüfungen usw. durchzuführen. Daher verwenden wir häufig PHP, um Dateidownloads weiterzuleiten und Benutzern bereitzustellen.
$file = "/tmp/dummy.tar.gz";
header("Content -type: application/octet-stream");
header('Content-Disposition : attachment; filename="' . basename($file) . '"');
header( "Content-Length: ". filesize($file));
readfile($ Datei);
Dabei gibt es jedoch ein Problem, das heißt, wenn die Datei einen chinesischen Namen hat. Wenn ja, haben einige Benutzer nach dem Herunterladen möglicherweise verstümmelte Dateinamen 🎜>
Nehmen wir also einige Änderungen vor (Referenz: :
$file = "/tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream ");
// Verarbeitung chinesischer Dateinamen
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace(" ", " ", $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);
Nun, es sieht jetzt viel besser aus, aber es gibt immer noch ein Problem, und das ist readfile. Obwohl PHPs readfile versucht, so effizient wie möglich zu sein und PHPs nicht zu belegen Eigener Speicher. Tatsächlich muss jedoch immer noch MMAP (falls unterstützt) oder ein fester Puffer verwendet werden, um die Datei zu durchlaufen und sie direkt auszugeben.
Bei der Ausgabe, falls dies der Fall ist Apache PHP-Mod, dann muss es auch an den Ausgabepuffer von Apache gesendet werden, wenn es separat bereitgestellt wird, bringt es auch zusätzliche Netzwerk-E/A >
Kann der Webserver dann die Datei direkt an den Benutzer senden, ohne die PHP-Schicht zu durchlaufen
Heute habe ich einen interessanten Artikel gesehen: Wie ich PHP verwende: X-SendFile.
Wir können Apaches Modul mod_xsendfile verwenden, um Apache diese Datei direkt an den Benutzer senden zu lassen:
$ file = "/ tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream");
// Verarbeitung chinesischer Dateinamen
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace (" ", " ", $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="' . basename($file) . '"');
//Let Xsendfile Send file
header("X-Sendfile: $file");
Der X-Sendfile-Header wird von Apache verarbeitet und die Antwort Die Datei wird direkt an den Client gesendet.
Lighttpd und Nginx haben auch ähnliche Module. Wenn Sie interessiert sind, können Sie danach suchen
Konfigurieren Sie die htaccess-Datei so, dass index.php ausgeblendet wird
Wird verwendet, um index.php in der URL-Adresse unter der Apache-Umgebung auszublenden
RewriteEngine on
RewriteCond %{REQUEST_FILENAME } !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA, PT,L]
< ;/IfModule>
Leerzeichen und Kommentare im PHP-Code entfernen
PHP hat eine eingebaute -in php_strip_whitespace-Methode zum Lesen von PHP-Dateien und zum Entfernen von Leerzeichen und Kommentaren im Code, unterstützt jedoch nicht das direkte Lesen des Inhalts zum Entfernen von Leerzeichen und Kommentaren. Die folgende Methode kann das Lesen von Zeichenfolgeninhalten unterstützen, und das ThinkPHP-Framework verfügt über diese Methode eingebaut.
/**
* Leerzeichen und Kommentare im Code entfernen
* @param string $content code content
* @return string
*/
function strip_whitespace($content) {
$stripStr = '';
//PHP-Quelle analysieren Code
$tokens = token_get_all($content);
$last_space = false;
for ($i = 0, $j = count($tokens); $ i < $j; $i ) {
if (is_string($tokens[$i])) {
$last_space = false;
$stripStr .= $ Tokens [$ i];
} else {
Switch ($ tokens [$ i] [0]) {
// Verschiedene PHP-Notizen filtern
// FILTER -Spaziergänge
case t_whITespace:
if (! $ Last_space) {
}
break;
case T_START_HEREDOC:
$stripStr .= "<< Pause; Fall T_END_HEREDOC : $stripStr .= "THINK;n"; for($k = $i 1; $k < $j; $k ) { wenn (is_string($tokens[$k]) && $tokens[$k] == ';') { $i = $k; break; } else if($tokens[$k][0] == T_CLOSE_TAG) { break; } Pause; default: $last_space = false; $stripStr .=. $tokens[$i][1]; } } } return $stripStr; } 检查字符串是否是UTF8编码 用于判断某个字符串是否采用UTF8编码 function is_utf8($string){ return preg_match('%^(?: [x09x0Ax0Dx20-x7E] # ASCII | [xC2-xDF][x80-xBF] # nicht überlanges 2-Byte | xE0[xA0-xBF][x80-xBF] # ohne Überlängen | [xE1-xECxEExEF][x80-xBF]{2} # gerade 3-Byte | xED[x80-x9F][x80-xBF] # ohne Ersatzzeichen | xF0[x90-xBF][x80-xBF]{2} # Ebenen 1-3 | [xF1-xF3][x80-xBF]{3} # Ebenen 4-15 | xF4[x80-x8F][x80-xBF]{2} # Ebene 16 )*$%xs', $string); } XSS安全过滤 Funktionsentfernung_xss($val) { // alle nicht druckbaren Zeichen entfernen. CR(0a) und LF(0b) und TAB(9) sind zulässig // dies verhindert einige Zeichenumstellungen wie // Beachten Sie, dass Sie dies getan haben um Teilungen mit n, r und t später zu verarbeiten, da sie in einigen Eingaben *erlaubt* sind $val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/' , '', $val); // direkte Ersetzungen, der Benutzer sollte diese niemals benötigen, da es sich um normale Zeichen handelt // dies verhindert wie $search = 'abcdefghijklmnopqrstuvwxyz'; $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $search .= '1234567890!@# $%^&*()'; $search .= '~`";:? /={}[]-_|'\'; for ($i = 0; $i < strlen($i ) { // ;? entspricht dem ;, was optional ist // 0{0,7} entspricht jedem Nullen, die optional sind und bis zu 8 Zeichen lang sind // @ @ Suche nach den Hexadezimalwerten $val = preg_replace('/([xX]0{0,8 }'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // mit einem ; // @ @ 0{0,7} stimmt null bis sieben Mal mit „0“ überein $val = preg_replace('/(�{0,8}'.ord($search[$i]).';?) /', $search[$i], $val); // mit einem ; } // jetzt sind die einzigen verbleibenden Leerzeichenangriffe t, n und r $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', 'ondragerd', 'ondragerter', '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; // weiter ersetzen, solange die vorherige Runde etwas ersetzt hat while ($found == true) { $val_before = $val; for ($i = 0; $i < sizeof($ra); $i ) { $pattern = '/'; for ($j = 0; $j < [$i] ); 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).'< x>'.substr($ra[$i], 2); // hinzufügen <> um das Tag abzuschwächen $val = preg_replace($pattern, $replacement, $val); // Hex-Tags herausfiltern if ($val_before == $val) { // Es wurden keine Ersetzungen vorgenommen, also Schleife verlassen $found = false ; } } } return $val; } 删除 删除某个cookie值,可以用: cookie('name',null); Wenn Sie Cookies löschen müssen, können Sie Folgendes verwenden: cookie(null); // Alle Cookie-Werte des aktuell festgelegten Präfixes löschen cookie(null,'think_ '); // Alle Cookie-Werte des angegebenen Präfixes löschen Der Bestätigungscode kann nicht angezeigt werden? Dies liegt normalerweise an den Stücklisteninformationen Code kann das Problem lösen, dass der Bestätigungscode nicht angezeigt wird (Batch-Code zum Entfernen von Stücklisteninformationen). Manchmal gibt es kein Problem, wenn wir den Bestätigungscode in der lokalen Testumgebung anzeigen müssen Der Server, an dem der Bestätigungscode angezeigt werden muss, kann nicht angezeigt werden. Wenn Sie auch auf das gleiche Problem stoßen, lesen Sie bitte unten. Die meisten Probleme werden durch Stücklisten-Header-Informationen verursacht thinkphp-Konfigurationsdateien müssen Stücklisten-Header-Informationen entfernen. Was sind Stücklisten-Header-Informationen? Dann führen Sie es aus. Zum Beispiel: Ich erstelle eine neue delBom.php-Datei im Stammverzeichnis. Der Code lautet wie folgt: if (isset($ _GET['dir'])){ //Dateiverzeichnis festlegen $basedir=$_GET[ 'dir']; }else{ $basedir = ' .'; $auto = 1; >checkdir($basedir); function checkdir($basedir){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..'){ if (!is_dir($ basedir."/".$file)) { echo "filename: $basedir/ $file ".checkBOM("$basedir/$file")." $dirname = $basedir."/".$file; checkdir($dirname); } } closedir($dh); } } function checkBOM ($filename) { global $auto; $contents = file_get_contents($filename); $charset[1] = substr($contents, 0, 1); charset[2] = substr($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 , $rest); return ("BOM gefunden, automatisch entfernt ._http://www.k686. com"); } else { return („BOM gefunden.“); ."); } function rewrite ($filename, $ data) { $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data) ; fclose($filenum); ?> Verwendung der U-Methode Beispielsweise kann die Adressmethode in Modellen oder Vorlagen verwendet werden. Die U-Methode ist eine Methode Wird in ThinkPHP zum automatischen Generieren von URL-Adressen verwendet. Es kann Ihnen dabei helfen, aufgrund unterschiedlicher Umgebungen und Konfigurationen automatisch entsprechende URL-Adressen zu generieren. Funktionen sind wie folgt: 1. Identifizieren Sie automatisch das aktuelle URL-Muster 2. Identifizieren Sie automatisch den aktuellen Domänennamen und Unterstützung für Domänennamen auf sekundärer Ebene 4. Unterstützung für Pseudostatik und Ankerpunkte 5. Daher ist dies bei Verwendung der U-Methode grundsätzlich nicht der Fall Sie müssen auf die aktuelle Verwendung achten. Welche URL-Muster und Konfigurationsparameter es gibt, rufen Sie sie einfach gemäß den einheitlichen Regeln der U-Methode auf. Die U-Methode identifiziert sie automatisch, wenn die URL-Adresse tatsächlich generiert wird. Im Folgenden sind einige grundlegende Verwendungen aufgeführt: // Die Leseoperationsadresse des aktuellen Moduls, die eingehende Parameter-ID ist 5 U('read','id =5 '); Wenn Sie eine Variable übergeben möchten, verwenden Sie: U('read','id='.$vo['id ']); Wenn Ihre U-Methode in einer Vorlage aufgerufen wird, muss sie im Allgemeinen wie folgt geschrieben werden: Generieren Sie die Indexoperationsadresse des Blog-Moduls und übergeben Sie weitere Parameter: U(' blog/index','cate_id=5&type=1'); Natürlich können Sie auch ein Array verwenden, um Parameter zu übergeben: U('blog/index',array ('cate_id'=>5,'type'=>1)); Wenn es wenige Parameter gibt, können Sie auch Übergeben Sie es direkt im ersten Parameter: U('Blog/read?id=5'); U('Blog/cate?cate_id=1&status=1') Unterstützte Gruppengenerierung: U('Home/Blog/read?id=5'); // Die Leseoperationsadresse des Blog-Moduls unter der Home-Gruppe U('Admin/Blog/cate?cate_id=1&status =1 ');// Admin-Gruppierung bedeutet, dass die U-Methode automatisch das aktuell konfigurierte pseudostatische Suffix hinzufügt, wenn Sie mehrere pseudostatische Suffixe konfigurieren Suffixe, dann Das erste wird standardmäßig hinzugefügt. Wenn Sie ein pseudostatisches Suffix angeben müssen, können Sie auch Folgendes verwenden: U('Blog/read','id=1','xml' ); bedeutet die Ausgabe einer URL-Adresse mit einem pseudostatischen Suffix von „, zum Beispiel: U('/news/1'); bedeutet, dass die zu generierende URL-Adresse eine Routing-Adresse wie news/1 ist. Wenn Sie eine URL-Adresse mit einem Domänennamen generieren müssen, können Sie Folgendes verwenden: U('Blog/read@blog.thinkphp.cn',' id=1') ; oder U('Blog/read@blog','id=1'); bedeutet: Verwenden Sie die Blog-Domainnamenadresse der zweiten Ebene des aktuellen Domainnamens. Unterstützt die Ankerpunktgenerierung (beachten Sie, dass Sie die neueste Git-Version aktualisieren müssen, um sie zu unterstützen) U('Blog/read#review','id= 5'); Die generierte URL-Adresse hat am Ende einen #review-Anker, um den Sprung zum Kommentarbereich zu erleichtern. Legen Sie den HTTP-Cache des Bildes fest. Sie können auch JS und CSS festlegen. Wenn es sich um eine Apache-Umgebung handelt, können Sie hinzufügen es in der .htaccess-Datei Der folgende Code wird verwendet, um den HTTP-Cache und die Gültigkeitsdauer von Bildern festzulegen (Sie müssen die Unterstützung des Header-Moduls von Apache aktivieren), den Anforderungsdruck für Bildressourcen auf der Website verringern und die Zugriffsgeschwindigkeit verbessern Ihr Pagespeed-Wert^_^. Header-Set Cache-Control "max-age=604800" Der obige Code stellt die Bilder der Website so ein, dass sie einen einwöchigen HTTP-Cache verwenden Sie können auch HTTP-Caching zu JS- oder CSS-Dateien hinzufügen. Überprüfen Sie, ob in der Zeichenfolge ein externer Link vorhanden ist /** * all_external_link erkennt, ob die Zeichenfolge externe Links enthält * @param string $text text * @param string $host domain name * @ Rückgabe boolean false mit externen Links true ohne externe Links */ Funktion all_external_link ($ text = '', $host = '') { if (empty($host)) $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 true; } in htaccess-Einstellung der Domänennamenumleitung wird nur in der Apache-Umgebung verwendet. Sie können den folgenden Code in die htaccess-Datei einfügen, er wird natürlich auf www.abc.com umgeleitet kann auch eine direkte Umleitung auf andere Domainnamen festlegen. RewriteEngine on RewriteCond %{HTTP_HOST} ^abc.com$ [NC] RewriteRule ^(. *)$ http://www.abc.com/$1 [R=301,L] PHP erhält die IP des Clients, geografische Informationen, Browserinformationen und die lokale echte IP // Funktion zum Abrufen der IP, geografischen Informationen, des Browsers und der lokalen echten IP des Clients class get_gust_info { ////Besucher-Browsertyp abrufen function GetBrowser(){ if(! empty ($_SERVER['HTTP_USER_AGENT'])){ $br = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/MSIE/i',$br)) { $br = 'MSIE'; 🎜> $lang = substr($lang,0,5); if(preg_match("/zh-cn/i",$lang)){ $lang = " Vereinfachtes Chinesisch"; }elseif(preg_match("/zh/i",$lang)){ $lang = "Traditionelles Chinesisch"; }else{ $lang = "English"; } return $lang; }else{return "Get browser Language gescheitert! 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 = 'Other'; } return $OS; }else{return „Informationen zum Gastbetriebssystem konnten nicht abgerufen werden!“;} } ////Die echte IP des Besuchers abrufen function Getip(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $ip = $_SERVER["HTTP_CLIENT_IP"]; } if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ //Proxy-IP abrufen $ips = explosion(',',$_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])){//Exclude LAN ip $ip = $ips[$i]; break; if($tip=="127.0.0.1"){ //Erhalte die lokale echte IP return $this->get_onlineip() ; }else { return $tip; Lokale echte IP abrufen function get_onlineip() { $mip = file_get_contents("http://city.ip138.com/city0.asp"); if ($mip){ preg_match("/[.*]/",$mip,$sip); return preg_replace($p,"",$sip[0]) ; }else{return „Fehler beim Abrufen der lokalen IP! ";} } ////Den Standortnamen des Besuchers basierend auf der IP abrufen function Getaddress($ip=''){ if(empty($ip)){ $ip = $this->Getip(); } $ipadd = file_get_contents (" http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);//Get entsprechend der Sina-API-Schnittstelle if($ipadd){ $charset = iconv("gbk","utf-8",$ipadd); preg_match_all("/[x{4e00}-x{9fa5}] /u", $charset, $ipadds); return $ipadds; //Ein zweidimensionales Array zurückgeben }else{return "addree is none";} } } $gifo = new get_gust_info(); echo „Your ip:“.$gifo->Getip(); echo " $ipadds = $gifo->Getaddress(); foreach($ipadds[0] as $value ){ echo "rn ".iconv("utf-8","gbk",$value); } echo " echo " echo " ?> URL-sichere String-Base64-Kodierung und -Dekodierung Wenn Sie die Methoden base64_encode und base64_decode direkt verwenden, ist die generierte Zeichenfolge möglicherweise nicht für URL-Adressen geeignet. Die folgende Methode kann dieses Problem lösen: URL-sichere String-Kodierung: function urlsafe_b64encode($string) { $data = base64_encode($string); $ data = str_replace(array(' ','/','='),array('-','_',''),$data); return $data; } URL-sichere String-Dekodierung: function urlsafe_b64decode($string) { $data = str_replace(array('- ','_ '),array(' ','/'),$string); $mod4 = strlen($data) % 4; if ($mod4) { $data .= substr('====', $mod4); } return base64_decode($data); } Client-Browserinformationen abrufen /** * Holen Sie sich den Client-Browsertyp * @param string $glue Der Konnektor zwischen dem Browsertyp und der Versionsnummer * @return string|array Übergeben Sie die Verbindung. Wenn der Wenn das Symbol verwendet wird, werden der Browsertyp und die Versionsnummer verbunden, um eine Zeichenfolge zurückzugeben. Andernfalls wird als Array direkt ein unbekannter Browsertyp zurückgegeben*/ function get_client_browser($glue = null) { $browser = array(); $agent = $_SERVER['HTTP_USER_AGENT']; //Client-Informationen abrufen /* Browserfunktion regelmäßig definieren Ausdrücke*/ $regex = array( > 'opera' => > $text = date('m Monat d Tag H:i', $time); //Innerhalb eines Monats elseif ($t < 60 * 60 * 24 * 365) $text = date('m Monat d Tag', $time); //Innerhalb eines Jahres else $text = date('Y Jahr m Monat d Tag' , $time); //Vor einem Jahr return $text; } Um diese Funktion zu verwenden, müssen wir nur < verwenden 🎜 im Vordergrund > // Bestimmen Sie, ob es ein übergeordnetes $ gibt Parentid = $ data [$ pid]; IF ($ root == $ Parentid) { $ tree $data[$pk]] =& $list[$key]; }else{ $parent =& $refer[$parentId]; $parent[$child][] =& $list[$key];
"; 🎜> }else{
Location:";
Browsertyp: ".$gifo->GetBrowser();
Browser-Sprache:".$gifo->GetLang();
Betriebssystem: ".$gifo-> ();
$ dh i-Zeichencodierung
*/
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('#(.*?)
return strip_tags($doc['1'],'
');
}
/ /Beispiel: Text ins Englische übersetzen
$text='Hello';
echo translator($text,'en');
?>
Sprachabkürzungs-Korrespondenztabelle
'auto'=>'Sprache erkennen',
'sq'=>' ,
'ar'=>'Arabisch',
'az'=>'Aserbaidschanisches ALPHA',
'ga'=> ;'Irisch',
'et'=>'Estnisch',
'be'=>'Weißrussisch',
'bg'= >'Bulgarisch',
'is'=>'Isländisch',
'pl'=>'Polnisch',
'fa' =>'Persisch',
'af'=>'Boolean (Afrikaans)',
'da'=>'Dänisch',
'de'=>'Deutsch',
'ru'=>'Russisch',
'fr'=>'Französisch',
'tl'=>'Filipino',
'fi'=>'Finnisch',
'ka'=>'Georgian ALPHA',
'ht'=>'Haitian Creole ALPHA',
'ko'=>'Koreanisch',
'nl'=>'Niederländisch',
'gl'=>'Galizisch',
'ca'=>'Katalanisch',
'cs '=>'Tschechisch',
'hr'=>'Kroatisch',
'lv '=>'Lettisch',
' lt'=>'Litauisch',
'ro'=>'Rumänisch',
'mt'= >'Maltesisch',
'ms'=>'Malaiisch',
'mk'=>'Mazedonisch',
'no'=> 'Norwegisch',
'pt'=>'Portugiesisch',
'ja'=>'Japanisch',
'sv'=>'Schwedisch ',
'sr'=>'Serbisch',
'sk'=>'Slowakisch',
'sl'=>'Slowenisch',
'sw'=>'Swahili',
'th'=>'Thai',
'tr'=>'Türkisch',
'cy'=>'Welsh',
'uk'=>'Ukrainisch',
'eu'=>'Spain Sk ALPHA',
'es'=>'Spanisch',
'iw'=>'Hebräisch',
'el' =>'Griechisch',
'hu'=>'Ungarisch',
'hy'=>'Armenisches ALPHA',
'it'=>'Italienisch',
'yi'=>'Jiddisch',
'hi'=>'Hindi',
'ur'=>'INDIAN URDU ALPHA',
'id'=>'Indonesisch',
'en'=>'Englisch',
'vi'=>'Vietnamesisch',
' zh-TW'=>'Chinesisch (traditionell)',
'zh-CN' =>'Chinesisch (vereinfacht)',
Sichern Sie die Datenbank. Sie können die gesamte Datenbank oder einige Tabellen sichern.
Alle im Modul geschriebenen Daten. Jetzt können Sie die gesamte Datenbank sichern oder sich für die Sicherung von Teiltabellen entscheiden
Korrektur eines Fehlers, Zeile 361 leer wurde falsch verwendet
class BaksqlAction erweitert CommonAction {
public $config = ''; / $content; //Datenbankname
public $dir_sep = '/'; 🎜>
parent::_initialize(); header("Content-type: text/html;charset=utf-8"); set_time_limit(0); //Kein Timeout ini_set('memory_limit' ,'500M'); //Wo werden die Sicherungsdateien gespeichert'isdownload' = & gt; 0 // > );
$this-> dbName = C('DB_NAME'); $this->model = new Model();
//$sql = 'set Interactive_timeout=24*3600'; //$sql = 'set Interactive_timeout= 24*3600'; 🎜> }
/* -
* ----------- -------- ----------------------------------------
* * @ Liste der gesicherten Daten
* -------------------------------- ------- ----------------------------------
*/
function index( ) {
$path = $this->config['path'];
$fileArr = $this->MyScandir($path) ;
foreach ($fileArr as $key => $value) {
using using using using using using ' use using using ' durch durch durch durch durch durch durch durch durch durch aus durch aus durch aus durch ''s' ‐ ‐ ‐ ‐ If ($key > 1) ('Y-m-d H:i:s', filemtime($path . '/' . $value));
$fileSize = filesize($path . '/' . $value) / 1024;
Number_format($fileSize / 1024, 2 ) ' MB'; 🎜 > } } $this->assign('list', $list); $this->display(); } /* - * --------------------------------- ------- ------------ * * @ Datenblatt abrufen * ---- -------------------------------------------- ------ ------------------- */ Funktion tablist() {$list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}" //Tabelleninformationen abrufen
//echo $Backup - >getLastSql();
$this->assign('list', $list);
$this->display();
}
/* -
* ---------------------------------- - ----------------------------------------------
* * @ Gesamte Datenbank sichern
* --------------------------------- ------------- ---------------
*/
function backall() {
$tables = $this->getTables();
if ($this->backup($tables)) {
$this->success(' Datenbanksicherung erfolgreich! ', '/public/ok');
} else {
$this->error(' Datenbanksicherung fehlgeschlagen!');
}
}
/* -
* ------------- ------------- ------------------------------------- -------------
* * @ Sicherung nach Tabelle, Batch
* ---------------- ---------------- ---------------------------------- ------
*/
function backtables() {
$tab = $_REQUEST['tab'];
if ( is_array($tab))
$tables = $ tab;
(is_array($tab))
$this->success('Datenbanksicherung erfolgreich! ');
Datenbanksicherung fehlgeschlagen!
} else {
$ this- & gt; Fehler ('Datenwiederherstellung fehlgeschlagen!'); /Datensicherung löschen function deletebak() { if (unlink($this->config['path'] . $this->dir_sep . $_GET['file' ])) { > ---------- ------------ ------- * * @ Sicherungsdatei herunterladen * ---------- ------------------------ ------------ ------------ */ function downloadBak() { $ file_name = $_GET['file']; $file_dir = $this->config['path']; if (!file_exists($file_dir . "/" . $ file_name)) { //Überprüfen Sie, ob die Datei existiert ; // Datei öffnen header('Content-Encoding: none'); " header ("Accept-Ranges: Bytes"); header("Accept-Length: " . filesize($file_dir . "/" . $file_name));
header('Content-Transfer-Encoding: binär');
header("Content-Disposition: attachment; filename=" . $file_name); // Geben Sie dem Browser den tatsächlichen Dateinamen an downloading
header('Pragma: no-cache');
header('Expires: 0');
//Inhalt der Ausgabedatei
echo fread($file, filesize($file_dir . "/" . $file_name));
fclose($file);
Exit; * -
* ---------------------------------- ------- ---------------------------------
* * @ Ruft das Array der Dateien im Verzeichnis ab
* -------------------------------------------- --------------------------------
* * @ $FilePath Verzeichnispfad
* * @ $Order Sort
* ---------------------------------- -- ---------------------------------------------
* * @ Ruft das angegebene Verzeichnis ab. Die Dateiliste unter gibt das Array zurück
* ---------------------------- ------------ ------------------------------------
*/
private Funktion MyScandir($FilePath = './', $Order = 0) {
$FilePath = opendir($FilePath);
while ($filename = readdir($FilePath)) {
$fileArr[] = $filename; 🎜> **** ***** **************************************** ******** ****** */
/* -
* --------- ----------------------------------------- ----
* * @ Sicherungsdatei lesen
* -------------------------- --------- -----------------------------------------
* * @ $fileName Dateiname
* ---------------------------------- ----- --------------------------------
*/
private Funktion getFile( $fileName) {
$this->content = '';
$fileName = $this->trimPath($this->config[' path'] . $this ->dir_sep . $fileName);
if (is_file($fileName)) {
$ext = strrchr($fileName, '.');
. gz') {
$this->content = implode('', gzfile($fileName)); Fehler ('Unerkanntes Dateiformat!'); > }
/* -
* --------------------- ----------- --------------------------------------- -
* * @ Schreiben Daten auf Festplatte
* * ---------------------------- ----------- ------------------------------------
*/
private Funktion setFile() {
$recognize = '';
$recognize = $this->dbName;
$fileName = $this->trimPath( $this->config['path'] . $this->dir_sep . date('YmdHis') .
$path = $this->setPath($fileName);
if ($path !== true) {
$this->error(" Das Sicherungsverzeichnis „$path“ kann nicht erstellt werden); {
;
}
} else {
if (function_exists('gzwrite')) {
$fileName.= ' .z' ;
gzclose($gz) ; } Else {
$ this- & gt; error ('' 'Das Schreiben der Datei ist fehlgeschlagen, bitte überprüfen Sie den Speicherplatz oder Berechtigungen!');
}
🎜> if ($ this->config['isDownload']) {
$this->downloadFile($fileName );
} }
}
private function trimPath($path) {
return str_replace(array('/', '\', '//', '\\'), $this->dir_sep, $path);
}
private function setPath($fileName) {
$ dirs = explosion($this->dir_sep, dirname($fileName));
$tmp = '';
foreach ($dirs as $dir) {
$tmp .= $dir . $this->dir_sep;
if (! file_exists ($ TMP) &&! @mkdir ($ TMP, 0777))
Return $ TMP;
}
Return true; 🎜>
//Nicht getestet private function downloadFile($fileName) { ob_end_clean(); 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)) ; readfile($fileName); } /* - * -------------- ---------------------------------- ---------------- -------- * * @ Fügen Sie ` ` zur Zeichenfolge hinzu * ---- ---------------------- -------------- ---------- * * @ $str String * ------- --------------------- --------------- ----- * * @ Return `$str` * ----------- ------------------------- ----------- ------------ */ private function backquote($str) { return "`{$str}`"; } /* - * -- ------------------------- ------------------------ ------ * * @ Alle Tabellen der Datenbank abrufen * --------- --------- -------------------------- ------------- * * @ $dbName Datenbankname * ----------------- ------------------------ ------------------------- ----- */ private Funktion getTables($ dbName = '') { if (!empty($dbName)) {$result = $this-> model->query($sql);
$info = array();
foreach ($result as $key => $val) {
$info[$key] = current($val);
}
return $ info;
}
/* -
* ------------------------ - ---------------------------------------
* * @ Split the Daten entsprechend der angegebenen Länge in Arrays übergeben
* * ------------------------- -------- -----------------------------------------
* * @ $array Die zu teilenden Daten
* * @ $byte Die zu teilende Länge
* ---------------- --- ----------------------------------------------- --- ---
* * @ Teilen Sie das Array um die angegebene Länge und geben Sie das geteilte Array zurück
* --------------- ---- ---------------------------------------------- ---- ---
*/
private Funktion chunkArrayByte($array, $byte = 5120) {
$i = 0;
$sum = 0;
$return = array();
foreach ($array as $v) {
$sum = strlen($v);
; $return[$i] [] = $v;
$i ;
$sum = 0;
}
}
Return $return;
}
/* -
* ------------- ------------- ------------------------------------- -----------
* * @ Daten sichern {Jede Tabelle, Ansicht und Daten sichern🎜>
* ----------- ---------------- ---------------------------------- -------------- * * @ $tables Tabellenarray, das gesichert werden muss * * --------- ----------------------- ------------- ------------- */ private function backup($tables) { if (empty($tables)) $this->error('Es müssen keine Datentabellen gesichert werden!'); $this->content = '/* Diese Datei wurde von MySQLReback erstellt ('Y-m-d H:i:s') . ' */'; foreach ($ as $i => $table) { $table = $this->backquote ($table); $this ->model->query("SHOW CREATE TABLE {$table}" //Erstellungsanweisung der aktuellen Tabelle abrufen if (!empty($tableRs [0]["Create View"] ; IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create View"] . ";/* MySQLReback Separation */";} if (!empty($tableRs[0]["Create Table"])) { $this->content .= "rn /* Tabellenstruktur erstellen {$table} */"; $this->content .= "rn DROP TABLE IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Tabelle erstellen "] . ";/* MySQLReback Separation * /"; $tableDateRow = $this->model->query("SELECT * FROM {$table}");
$values = '';
&$v) {
if ($ v == '') // Return TREE
$ v = 'null' beim Korrigieren von emph auf 0; // 🎜> $ v = "'" . mysql_escape_string($v) . "'" $valuesArr[] = '(' . implode (',', $y) . ')'; sArr);
) ';/* MySQLReback Separation */';
* Daten einfügen { $table} */";
🎜> }
}
}
if (!empty($this->content)) {
$this->setFile();
}
return true;
}
/* -
* ----------------- --------- ----------------------------------------- -------
* * @ Daten wiederherstellen
* * ------------------------ ---------------- ----------------------------------
* * @ $fileName Dateiname
* ------------------------------ ---------- ------------
*/
private Funktion „recover_file($fileName)“ {
$this->getFile($fileName); * MySQLReback Separation */', $this->content);
foreach ($content as $i => $sql) {
if (!empty($sql)) {
$mes = $this->model-> execute($sql);
if (false = == $ Mes) {// Wenn null einen Schreibfehler verursacht, ersetzen Sie ihn durch '
$ table_change = array (' null '= & gt ;' '');
}
Bei der Wiederherstellung ist ein Problem aufgetreten:';
"rn. $sql";
set_log($log_text); 🎜> }
} else {
?>
$this->_get(); Anwendungsbeispiel für automatische Filterung
$this- >_get('a','b','c');
Drei Parameter:
a, $_GET-Übermittlung Der angezeigte Variablenname;
b Filterfunktion (mehrere durch Kommas getrennt, z. B. „trim“ / „trim,String“) ;
c, Standardwert;
Eine einfache Funktion, die den angegebenen Fehlercode und die angegebene Fehlerseite zurückgibt
httpstatus('404' );
sendet einen 404-Fehler an den Client und die Fehlerseite ist anpassbar.
Fügen Sie die Funktion in common.php ein, sie wird automatisch geladen und Sie können sie nach Belieben aufrufen
/**
* Geben Sie den Fehlercode zurück und platzieren Sie die Fehlerseite im Eintragsdateiverzeichnis ./Public/httpstatus mit den Namen 404.html, 403.html, 503.html usw.
* @ param $string Fehlercode
* @param $msg Fehlermeldung wie NOT FOUND, Sie können
weglassen*/
function httpstatus($ string="404 ",$msg=""){
header("http/1.1 {$string} {$msg}");
include './Public/httpstatus/ '.$string .'.html';
exit;
}