Heim > Backend-Entwicklung > PHP-Tutorial > Einige Klassen und Methoden von ThinkPHP

Einige Klassen und Methoden von ThinkPHP

巴扎黑
Freigeben: 2016-11-22 16:13:42
Original
1286 Leute haben es durchsucht

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 ('Name','Wert');  //设置cookie

cookie('name','value',3600); // Cookie('name','value',array('expire'=>3600,') Präfix'=>'think_')); // 指定有效期和前缀

// 下面的代码和上面等效

cookie('name','value','expire=3600&prefix=think_')

删除

删除某个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")."
"; 🎜> }else{

$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:

Artikel lesen

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'; 🎜>

}elseif (preg_match('/Chrome/i',$br)) {

$br = 'Chrome';

} elseif (preg_match('/Safari/ i',$br)) {

$br = 'Safari';

}elseif (preg_match('/Opera/i',$br) ) {

$br = 'Opera';

}else {

      $br = 'Other';

  }

return $br;

}else{return „Fehler beim Abrufen der Browserinformationen!“;}

}

////Besucherbrowser abrufen Sprache

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 = " 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 "
Location:";

$ipadds = $gifo->Getaddress();

foreach($ipadds[0] as $value ){

echo "rn ".iconv("utf-8","gbk",$value);

}

echo "
Browsertyp: ".$gifo->GetBrowser();

echo "
Browser-Sprache:".$gifo->GetLang();

echo "
Betriebssystem: ".$gifo-> ();

?>

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'   => >

          'safari'   =>   '/Version/(d .d .d) ( Safari)/',

);

foreach($regex as $type => ; $reg) {

preg_match($reg, $agent, $data) ;

if(!empty($data) && is_array($data)){

$browser = $type === 'safari' ? array($data[2], $ data[1]): array($data[1], $data[2]);

break ;

}

}

return empty($browser) ? false : (is_null($glue) ? $browser : implode($glue, $browser));

}

Zeitstempelfreundliche Formatierungsfunktion wird gerade jetzt angezeigt, vor ein paar Sekunden

In einigen Weibo-Systemen ist dies der Fall ist oft notwendig, um anzuzeigen, wie lange die Zeit im Vergleich zur aktuellen Zeit zurückliegt, zum Beispiel: gerade jetzt, vor 5 Sekunden, vor 5 Stunden, vor 5 Tagen... Diese Art von

/**

*

------------------------------------- -------- --------------------

* Beschreibung freundliche Anzeigezeit

---------------------------------------- ----------- -

* @param int $time Der zu formatierende Zeitstempel ist standardmäßig die aktuelle Zeit

------ --------------------------------------- ----------- ------------

* @return string $text Formatierter Zeitstempel

------- ------- ------------------------------------------- ------- ----

* @author yijianqing

----------------------- ---- -----------------------------------

*/

Funktion mdate($time = NULL) {

$text = '';

$time = $time === NULL || > time() ? time() : intval($time);

$t = time() - $time; //Zeitdifferenz (Sekunden)

if ($t = = 0)

$text = 'just';

elseif ($t < 60)

              $text = $t . 'vor'; eine Minute  

        elseif ($t < 60 * 60)                                             = floor($t / 60) . 'Vor Minuten'; //Innerhalb einer Stunde

elseif ($t < 60 * 60 * 24)

$text = floor($t / (60 * 60)) // Innerhalb eines Tages

elseif ($t < 60 * 60 * 24 * 3)

$text = floor($time /(60*60*24)) ==1? 'Gestern' . date('H:i', $time) : 'Vorgestern' date('H:i', $time) ; //Gestern und vorgestern

elseif ($t < 60 * 60 * 24 * 30)

$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 >

{$vo.time|mdate}

implementiert zeitfreundliche Darstellung

gibt zurück Konvertieren Sie den Datensatz in eine Baumstruktur

/**

* Konvertieren Sie den zurückgegebenen Datensatz in einen Baum

* @param array $list Datensatz

* @param string $pk Primärschlüssel

* @ param string $pid Name des übergeordneten Knotens

* @param string $child Name des untergeordneten Knotens

* @param integer $root Wurzelknoten-ID

* @return array Konvertierter Baum

*/

function list_to_tree($list, $pk = 'id', $pid = 'pid' , $child = '_child', $root=0) {

$tree = array();// Baum erstellen

if(is_array($list)) {

// Erstellen Sie eine Array-Referenz basierend auf dem Primärschlüssel [$pk]] =& $list[$key];

                                                                                                                          

// 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];

🎜>

Avatar bearbeiten – Wenn der Avatar nicht geändert wird

Dies wird derzeit durchgeführt und das Urteilscodesegment wird hochgeladen

/* if(!$upload->upload()) {/ /Upload-Fehlermeldung

$this->error($upload->getErrorMsg());

}else{// Der Upload ist erfolgreich und die hochgeladenen Dateiinformationen werden abgerufen

$info = $upload ->getUploadFileInfo();

} */

geändert in:

$upload- >upload();

$info = $upload->getUploadFileInfo();

Auf diese Weise wird kein Fehler angezeigt, selbst wenn das Bild vorhanden ist nicht hochgeladen, und fügen Sie dann

Treffen Sie das folgende Urteil in der update()-Methode:

if(is_null ($info[0]["savename"])){

$data['face']=$_POST['face'];

}else{

$data['face']=$info[0]["savename"];

}

Array-Zusammenführungsfunktion

Wenn beim Aufruf von PHPs nativem array_merge der erste Parameter leer ist, führt dies dazu, dass das Rückgabeergebnis leer ist. Diese Funktion behandelt es entsprechend.

Funktion MergeArray($list1,$list2)

{

if(!isEmpty($list1) && !isEmpty($list2))

{

                                                                    ,                                                       Return array_merge($list1,$list2 ):$list1);

}

function isEmpty($data)

{

return null == $data ||. false == $data || "" == $data;

Aufruf des Google Translate-Plug-ins, CURL zum Abrufen verwenden

Um die Google Translate-Schnittstelle aufzurufen, müssen Sie die Curl-Unterstützung aktivieren.

/*

Google Translate-Funktion von QQ366958903

$text Der zu übersetzende Text

$tl Zielsprache <<> <$> $ SL-Primitivsprache

$ 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('#(.*?)

#',$html,$doc);

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

'iscompress' = & gt; 0, // Ob GZIP-Komprimierung aktiviert werden soll [Unbound]

'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;

}

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage