検索
ホームページバックエンド開発PHPチュートリアルThinkPHP のいくつかのタイプとメソッド

ThinkPHP
の一部のクラスとメソッド

ThinkPHP コード

クライアント IP アドレスを取得します

?

クライアント IP アドレスを取得します

$type は戻り値のタイプを表します。 0 は IP アドレスを返します。 1 は IPV4 アドレス番号を返します。

関数 get_client_ip($type = 0) {

? = ?$タイプ ?

? 静的 $ip ?= NULL;

? if ($ip !== NULL) $ip[$type];

? if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {

? $arr ?= ? 爆発(',', $_SERVER['HTTP_X_FORWARDED_FOR']); ? $pos ?= ?

? if(false !== $pos);

? $ip?

? }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {

? $_SERVER['HTTP_CLIENT_IP'] ?

? }elseif (isset($_SERVER['REMOTE_ADDR'])) {

? $_SERVER['REMOTE_ADDR'] ?

?}

? // IP アドレスの正当な検証

? $long = ip2long($ip);

? $ip ? = $long : array('0.0.0.0', 0);

? $ip[$type];

を返しますか?

}

?

?

ファイルのバイトサイズのフォーマット

?

バイトフォーマット B K M G T

で記述されたサイズにバイト数をフォーマットします。

関数 byte_format($size, $dec=2){

? $a = array("B", "KB", "MB", "GB", "TB", "PB");

? $pos = 0;

? while ($size >= 1024) {

?$サイズ /= 1024;

?$pos++;?

?}

? ラウンド($size,$dec)を返します。" ".$a[$pos];

}

または

