明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

5.PHP的其他技巧

[摘要]5. 其他雜項(xiàng) 5.1 生成圖像PHP可以操作處理圖像。如果你已經(jīng)安裝了GD庫,你甚至可以利用PHP生成圖像。<?Header("Content-type: image/gif");string=implode(argv," ");im = image...

5. 其他雜項(xiàng) 


5.1 生成圖像



PHP可以操作處理圖像。如果你已經(jīng)安裝了GD庫,你甚至可以利用PHP生成圖像。

<?

Header("Content-type: image/gif");

$string=implode($argv," ");

$im = imagecreatefromgif("images/button1.gif");

$orange = ImageColorAllocate($im, 220, 210, 60);

$px = (imagesx($im)-7.5*strlen($string))/2;

ImageString($im,3,$px,9,$string,$orange);

ImageGif($im);

ImageDestroy($im);

?>

(譯者注:以上代碼段缺少注釋,請讀者參考PHP Manual的圖像處理函數(shù)部分)

這段代碼在其他頁面中通過以下標(biāo)記<img src="button.php3?text">調(diào)用,然后以上的那段button.php3代碼取得text值并在另外取得的圖像文件中加上該值--在以上的代碼中該圖像文件是images/button1.gif--最后輸出到瀏覽器。假如你想在表單域中使用圖像按鈕,但是又不希望在每次按鈕上的文字改變后不得不重新生成新的圖像,就可以利用這樣簡單的方法動態(tài)生成圖像文件。



5.2 Cookies



PHP支持基于HTTP的cookies。在需要時(shí)你可以像使用一般變量一樣方便的使用cookie。Cookies是瀏覽器保存于客戶端的一些信息片段,由此你可以知道是否一臺特定PC上的任何人都訪問過你的站點(diǎn),瀏覽者者在你的站點(diǎn)上的蹤跡等等。使用cookies的典型例子就是對瀏覽者偏好的甄別。Cookies由函數(shù)setcookie()設(shè)定。與輸出HTTP標(biāo)頭的函數(shù)header()一樣,setcookie()必須在任何實(shí)際內(nèi)容杯輸出到瀏覽器之前調(diào)用。以下是一個(gè)簡單例子:

<?

if (empty($VisitedBefore)) 