関数 get_size($s,$u='B',$p=1){ ?

? $us = 配列('B'=>'K','K'=>'M','M'=>'G','G'=>'T') ; ?

? return (($u!=='B')&&(!isset($us[$u]))||($s } ?

?

?

虹の文字列を表示

は虹の文字列を表示するために使用され、UTF8 と中国語をサポートしており、効果は次のとおりです:

関数 color_txt($str){

? $len ?= mb_strlen($str);

? $colorTxt ?

? for($i=0; $i ? $colorTxt .= ?''.mb_substr($str,$i,1,'utf-8') '';

?}

? $colorTxt;

を返しますか?

}

関数 rand_color(){

? '#' を返します。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));

読み取りファイル($file);

?

しかし、これには問題があります。ファイル名が中国語の場合、一部のユーザーは文字化けしたファイル名をダウンロードする可能性があります。

?

そこで、いくつかの変更を加えてみましょう (参考:

$file = "/tmp/中文名.tar.gz";

$filename = ベース名($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; filename="' . $filename . '"');

header("Content-Length: ".filesize($file));

読み取りファイル($file);

?

これでかなり良くなったように見えますが、まだ問題があり、それは PHP の readfile です。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 = ベース名($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; filename="' .basename($file) .'"');

//Xsendfile にファイルを送信させます

header("X-Sendfile: $file");

?

X-Sendfile ヘッダーは Apache によって処理され、応答ファイルはクライアントに直接送信されます。

Lighttpd と Nginx にも同様のモジュールがありますので、興味があればチェックしてください

?

?

index.php を非表示にするように htaccess ファイルを設定します

Apache環境でURLアドレス内のindex.phpを隠すために使用されます

リライトエンジンがオン

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$index.php/$1 [QSA,PT,L]

?

?

PHP コードから空白とコメントを削除します

PHP には、php ファイルを読み取り、コード内の空白やコメントを削除する組み込みの php_strip_whitespace メソッドがありますが、空白やコメントを削除するためのコンテンツの直接読み取りはサポートされていません。次のメソッドは、文字列コンテンツの読み取りと ThinkPHP をサポートします。このメソッドはフレームワークに組み込まれています。

/**

?* コードから空白とコメントを削除します

?* @param string $content code content

?* @戻り文字列

?*/

関数strip_whitespace($content) {

? $stripStr ?

? //php ソースコードを分析します

? $token_get_all($content);

? $last_space = false;

? for ($i = 0, $j = count($tokens); $i ? if (is_string($tokens[$i])) {

??

? $stripStr ?.= $tokens[$i];

??

? スイッチ ($tokens[$i][0])

? // さまざまな PHP コメントをフィルタリングします。

?

?

?

?

?

?

?

?

?

?

?

??

?

?

? ??($k = $j; $k++) ?? if($tokens[$k]) ? ?? ? ? ? ? } if($k][0] ? ?

?

?

?

? ?? $stripStr??

?

?

?}

? $stripStr;

を返しますか?

}

?

?

文字列が UTF8 でエンコードされているかどうかを確認します

文字列が UTF8 でエンコードされているかどうかを判断するために使用されます

関数 is_utf8($string){

? return preg_match('%^(?:

??[x09x0Dx20-x7E] ?

?| [xC2-xDF][x80-xBF] ?

??xE0[xA0-xBF] ?# オーバーロングを除く

?| [xE1-xECxEExEF][x80-xBF] ?# ストレート 3 バイト

??xED[x80-xBF] ?#

?| xF0[x90-xBF]{2} ?

?| [xF1-xF3][x80-xBF] ?# 平面

?| xF4[x80-xBF]{2} ?

?)*$%xs', $string);

}

?

?

XSS セキュリティ フィルタリング

インターネットから取得され、文字列の XSS セキュリティ フィルタリングに使用されます。

removefunction_xss($val) {

? ?// 印刷できない文字をすべて削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます

? ?// これにより、

などの一部の文字の再間隔が防止されます。

? ?// 一部の入力では n、r、t が *許可されている*ため、後で n、r、t による分割を処理する必要があることに注意してください

? ?$val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val);

? ?// 直接の置換。通常の文字であるため、ユーザーはこれらを必要としないはずです

? ?// これにより、ThinkPHP のいくつかのタイプとメソッド

のようなことが防止されます。

? ?$search = 'abcdefghijklmnopqrstuvwxyz';

? ?$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

? ?$search .= '1234567890!@#$%^&*()';

? ?$search .= '~`";:?+/={}[]-_|'\';

? ?for ($i = 0; $i

? ? ? // ;? ; に一致します。これはオプションです

? ? ? // 0{0,7} は任意の埋め込みゼロと一致します。これはオプションであり、最大 8 文字までです

? ? ? // @ @ 16 進数値を検索

? ? ? $val = preg_replace('/([xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $値); // ;

付き

? ? ? // @ @ 0{0,7} は '0' と 0 ~ 7 回一致します

? ? ? $val = preg_replace('/(?{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // ;

付き

? ?}

? ?// 現在、残っている空白攻撃は t、n、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'、'ondragend'、'ondragenter'、'ondragleave'、'ondragover'、'ondragstart'、'ondrop'、'onerror'、'onerrorupdate'、 'onfilterchange'、'onfinish'、'onfocus'、'onfocusin'、'onfocusout'、'onhelp'、'onkeydown'、'onkeypress'、'onkeyup'、'onlayoutcomplete'、'onload'、'onlosecapture'、'onmousedown '、'onmouseenter'、'onmouseleave'、'onmousemove'、'onmouseout'、'onmouseover'、'onmouseup'、'onmousewheel'、'onmove'、'onmoveend'、'onmovestart'、'onpaste'、'onpropertychange'、 'onreadystatechange'、'onreset'、'onresize'、'onresizeend'、'onresizestart'、'onrowenter'、'onrowexit'、'onrowsdelete'、'onrowsinserted'、'onscroll'、'onselect'、'onselectionchange'、'onselectstart '、'onstart'、'onstop'、'onsubmit'、'onunload');

? ?$ra = array_merge($ra1, $ra2);

? ?$found = true; // 前のラウンドで何かが置き換えられている限り、置き換えを続けます

? ?while ($found == true) {

? ? ? $val_before = $val;

? ? ? for ($i = 0; $i

? ? ? ? ?$pattern = '/';

? ? ? ? ?for ($j = 0; $j

? ? ? ? ? ? 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).''.substr($ra[$i], 2); // を追加します。タグをナーフします

? ? ? ? ?$val = preg_replace($pattern, $replacement, $val); // 16 進タグをフィルターで除外します

? ? ? ? ?if ($val_before == $val) {

? ? ? ? ? ? // 置換は行われなかったため、ループを終了します

? ? ? ? ? ? $found = false;

? ? ? ? ?}

? ? ? }

? ?}

? ?return $val;

}

?

?

Cookie 使用法の例

cookie メソッドは、Cookie の設定、取得、および削除の操作を実行するために使用される、ThinkPHP 内の関数です。

設置

cookie('名前','値'); ?//設置クッキー

cookie('名前','値',3600); // 指定クッキーの保存時間は 1 時間

?

高级设置

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

// 下位の代および上面等效

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

?

获取

$value = cookie('name');

?

前パラメータが設定されているかどうかは関係なく、Cookie メソッドが自動的に判断します。

删除

特定の cookie を削除して使用可能:

cookie('name',null);

?

クリアクッキーが必要な場合に使用できます:

クッキー(null); // 清空当前設定前缀のすべての cookie 值

cookie(null,'think_'); // ?清空指定前缀のすべてのcookie值

?

?

検証コードが表示されないのはBOM情報が原因である場合が多いです。(BOM情報を一括削除するコード)

ローカルのテスト環境では検証コードを表示する必要がある場所が問題なくサーバーにデプロイされると、検証コードを表示する必要がある場所が表示されない場合があります。 、以下をお読みください。

問題のほとんどは BOM ヘッダー情報によって引き起こされます。通常、thinkphp 設定ファイルは BOM ヘッダー情報を削除する必要があります。BOM ヘッダー情報とは何ですか?

私の通常の解決策は、サーバーにデプロイした後にすべてのファイルの BOM ヘッダー情報を削除する新しいコード ファイルを作成して、それを実行することです。

例: サーバーのルート ディレクトリに新しい delBom.php ファイルを作成します。 http://www.xxx.com/delBom.php を実行します。コードは次のとおりです。

if (isset($_GET['dir'])){ //ファイルディレクトリを設定しますか?

$basedir=$_GET['dir'] ?

}その他{ ?

$basedir = '.' ?

} ?

$auto = 1 ?

checkdir($basedir) ?

関数 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") ?

? }その他{ ?

?$dirname = $basedir."/".$file ?

??チェックディレクトリ($ディレクトリ名);

?

?} ?

? } ?

closedir($dh) ?

} ?

} ?

関数 checkBOM ($filename) { ?

グローバル $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 が見つかりました。自動的に削除されました。_http://www.k686.com"); ?

? } else { ?

?return ("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. ドメイン名と第 2 レベルのドメイン名のサポート

4. 擬似静的およびアンカーポイントのサポート

5. ルーティングアドレスのサポート

したがって、U メソッドを使用する場合、実際に URL を生成する際に、現在使用されている 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('ブログ/read?id=5');?

U('ブログ/cate?cate_id=1&status=1')

?

サポートグループの生成:

U('Home/Blog/read?id=5') // ホーム グループ下のブログ モジュールの読み取り操作アドレス?

U('Admin/Blog/cate?cate_id=1&status=1');//管理者のグループ化

?

を意味します

U メソッドは、現在設定されている擬似静的サフィックスを自動的に追加します。複数の擬似静的サフィックスを設定する場合、最初のものがデフォルトで追加されます。擬似静的サフィックスを指定する必要がある場合は、次の方法も使用できます。 :

U('ブログ/読む','id=1','xml');

?

は、.xml サフィックス

が付いた擬似静的 URL アドレスを出力することを意味します

?

U メソッドを使用してルーティング アドレスを出力する場合は、最初のパラメーターの前に「/」を追加する必要があります。例:

U('/news/1');

?

は、生成される URL アドレスが news/1 などのルーティング アドレスであることを意味します。

?

ドメイン名を含む URL アドレスを生成する必要がある場合は、次を使用できます:

U('Blog/read@blog.thinkphp.cn','id=1');

?

または

U('ブログ/read@blog','id=1');

?

は、現在のドメイン名を使用するブログの第 2 レベル ドメイン名アドレスを示します。

?

アンカー ポイントの生成をサポートします (サポートするには、最新の Git バージョンを更新する必要があることに注意してください)

U('ブログ/read#review','id=5');

?

生成された URL アドレスには、コメント セクションに簡単にジャンプできるように、最後に #review アンカーが付きます。

?

?

画像のHTTPキャッシュを設定し、JSとCSSも設定できます

Apache 環境の場合、.htaccess ファイルに次のコードを追加して、イメージの HTTP キャッシュと有効期間を設定し (Apache のヘッダー モジュールのサポートを有効にする必要があります)、イメージ リソースのリクエストを減らすことができます。ウェブサイトの負荷を軽減し、アクセス速度とページ速度の値を改善します^_^。

ヘッダー セット キャッシュ コントロール "max-age=604800"

?

上記のコードは、Web サイト上の画像に 1 週​​間の HTTP キャッシュを設定します。もちろん、http キャッシュを js または css ファイルに追加することもできます。

?

?

文字列に外部リンクがあるかどうかを確認します

/**

?* all_external_link は文字列に外部リンクが含まれているかどうかを検出します

?* @param ?string ?$text text

?* @param ?string ?$ホスト ドメイン名

?* @return boolean ? 外部リンクの場合は true

?*/

関数 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 を $value) {

? if($value != $host) ;

?}

?

を返しますか?

}

?

?

htaccess でドメイン名のリダイレクトを設定します

Apache 環境でのみ使用されます。htaccess ファイルに次のコードを追加すると、abc.com にアクセスすると、www.abc.com にリダイレクトされます。もちろん、他のドメイン名へのリダイレクトを設定することもできます。

リライトエンジンがオン

RewriteCond %{HTTP_HOST} ^abc.com$ [NC]

RewriteRule ^(.*)$ http://www.abc.com/$1 [R=301,L]

?

?

PHP はクライアントの IP、地理情報、ブラウザ情報、ローカルの実際の IP を取得します

?// クライアントの IP、地理情報、ブラウザ、ローカルの実 IP を取得する関数

?class get_gust_info {?

??

? ////訪問者のブラウザの種類を取得します

?関数 GetBrowser(){

?if(!empty($_SERVER['HTTP_USER_AGENT'])){

? $br = $_SERVER['HTTP_USER_AGENT'];

? if (preg_match('/MSIE/i',$br)) { ?

?$br = '🎜' ? ??}elseif('/Firefox/i',$br) {

?$br = 'Firefox';

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

??$br = 'クロム';

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

?$br = 'サファリ';

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

? $br = 'オペラ';

? }その他 {

? $br = 'その他' ?

?}

? $br;

を返しますか?

?}else{return "ブラウザ情報の取得に失敗しました!";}?

?}

??

? ////訪問者のブラウザ言語を取得します

?関数 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 = "繁体字中国語";

? }その他{

? $lang = "英語" ?

?}

? $lang;

を返しますか?

??

?}else{return "ブラウザ言語を取得できませんでした!";}

?}

??

?////ゲスト オペレーティング システムを取得します

?関数 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';

? }その他 {

?$OS = 'その他';

?}

??

?}else{return "ゲスト オペレーティング システム情報の取得に失敗しました!";} ??

?}

??

? ////訪問者の実際の 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

?if(!preg_match("/^(10|172.16|192.168)./i",$ips[$i])){//LAN ip を除外します

? $ip = $ips[$i];

??

?

?} ?

?$tip = empty($_SERVER['REMOTE_ADDR']) ?$ip : $_SERVER['REMOTE_ADDR'];?

?if($tip=="127.0.0.1"){ //ローカルの実際の IP を取得します

? $this->get_onlineip();

?}その他{

?$tip を返しますか?

?}

?}

??

? ////ローカルの実際の IP を取得します

?関数 get_onlineip() {

? $mip = file_get_contents("http://city.ip138.com/city0.asp");

??if($mip){

?preg_match("/[.*]/",$mip,$sip)? ?$p = 配列("/[/","/]/")? ??preg_replace($p,"",$sip[0]);

? ?}else{return "ローカル IP を取得できませんでした!";}

?}

??

? ////IP に基づいて訪問者の場所名を取得します

?関数 Getaddress($ip=''){

?if(empty($ip)){

?$ip = $this->?

?}

?$ipadd = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);//Sina API インターフェースに従って