{

// 如果沒有設(shè)定cookie,為cookie賦上當(dāng)前時(shí)間值

// 函數(shù)中的最后一個(gè)參數(shù)聲明了該cookie保存的時(shí)間

// 在這個(gè)例子中是1年

// time()函數(shù)返回自1970年1月1日以來的以秒數(shù)計(jì)的時(shí)間

SetCookie("VisitedBefore",time(), time()+(60*60*24*365));



else 

{

// 歡迎瀏覽者再次光臨

echo "Hello there, welcome back<BR>"; 

// 讀取cookie并判斷

if ( (time() - $VisitedBefore) >= "(60*60*24*7)" ) 

echo "Why did you take a week to come back. You should be here more often!? 
"; 



?>



5.3 基于HTTP驗(yàn)證



基于HTTP驗(yàn)證當(dāng)PHP以CGI模式運(yùn)行時(shí)不能實(shí)現(xiàn)。我們可以使用函數(shù)header()發(fā)送HTTP標(biāo)頭強(qiáng)制驗(yàn)證,客戶端瀏覽器則彈出供輸入用戶名和密碼的對話框。這兩個(gè)變量被儲存在$PHP_AUTH_USER和$PHP_AUTH_PW中,你可以使用這兩個(gè)變量驗(yàn)證合法并允許進(jìn)入。以下的例子通過用戶名稱/密碼對為tnc/nature的驗(yàn)證一名用戶的登錄:

<?

if(!isset($PHP_AUTH_USER)) 

{

Header("WWW-Authenticate: Basic realm=\"My Realm\"");

Header("HTTP/1.0 401 Unauthorized");

echo "Text to send if user hits Cancel button\n";

exit;



else 

{

if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") 
)

{

// 如果是錯(cuò)誤的用戶名稱/密碼對,強(qiáng)制再驗(yàn)證

Header("WWW-Authenticate: Basic realm=\"My Realm\"");

Header("HTTP/1.0 401 Unauthorized");

echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.";

exit;



else 

{

echo "Welcome tnc!";

}

?>

事實(shí)上再實(shí)際引用中不大可能如上面使用代碼段明顯的用戶名稱/密碼對,而是利用數(shù)據(jù)庫或者加密的密碼文件存取它們。



5.4 文件上傳



你可以利用PHP實(shí)現(xiàn)文件的功能,注意客戶端的瀏覽器應(yīng)該是Netscape3以上或者IE3以上。以下就是該功能的簡單演示:

( upload.html ):

<HTML>

<HEAD>

<TITLE>Upload Your File</TITLE>

</HEAD>

<BODY>

<FORM ACTION="receiver.php3" 

ENCTYPE="multipart/form-data" METHOD=POST>

<INPUT TYPE="HIDDEN" 

NAME="MAX_FILE_SIZE" VALUE="2000000">

<INPUT TYPE="FILE" 

NAME="uploadfile" SIZE="24" MAXLENGTH="80">

<BR><BR>

<INPUT TYPE="SUBMIT" VALUE="Upload File!" 

NAME="sendit"> 

<INPUT TYPE="SUBMIT" VALUE="Cancel" 

NAME="cancelit"><BR>

</FORM>

<I><FONT SIZE="2">(You may notice a slight 

delay while we upload your file.)</FONT></I>

</BODY>

</HTML>



下面是處理上傳的文件:

( receiver.php3 ):

<? 

function do_upload () 

{

global $uploadfile, $uploadfile_size;

global $local_file, $error_msg;

if ( $uploadfile == "none" ) 

{

$error_msg = "You did not specify a file for uploading.";

return;

}

if ( $uploadfile_size > 2000000 ) 

{

$error_msg = "Sorry, your file is too large.";

return;

}

$the_time = time ();

// 你需要對以下目錄有寫權(quán)限

$upload_dir = "/local/uploads";

$local_file = "$upload_dir/$the_time";

if ( file_exists ( '$local_file' ) ) 

{

$seq = 1;

while ( file_exists ( "$upload_dir/$the_time$seq" ) ) { $seq++; }

$local_file = "$upload_dir/$the_time$seq";

};

rename ( $uploadfile, $local_file );

display_page ();

}

function display_page () 

{

// 這里是你的頁面內(nèi)容

}

<HTML>

<HEAD>

<TITLE>php3 Receiving Script</TITLE>

</HEAD>

<BODY>

<? 

if ( $error_msg ) { echo "<B>$error_msg</B><BR><BR>"; 
}

if ( $sendit ) 

{

do_upload ();



elseif ( $cancelit ) 

{

header ( "Location: $some_other_script" );

exit;



else 

{

some_other_func ();

}

?>

</BODY>

</HTML>



5.5 常用函數(shù)



我們簡單來看看一些常用的函數(shù)。



數(shù)組





array - 生成數(shù)組 

count - 數(shù)組元素個(gè)數(shù) 

sort - 數(shù)組排序,另有其他幾種排序函數(shù)可供使用 

list - 列出數(shù)組元素 

each - 返回下一個(gè)key/value對 

current - 返回當(dāng)前數(shù)組元素 

next,prev - 傳回當(dāng)前數(shù)組元素前后指針 







日期和時(shí)間



checkdate - 驗(yàn)證日期/時(shí)間格式 

date - 生成日期/時(shí)間格式 

time - 當(dāng)前時(shí)間信息 

strftime - 格式化日期/時(shí)間 



目錄、文件系統(tǒng)



chdir - 改變目錄 

dir - 目錄類別 

opendir, readdir, closedir - 開啟、讀取、關(guān)閉目錄 

fopen, fclose - 開啟、關(guān)閉文件 

fgets, fgetss - 逐行讀取內(nèi)容 

file - 將整個(gè)文件讀入一個(gè)數(shù)組變量中 



正則表達(dá)式



ereg - 匹配正則表達(dá)式 

eregi - 大小寫非敏感匹配正則表達(dá)式 

ereg_replace -匹配正則表達(dá)式并替換 

eregi_replace -大小寫非敏感匹配正則表達(dá)式并替換 

split - 依規(guī)則切開字符串并以數(shù)組形勢存儲






字符串



AddSlashes - 加上斜杠后使用字符串 

echo - 輸出一個(gè)或多個(gè)字符串 

join, implode - 將數(shù)組元素合并為字符串 

htmlentities, htmlspecialchars - 將HTML特殊字符轉(zhuǎn)換為HTML標(biāo)記形式 

split - 依規(guī)則切開字符串并以數(shù)組形勢存儲 

5.6 擴(kuò)展我們的范例主頁



我們將使用以上提到的一些函數(shù)和思想為我們的范例主頁添加更多的動態(tài)內(nèi)容。我們可以在每個(gè)頁面的頂部加上導(dǎo)航欄,同時(shí)使得當(dāng)前頁自動的不被鏈接顯示;同時(shí)還可以添加一個(gè)用戶驗(yàn)證表單以便上傳音樂、圖像等文件并自動更新頁面。 
導(dǎo)航欄



實(shí)際上就是在footer.inc文件中加上一段代碼。假設(shè)你的web站點(diǎn)中所有后綴為.php3的文件都會出現(xiàn)在導(dǎo)航欄中,以下就是被存為include/navbar.inc的代碼:

<?

/* 輸出該導(dǎo)航欄,鏈接所有除當(dāng)前頁的站內(nèi).php3文件 */

# 讀取目錄

$d = dir("./");

echo "<P ALIGN=\"CENTER\">   \n";

while($entry = $d->read())

{

// 忽略無文件情況

if ( !is_file($entry) )

continue;

/* 將文件名與擴(kuò)展名分開。由于.是正則表達(dá)式特殊字符,應(yīng)該用\引出 */

list($filenm, $fileext) = split("\.",$entry, 2);

// 忽略非.php3文件情況

if( $fileext != "php3" )

continue;

/* 現(xiàn)在我們已經(jīng)把.php3文件都選出,下面搜尋文件中的第一行(標(biāo)題)

類似$title="something";

并將以上標(biāo)題內(nèi)容分開,用作鏈接文字 */

$linknm = "";

$fp=fopen($entry,"r");

while($buffer=fgets($fp, 4096))

{

$buffer = trim($buffer);

// 我們已經(jīng)把每個(gè)文件的標(biāo)題放在文件的第一行以便搜索

// 但是當(dāng)你改變變量名稱時(shí)可能會帶來大麻煩

if (ereg("title *= *\"", $buffer))

{

/* 我們已經(jīng)取得了標(biāo)題內(nèi)容并可以在此基礎(chǔ)上

進(jìn)行去除空格等處理。

必須以PHP代碼方式處理,比如$title = "blah blah" */

eval($buffer);

// 然后將鏈接文字顯示為標(biāo)題文字

$linknm = $title;

break;

}

}

fclose($fp);

if ( $entry == basename($PHP_SELF) )

echo "$linknm";

else

echo "<A HREF=\"$entry\">$linknm</A>";

echo "   ";

}

$d->close();

echo " </P>\n";

?>



照片收藏夾



我們將引用基于HTTP的驗(yàn)證、文件系統(tǒng)函數(shù)和文件上傳功能維護(hù)放置圖像文件的目錄。

同時(shí)我們需要建立一個(gè)可以列出在該目錄下所有照片的頁面。



文件上傳

<?

include("include/common.inc");

// 我們在這里再做一次用戶驗(yàn)證 

if(!isset($PHP_AUTH_USER)) 

{

Header("WWW-Authenticate: Basic realm=\"$MySiteName\"");

Header("HTTP/1.0 401 Unauthorized");

echo "Sorry, you are not authorized to upload files\n";

exit;



else 

{

if ( !($PHP_AUTH_USER==$MyName && $PHP_AUTH_PW==$MyPassword ) )

{

// 如果是錯(cuò)誤的用戶名稱/密碼對,強(qiáng)制再次認(rèn)證

Header("WWW-Authenticate: Basic realm=\"My Realm\"");

Header("HTTP/1.0 401 Unauthorized");

echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.<P>";

exit;



}

if ( $cancelit ) 

{

// 當(dāng)瀏覽者按下"取消"按鈕則轉(zhuǎn)向首頁面

header ( "Location: front_2.php3" );

exit;

}

function do_upload () {

global $userfile, $userfile_size, $userfile_name, $userfile_type;

global $local_file, $error_msg;

global $HTTP_REFERER;

if ( $userfile == "none" ) {

$error_msg = "You did not specify a file for uploading.";

return;

}

if ( $userfile_size > 2000000 ) 

{

$error_msg = "Sorry, your file is too large.";

return;

}

// Wherever you have write permission below...

$upload_dir = "photos";

$local_file = "$upload_dir/$userfile_name";

if ( file_exists ( $local_file ) ) {

$error_msg = "Sorry, a file with that name already exists";

return;

};

// 你還可以由此檢查文件名稱/類型對以確定是何種文件:gif,jpg,mp3…

rename($userfile, $local_file);

echo "The file is uploaded<BR>\n";

echo "<A HREF=\"$HTTP_REFERER\">Go Back</A><BR>\n";

}

$title = "Upload File";

include("include/header.inc");

if (empty($userfile) 
 $userfile=="none") 

{

// 輸出以下表單

?>

<FORM ACTION="<? echo "$PHP_SELF"; ?>" ENCTYPE="multipart/form-data" 
METHOD=POST>

<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="2000000">

<INPUT TYPE="FILE" NAME="userfile" SIZE="24" 
MAXLENGTH="80">

<BR><BR>

<INPUT TYPE="SUBMIT" VALUE="Upload File!" NAME="sendit">

<INPUT TYPE="SUBMIT" VALUE="Cancel" NAME="cancelit"><BR>

</FORM>

<I><FONT SIZE="2">(You may notice a slight delay while 
we upload your file.)</FONT></I>

<?

} else {

if ( $error_msg ) { echo "<B>$error_msg</B><BR><BR>"; 
}

if ( $sendit ) {

do_upload ();



}

include("include/footer.inc");

?>



照片圖庫





<?

include("include/common.inc");

$title = "Gallery";

include("include/header.inc");

?>

<P>

Here are some of our family photos. This PHP script can really

be made better, by splitting into multiple pages.

</P>

<?

$d = dir("photos");

while($entry = $d->read())

{

if (is_file("photos/$entry"))

echo "<IMG SRC=\"photos/$entry\">\n";

}

$d->close();

?>

<?

include("include/footer.inc");

?>



另外,你可以在文件上傳的表單中加上一個(gè)輸入元素去描述該上傳的文件。這個(gè)元素將被存儲在文件中,然后被以上的照片圖庫的那段代碼所讀出并顯示出來。



標(biāo)簽:5.PHP的其他技巧