?if($ipad){

? $charset = iconv("gbk","utf-8",$ipadd);

? preg_match_all("/[x{4e00}-x{9fa5}]+/u",$charset,$ipadds);

??

? return $ipadds; // 2 次元配列を返します。

?}else{return "宛先がありません";} ?

?}?

?}

?$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);

?}

?

?echo "
ブラウザの種類:".$gifo->GetBrowser();

?echo "
ブラウザ言語:".$gifo->GetLang();

?echo "
オペレーティング システム:".$gifo->GetOs();

??

?

??>

?

?

URL セーフ文字列の Base64 エンコードとデコード

base64_encode メソッドとbase64_decode メソッドを直接使用すると、生成された文字列が URL アドレスに適さない可能性があります。次の方法でこの問題を解決できます: URL セーフな文字列エンコーディング:

関数 urlsafe_b64encode($string) {

?$data =base64_encode($string);

?$data = str_replace(array('+','/','='),array('-','_',''),$data);

?$data を返す;

}

?

URL セーフ文字列デコード:

関数 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 が返されます。 >

?*/

関数 get_client_browser($glue = null) {

? $ブラウザ = 配列();

? $agent = $_SERVER['HTTP_USER_AGENT']; // クライアント情報を取得します。

??

? /* ブラウザ機能の正規表現を定義します */

?$regex = 配列(

)

? '/(MSIE) (d+.d)/' ?

? 'クロム' ?=> '/(d+.d+)/',

? 'Firefox' =>

? '/(オペラ)/(d+.d+)/'?

? 'サファリ' ?=> '/バージョン/(d+.d+.d)/',

);

?

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

?preg_match($reg、$agent、$data)?

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

? $browser = $data[1]) : array($data[1]) ;

?

?

?}

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

}

?

?

タイムスタンプに適した書式設定機能 たった今、数秒前を表示

一部の Weibo システムでは、今、5 秒前、5 時間前、5 日前など、現在の時刻と比較してどれくらい前の時刻を表示する必要があることがよくあります。このような

/**

?*

?+--------------------------------

?* 説明わかりやすい表示時間

?+--------------------------------

?* @param int $time フォーマットされるタイムスタンプ。デフォルトは現在時刻です。

?+--------------------------------

?* @return string $text 形式のタイムスタンプ

?+--------------------------------

?* @著者 yijianqing

?+--------------------------------

?*/

関数 mdate($time = NULL) {

? $text = '';

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

? $t = time() - $time 時間差 (秒)

? if ($t == 0)

? $text = '今';

? ? elseif ($t

? ? ? ? $text = $t . '秒前'; // 一分钟内

? ? elseif ($t

? ? ? ? $text = floor($t / 60) . '分钟前'; //一小时内

? ? elseif ($t

? ? ? ? $text = floor($t / (60 * 60)) . '小时前'; // 一天内

? ? elseif ($t

? ? ? ? $text = floor($time/(60*60*24)) ==1 ?'昨天 ' . date('H:i', $time) : '前天 ' . date('H:i', $time) ; //昨天和前天

? ? elseif ($t

? ? ? ? $text = date('m月d日 H:i', $time); //一个月内

? ? elseif ($t

? ? ? ? $text = date('m月d日', $time); //一年内

? ? else

? ? ? ? $text = date('Y年m月d日', $time); //一年以前

? ? return $text;

}

?

使用此函数,我们只需在前台用

{$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();// 创建Tree

? ? if(is_array($list)) {

? ? ? ? // 创建基于主键的数组引用

? ? ? ? $refer = array();

? ? ? ? foreach ($list as $key => $data) {

? ? ? ? ? ? $refer[$data[$pk]] =& $list[$key];

? ? ? ? }

? ? ? ??

? ? ? ? foreach ($list as $key => $data) {

? ? ? ? ? ? // 判断是否存在parent

? ? ? ? ? ? $parentId = $data[$pid];

? ? ? ? ? ? if ($root == $parentId) {

? ? ? ? ? ? ? ? $tree[$data[$pk]] =& $list[$key];

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? if (isset($refer[$parentId])) {

? ? ? ? ? ? ? ? ? ? $parent =& $refer[$parentId];

? ? ? ? ? ? ? ? ? ? $parent[$child][] =& $list[$key];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? return $tree;

}

?

?

头像编辑-当不改变头像时

目前是这么做的 将上传判断代码段

?/* ?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))?

? ? {

? ? ? ? return array_merge($list1,$list2);

? ? }

? ? else return (isEmpty($list1)?(isEmpty($list2)?null:$list2):$list1);

}

function isEmpty($data)

{

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

}

?

?

Google翻译插件调用,采用CURL调取

调用Google翻译的接口,需要开启curl支持。

? ? /*

? ? ? ? Google翻译函数 by QQ366958903

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

#',$html,$doc);

? 戻りストリップタグ($doc['1'],'
');

?}

? //例: テキストを英語に翻訳します

? $text='こんにちは';

? エコー翻訳($text,'en');

?>

?

?

言語略語対応表

'auto'=>'言語を検出',

'sq'=>'アルバニア人',

'ar'=>'アラビア語',

'az'=>'アゼルバイジャン ALPHA',

'ga'=>'アイルランド語'、

'et'=>'エストニア語',

'be'=>'ベラルーシ語',

'bg'=>'ブルガリア語',

'は'=>'アイスランド語'、

'pl'=>'ポーランド語',

'fa'=>'ペルシア語',

'af'=>'ブール (アフリカーンス語)',

'da'=>'デンマーク語'、

'de'=>'ドイ​​ツ語',

'ru'=>'ロシア語',

'fr'=>'フランス語',

'tl'=>'フィリピン人',

'fi'=>'フィンランド語',

'ka'=>'ジョージアン ALPHA'、

'ht'=>'ハイチ クレオール アルファ',

'ko'=>'韓国語'、

'nl'=>'オランダ語',

'gl'=>'ガリシア語',

'ca'=>'カタルーニャ語',

'cs'=>'チェコ語',

'hr'=>'クロアチア語',

'lv'=>'ラトビア語',

'lt'=>'リトアニア語',

'ro'=>'ルーマニア語',

'mt'=>'マルタ',

'ms'=>'マレー語',

'mk'=>'マケドニア人',

'いいえ'=>'ノルウェー語'、

'pt'=>'ポルトガル語',

'ja'=>'日本語',

'sv'=>'スウェーデン語',

'sr'=>'セルビア語'、

'sk'=>'スロバキア語',

'sl'=>'スロベニア語',

'sw'=>'スワヒリ語',

'th'=>'タイ語'、

'tr'=>'トルコ語',

'cy'=>'ウェールズ語',

'uk'=>'ウクライナ語',

'eu'=>'スペイン バスク ALPHA',

'es'=>'スペイン語'、

'iw'=>'ヘブライ語',

'el'=>'ギリシャ語'、

'hu'=>'ハンガリー語'、

'hy'=>'アルメニア語 ALPHA'、

'それ'=>'イタリア語'、

'yi'=>'イディッシュ語'、

'こんにちは'=>'ヒンディー語'、

'ur'=>'INDIUURDU ALPHA',

'id'=>'インドネシア語',

'en'=>'英語',

'vi'=>'ベトナム語',

'zh-TW'=>'中国語 (繁体字)',

'zh-CN'=>'中国語 (簡体字)',

?

?

データベースをバックアップします。データベース全体または一部のテーブルをバックアップできます

すべてモジュールに記述されており、ライブラリ全体をバックアップすることも、テーブルの一部をバックアップすることを選択することもできます

?

エラーの修正。361 行目で空が誤って使用されています

クラス BaksqlAction は CommonAction を拡張します {

? ? ?

?

? //初期化データ

関数 _initialize() {

?

? 親::_initialize(); ? ヘッダー("コンテンツ タイプ: text/html;charset=utf-8");

??

??

? $this->config = ? ? 'DB_BACKUP' ? ? 🎜> ?? ??バックアップ完了【未テスト】

? ?? >

? $this->model();

? //$sql は何秒後に切断しますか?

? //$this->model>execute($sql);

?}

? /* -

??* +--------------------------------

??* * @ バックアップデータリスト

??* +--------------------------------

??*/

?関数インデックス() {

? $path = $this->config['パス'];

? $fileArr = $this->MyScandir($path);

? foreach ($key => $value) {

? if ($key > 1)

? // ファイルの作成時刻を取得します。 ? $fileTime('Y-m-d H:i:s', $path . '/' . $value);??$fileSize($path . '/' . $value) / 1024

? // ファイルサイズを取得しますか?

? $fileSize

? ??

? // リスト配列を構築しますか?

?

?

?

?

?

?

?

? $this->assign('リスト', $list);

? $this->display();

?}

? /* -

??* +--------------------------------

??* * @ データテーブルを取得

??* +--------------------------------

??*/

? 関数 tablist() {

?

? $list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}");

? //エコー $Backup->getLastSql();

? $this->assign('リスト', $list);

? $this->display();

?}

? /* -

??* +--------------------------------

?* * @ データベース全体をバックアップします

??* +--------------------------------

??*/

? 関数 backall() {

? $tables = $this->getTables();

? if ($this->backup($tables))

? $this->成功!', '/public/ok'?

??

? $this->error('データベースのバックアップに失敗しました!') ?

?

?}

? /* -

??* +--------------------------------

?* * @ テーブルごとにバックアップ

??* +--------------------------------

??*/

?関数 backtables() {

? $タブ = $_REQUEST['タブ'];

? (is_array($tab))?

?

?

? if ($this->backup($tables))

? (is_array($tab))?

?? $this->成功しました?

?

? $this->成功!', '/public/ok' ?

??

? $this->error('データベースのバックアップに失敗しました!') ?

?

?}

? //データベースを復元しますか?

? 関数リカバリ() {

? if ($this->recover_file($_GET['file'])) {

? $this->成功!', '/public/ok'?

??

? $this->error('データ復元に失敗しました!') ?

?

?}

? //データのバックアップを削除します

? 関数 deletebak() {

? if (unlink($this->config['path'] . $this->dir_sep['file'])) {

? $this->成功('/public/ok');

?? ?

? $this->エラー('バックアップの削除に失敗しました!')

?

?}

? /* -

??* +--------------------------------

??* * @ バックアップ ファイルをダウンロードします

??* +--------------------------------

??*/

? 関数 downloadBak() {

? $_GET['ファイル'] ?

? $file_dir = $this->config['パス'];

? if (!file_exists($file_dir . "/" . $file_name)) { //ファイルが存在するかどうかを確認します

?

?

?? ? $file = fopen($file_dir . "/" . $file_name, "r");

? // ファイルタグを入力しますか?

? ヘッダー ('コンテンツ エンコーディング: なし') ? ?

? ヘッダー("コンテンツ タイプ: アプリケーション/オクテット ストリーム")

? ヘッダー ("範囲: バイト") ?

? ヘッダー (" .file_dir . "/" . $file_name);

? ヘッダー ('コンテンツ転送エンコーディング: バイナリ') ?

? ? header("Content-Disposition:attachment; filename=" . $file_name); //ダウンロード用に実際のファイル名を指定します。

? ヘッダー ('プラグマ: キャッシュなし') ?

? ヘッダー('有効期限: 0') ?

? // 出力ファイルの内容 ?

? エコー fread($file_dir . "/" . $file_name)

?

?

?

?}

? /* -

??* +--------------------------------

?* * @ ディレクトリ

内のファイルの配列を取得します。

??* +--------------------------------

??* * @ $FilePath ディレクトリ パス

?* * @ $Order ?ソート

??* +--------------------------------

? ?* * @ 指定されたディレクトリ内のファイルリストを取得し、配列

を返します。

??* +--------------------------------

??*/

? ?プライベート関数 MyScandir($FilePath = './', $Order = 0) {

? ? ? ? $FilePath = opendir($FilePath);

? ? ? ? while ($filename = readdir($FilePath)) {

? ? ? ? ? ? $fileArr[] = $ファイル名;

? ? ? ? }

? ? ? ? $Order == 0 ?ソート($fileArr) : rsort($fileArr);

? ? ? ? return $fileArr;

? ? }

? ? /* ? ? * ************************************************ ******************************************* */

? ? /* -

? ? ?* +-------------------------------------------------

? ? ?* * @ 读取备份文件

? ? ?* +-------------------------------------------------

? ? ?* * @ $fileName 文件名

? ? ?* +-------------------------------------------------

? ? ?*/

? ?プライベート関数 getFile($fileName) {

? ? ? ? $this->content = '';

? ? ? ? $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $fileName);

? ? ? ? if (is_file($fileName)) {

? ? ? ? ? ? $ext = strrchr($fileName, '.');

? ? ? ? ? ? if ($ext == '.sql') {

? ? ? ? ? ? ? ? $this->content = file_get_contents($fileName);

? ? ? ? ? ? elseif ($ext == '.gz') {

? ? ? ? ? ? ? ? $this->content = implode('', gzfile($fileName));

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? $this->error('無法识别的文件格式!');

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? $this->error('文件が存在しません!');

? ? ? ? }

? ? }

? ? /* -

? ? ?* +-------------------------------------------------

? ? ?* * @ 把データ書入磁盘

? ? ?* +-------------------------------------------------

? ? ?*/

? ?プライベート関数 setFile() {

? ? ? ? $recognize = '';

? ? ? ? $recognize = $this->dbName;

? ? ? ? $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $recognize . '_' . date('YmdHis') . '_' . mt_rand(100000000 、999999999) '.sql');

? ? ? ? $path = $this->setPath($fileName);

? ? ? ? if ($path !== true) {

? ? ? ? ? ? $this->error("無法创建备份目录目录 '$path'");

? ? ? ? }

? ? ? ? if ($this->config['isCompress'] == 0) {

? ? ? ? ? ? if (!file_put_contents($fileName, $this->content, LOCK_EX)) {

? ? ? ? ? ? ? ? $this->error('写入文件失败,请检查磁盘空间或者权限!');

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? if (function_exists('gzwrite')) {

? ? ? ? ? ? ? ? $fileName .= '.gz';

? ? ? ? ? ? ? ? if ($gz = gzoopen($fileName, 'wb')) {

? ? ? ? ? ? ? ? ? ? gzwrite($gz, $this->content);

? ? ? ? ? ? ? ? ? ? gzclose($gz);

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? $this->error('写入文件失败,请检查磁盘空间或者权限!');

? ? ? ? ? ? ? ? }

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? $this->error('没有开启gzip扩展!');

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if ($this->config['isDownload']) {

? ? ? ? ? ? $this->downloadFile($fileName);

? ? ? ? }

? ? }

? ?プライベート関数trimPath($path) {

? ? ? ? return str_replace(array('/', '\', '//', '\\'), $this->dir_sep, $path);

? ? }

? ?プライベート関数 setPath($fileName) {

? ? ? ? $dirs =explode($this->dir_sep, dirname($fileName));

? ? ? ? $tmp = '';

? ? ? ? foreach ($dir として $dir) {

? ? ? ? ? ? $tmp .= $dir 。 $this->dir_sep;

? ? ? ? ? ? if (!file_exists($tmp) && !@mkdir($tmp, 0777))

? ? ? ? ? ? ? ? $tmp を返します;

? ? ? ? }

? ? ? ? true を返します;

? ? }

? ? //未测试

? ?プライベート関数 downloadFile($fileName) {

? ? ? ? ob_end_clean();

? ? ? ? header("キャッシュ制御: 必須再検証、事後チェック=0、事前チェック=0");

? ? ? ? header('Content-Description: ファイル転送');

? ? ? ? header('Content-Type: application/octet-stream');

? ? ? ? header('Content-Length: ' . filesize($fileName));

? ? ? ? header('Content-Disposition:attachment; filename=' .basename($fileName));

? ? ? ? readfile($fileName);

? ? }

? ? /* -

? ? ?* +-------------------------------------------------

? ? ?* * @ 给字符串追加 ` `

? ? ?* +-------------------------------------------------

? ? ?* * @ $str 文字串

? ? ?* +-------------------------------------------------

? ? ?* * @ 返し `$str`

? ? ?* +-------------------------------------------------

? ? ?*/

? ?プライベート関数 backquote($str) {

? ? ? ? return "`{$str}`";

? ? }

? ? /* -

? ? ?* +-------------------------------------------------

? ? ?* * @ 获取データベース库のすべての表

? ? ?* +-------------------------------------------------

? ? ?* * @ $dbName ?データベース库名

? ? ?* +-------------------------------------------------

? ? ?*/

? プライベート関数 getTables($dbName = '') {

? if (!empty($dbName))

? $sql = '$dbName' ?

??

? $sql = ';

?

? $result = $this->model->query($sql);

? $info = array();

? foreach ($result as $val) {

? $info[$key];

?

? $info を返しますか?

?}

? /* -

??* +--------------------------------

? ?* * @ 指定された長さに応じて配列に分割します

??* +--------------------------------

??* * @ $array 分割するデータ

? ??* * @ $byte ?分割する長さ

??* +--------------------------------

? ?* * @ 指定された長さに応じて配列を分割し、分割された配列を返します

??* +--------------------------------

??*/

? プライベート関数 chunkArrayByte($array, $byte = 5120) {

? $i = 0;

? $sum = 0;

? $return = 🎜

? foreach ($array として) {

? $sum += 🎜

? if ($sum ?$return[$i]??

? }

?$return[++$i][]?

?

?

?$return[++$i][]?

?

?

?

?

? 戻りますか?

?}

? /* -

??* +--------------------------------

?* * @ データのバックアップ {各テーブル、ビュー、データをバックアップします}

??* +--------------------------------

??* * @ $tables バックアップするテーブルの配列

??* +--------------------------------

??*/

? プライベート関数バックアップ ($tables) {

? (空($tables))? ?

? $this->error('データテーブルをバックアップする必要はありません!')

? $this->content = '/* このファイルは MySQLReback ' ' */';

によって作成されます。

? foreach ($tables as $i => $table) {

??$table??名前 > ?

? $tableRs = $this->model->query("SHOW CREATE TABLE {$table}"); ?

? if (!empty($tableRs[0]["ビューの作成"]) {

? $this->content .= "{$table} を作成します。 ?

? $this->content .= "$tableRs[0] ビューの作成" ? ";/* MySQLReback の分離 */";

?

? if (!empty($tableRs[0]["テーブルの作成"]) {

? $this->content .= "テーブル構造を作成します。

? $this->content .= "$tableRs[0]" の分離";/* MySQLReback の分離 */";

? $tableDateRow("SELECT * FROM {$table}") ?

?

?

?

? ??? ??

? ? ? $v = "'" ? ? ? $valuesArr[] ?

?

?

? $temp = $valuesArr)

?

? ? $values (',', $v) ? ?? ($values ';/* 分離) ? ?? $this->コンテンツを挿入します?

? ?

?

?

// ?ダンプ($this->コンテンツ) ?

// ??

?

?

? if (!empty($this->content))

?

?

?

を返しますか?

?}

? /* -

??* +--------------------------------

??* * @ データを復元します

??* +--------------------------------

??* * @ $fileName ファイル名

??* +--------------------------------

??*/

? プライベート関数 reverse_file($fileName) {

? $this->getFile($fileName);

? if (!empty($this->content)) ? $content (';/* MySQLReback 分離 */', $this->content) ?

? foreach ($i => $sql)

??

? ??$mes=$sql?? ?? ''

に置き換えます ?? $table_change => ? ??$sql($sql)? ??$mes=$sql??

? ?? 、エラー

を記録します ?

? ??$log_text?? ???

?

?

?

?? ?

? $this->エラー('バックアップ ファイルを読み取れません!')

?

?

を返しますか?

?}

}

?>

?

?

$this->_get(); 使用例 自動フィルタリング

$this->_get('a','b','c');

?

3 つのパラメータ:

?

a. $_GET によって送信された変数名;

?

b. フィルター関数 ('trim' / 'trim,String' など、カンマで区切られた複数の関数)。

?

c、デフォルト値;

?

?

指定されたエラー コードとエラー ページを返す単純な関数

httpsstatus('404');

404 エラーがクライアントに送信され、エラー ページはカスタマイズ可能です。

common.php に関数を置くと、自動的にロードされ、自由に呼び出すことができます

/**

?* エラー コードを返し、エラー ページをエントリ ファイル ディレクトリ ./Public/httpstatus に配置し、404.html、403.html、503.html などの名前を付けます。

?* @param $string エラー コード

?* @param $msg NOT FOUNDなどのエラーメッセージは省略可能

?*/

関数 httpstatus($string="404",$msg=""){

? ヘッダー("http/1.1 {$string} {$msg}");

? './Public/httpsstatus/'.$string.'.html';

を含めますか?

?

を終了しますか?

}

?

?

?

1階 スター690178485 17時間前

教育を受けたスメクタ

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。Apr 29, 2025 am 12:42 AM

負荷分散はセッション管理に影響しますが、セッションの複製、セッションの粘着性、集中セッションストレージで解決できます。 1。セッションレプリケーションサーバー間のセッションデータをコピーします。 2。セッションスティンネスは、ユーザーリクエストを同じサーバーに指示します。 3.集中セッションストレージは、Redisなどの独立したサーバーを使用してセッションデータを保存してデータ共有を確保します。

セッションロックの概念を説明します。セッションロックの概念を説明します。Apr 29, 2025 am 12:39 AM

SESSIONLOCKINGISATECHNIQUESTOESUREAUSER'SSESSIONREMAINSEXCLUSIVETOONEUSATIME.ITISCRUCIALFORPREVENTINGDATACORTIONANDSECURITYBREACHESINMULTI-USERAPPLICATIONS.SESSIONLOCKINGISISIMPLEMENTEDUSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGROCKINGSMECHANISMなど

PHPセッションの選択肢はありますか?PHPセッションの選択肢はありますか?Apr 29, 2025 am 12:36 AM

PHPセッションの代替品には、Cookie、トークンベースの認証、データベースベースのセッション、Redis/Memcachedが含まれます。 1.Cookiesは、クライアントにデータを保存することによりセッションを管理します。 2.トークンベースの認証はトークンを使用してユーザーを検証します。これは非常に安全ですが、追加のロジックが必要です。 3.Databaseベースのセッションは、データベースにデータを保存します。これは、スケーラビリティが良好ですが、パフォーマンスに影響を与える可能性があります。 4. Redis/Memcachedは分散キャッシュを使用してパフォーマンスとスケーラビリティを向上させますが、追加のマッチングが必要です

PHPのコンテキストで「セッションハイジャック」という用語を定義します。PHPのコンテキストで「セッションハイジャック」という用語を定義します。Apr 29, 2025 am 12:33 AM

SessionHijackingとは、ユーザーのSessionIDを取得してユーザーになりすましている攻撃者を指します。予防方法には、次のものが含まれます。1)HTTPSを使用した通信の暗号化。 2)SessionIDのソースの検証。 3)安全なSessionID生成アルゴリズムの使用。 4)SessionIDを定期的に更新します。

PHPの完全な形式は何ですか?PHPの完全な形式は何ですか?Apr 28, 2025 pm 04:58 PM

この記事では、PHPについて説明し、その完全なフォーム、Web開発での主要な使用、PythonとJavaとの比較、および初心者の学習のしやすさについて説明します。

PHPはフォームデータをどのように処理しますか?PHPはフォームデータをどのように処理しますか?Apr 28, 2025 pm 04:57 PM

PHPは、$ \ _ postおよび$ \ _を使用してフォームデータを処理し、検証、消毒、安全なデータベースインタラクションを通じてセキュリティを確保します。

PHPとASP.NETの違いは何ですか?PHPとASP.NETの違いは何ですか?Apr 28, 2025 pm 04:56 PM

この記事では、PHPとASP.NETを比較して、大規模なWebアプリケーション、パフォーマンスの違い、セキュリティ機能への適合性に焦点を当てています。どちらも大規模なプロジェクトでは実行可能ですが、PHPはオープンソースであり、プラットフォームに依存しませんが、ASP.NET、

PHPはケースに敏感な言語ですか?PHPはケースに敏感な言語ですか?Apr 28, 2025 pm 04:55 PM

PHPの症例感度は変化します:関数は鈍感であり、変数とクラスは感度があります。ベストプラクティスには、一貫した命名と、比較のためにケース非感受性関数を使用することが含まれます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター