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

PHP/MySQL3日通-第3天(二)

[摘要]三、 處理常規(guī)表達式   我們稍微講講用ereg()和eregi()兩個函數(shù)處理常規(guī)表達式。前面我已經(jīng)提過,這些函數(shù)有的很簡單,有的很復雜,看您的實際需要而定。   使用常規(guī)表達式,您可以對一個字符串進行檢查,搜索其中的一些結(jié)構(gòu)模式,判定這些模式是否滿足您的規(guī)定。最普遍的用法包括檢查電子郵件地址是...
三、 處理常規(guī)表達式

  我們稍微講講用ereg()和eregi()兩個函數(shù)處理常規(guī)表達式。前面我已經(jīng)提過,這些函數(shù)有的很簡單,有的很復雜,看您的實際需要而定。

  使用常規(guī)表達式,您可以對一個字符串進行檢查,搜索其中的一些結(jié)構(gòu)模式,判定這些模式是否滿足您的規(guī)定。最普遍的用法包括檢查電子郵件地址是否有效(當然,即使這種辦法判定有效,也不能保證郵件地址真的存在)。

  我們在這里不細究常規(guī)表達式的復雜細節(jié)了,僅僅給出幾個實例。您可以使用上一頁中用過的表格 - 把相應的程序代碼復制過來,添加到下面的代碼段中,就可以看到它是怎樣工作的。

  首先,我們要確保表格中各欄只能輸入字母。下面的常規(guī)表達式在用戶輸入一個或多個小寫字母時判定為真,而輸入數(shù)字是不允許的:

if (!ereg("[a-Z]", $first) !ereg("[a-Z]", $last)) {

現(xiàn)在我們更進一步,檢查字符串的長度是否是四到六位字符長。用[[:alpha:]]是檢查字符是不是字母的簡單方式。大括號內(nèi)的數(shù)字檢查字符個數(shù)。還要說明的是,^ 和 $ 分別代表字符串的開始和結(jié)束。

if (!ereg("^[[:alpha:]]{4,6}$", $first) !ereg("^[[:alpha:]]{4,6}$", $last)) {

最后,我們來構(gòu)造一個常規(guī)表達式,來檢驗電子郵件地址的有效性。這種檢驗方式的效果已經(jīng)引發(fā)了相當多的討論。沒有什么東西是十全十美的,不過我下面給出的這段程序還是十分奏效的。

別花太多時間來細究這段代碼了,還是先到下一頁內(nèi)容吧。

四、 簡便方法

  前面的常規(guī)表達式怎么樣?很有意思,是吧?要是在每個需要檢查電子郵件地址的程序里都寫上這么一段程序,那才真叫有意思呢?!想想看吧,得寫那么亂七八糟的一段程序,還得寫上那么多遍!...不過,當然了,還有更簡便的方法。

  還記得前面? 學過的頭文件嗎?它能讓我們寫一段程序,象是這個電子郵件地址的檢查程序,然后把這段程序包含進多個程序里面去。這樣,我們要改寫這段程序時,只須改動一處就行了,不用修改多個文件。

  但是,要做到這一點,我們必須用到函數(shù)。

  我們已經(jīng)用過很多次函數(shù)了。每次我們查詢數(shù)據(jù)庫或檢查字符串長度時,我們都是用函數(shù)來做的。這些函數(shù)是PHP自帶的。如果您是位熱心的程序員,您可以用自己編寫的函數(shù)來擴充PHP本身的功能。但對本教程而言,這部分內(nèi)容是太過高深了一點。我們要創(chuàng)建的函數(shù)不是那一種,而是寫在PHP腳本程序內(nèi)部的函數(shù)。

  函數(shù)就是一段程序代碼,我們可以把一個或多個值傳給這段代碼,然后這段代碼會處理我們傳給它的數(shù)據(jù)并返回一個值。根據(jù)實際需要,函數(shù)可以很簡單,也可以十分復雜。但是只要我們傳進去一個數(shù),然后能得到一個數(shù),您管它里面有是復雜還是簡單呢!這就是函數(shù)的可愛之處。

  PHP里的函數(shù)與C語言里的函數(shù)表現(xiàn)差不多。當我們定義函數(shù)時,必須指明函數(shù)需要接收什么樣的數(shù)據(jù)。一開始好象不太好理解為什么它要接收數(shù)據(jù)進去,不過這樣可以防止發(fā)生一些怪異的問題。函數(shù)之所以能做到這一點,是因為函數(shù)里面的變量都是私有變量,也就是說,它只在該函數(shù)內(nèi)部存在。例如,您在程序中有一個變量叫$myname,如果您創(chuàng)建了一個函數(shù),想讓這個函數(shù)也使用那個$myname變量(值也相同),那是不行的。您可以在函數(shù)內(nèi)部創(chuàng)建一個變量,名字也叫$myname,這兩個變量可以各平相處,而各自取不同的值。不過我可不建議您這么做!您如果真的這么做了,等半年后您再來修改這樣的程序時,您可能就會被弄糊涂了。

  那我們現(xiàn)在就來創(chuàng)建一個函數(shù),先來個簡單的。我們要給它取個名字,指定它要接收什么的變量。在調(diào)用這個函數(shù)之前,我們還得定義這個函數(shù)。

 $#@60;html$#@62;

$#@60;body$#@62;

$#@60;?php

function addnum($first, $second) {

$newnum = $first + $second;

return $newnum;

}

echo addnum(4,5);

?$#@62;

$#@60;/body$#@62;

$#@60;/html$#@62;

這就行了!首先,我們創(chuàng)建了第一個自己的函數(shù)。我們定義了兩個新變量,$first和$second,注意它們是怎樣被定義的。在調(diào)用這個函數(shù)時,要給這兩個變量按它們出現(xiàn)的順序賦好值 - 4賦給$first,5賦給$second。然后我們簡單地把這兩個數(shù)加在一起,返回結(jié)果!胺祷亍痹谶@里的意思是把結(jié)果送回去。在程序最后部分我們把數(shù)字9顯示出來。

  我們再來創(chuàng)建一個函數(shù),讓它對我們的數(shù)據(jù)庫應用有點幫助。一個能妥善處理錯誤的函數(shù)怎么樣?試試下面的程序:

 $#@60;html$#@62;

$#@60;body$#@62;

$#@60;?php

function do_error($error) {


echo "噢,好象有點兒問題...$#@60;br$#@62;";


echo "系統(tǒng)報告的錯誤是:$error.\n$#@60;br$#@62;";


echo "最好是暫時關(guān)閉網(wǎng)站并通知系統(tǒng)管理員。";

die;

}


if (!$db = @mysql_connect("localhost","user", "password")) {


$db_error = "無法連接到MySQL數(shù)據(jù)庫";

do_error($db_error);
}

?$#@62;

$#@60;/body$#@62;

$#@60;/html$#@62;

[page_break]

  在運行程序之前,試試關(guān)閉MySQL數(shù)據(jù)庫,或使用錯誤的用戶名或口令。您會看到友好的、有用的錯誤信息 。細心的朋友會注意到在mysql_connect()函數(shù)之前的那個@符號。它會抑制系統(tǒng)錯誤信息,使得程序只能從do_error()函數(shù)那里得到有關(guān)的錯誤信息。您還會注意到,我們可以把一個在別處定義的變量作為參數(shù)傳給函數(shù),而不是在調(diào)用時直接賦一個值。

  還記得我過函數(shù)使用的是私有變量吧?這話說得不完全對。事實上,您可以讓函數(shù)訪問到函數(shù)外面的變量。您可能要寫一個函數(shù),用它來查詢數(shù)據(jù)庫,然后把結(jié)果顯示在多個網(wǎng)頁中。您不想每次都把數(shù)據(jù)庫連接標識都傳給函數(shù)。在這種情況下,您可以把連接標識定義成一個全局的變量。例如:

 $#@60;html$#@62;

$#@60;body$#@62;

$#@60;?php

function db_query($sql) {

global $db;

$result = mysql_query($sql,$db);

return $result;

}

$sql = "SELECT * FROM mytable";

$result = db_query($sql);

?$#@62;

$#@60;/body$#@62;

$#@60;/html$#@62;

  這是個很簡單的函數(shù),但重要的是,您在調(diào)用這個函數(shù)時,不必傳遞$db變量 - 您可以通過 global這個字使得函數(shù)可以訪問到該變量。在這條語句中您可以定義多個全局變量,各個全局變量之間用逗號隔開。

  最后,您可以使用可選參數(shù),這樣看起來您已經(jīng)是真正的專家了。這里面關(guān)鍵的一點是,在函數(shù)中定義參數(shù)時要給它指定一個缺省值。然后您在調(diào)用這個函數(shù)時,如果不為該參數(shù)變量指定其他值,那么函數(shù)會自動把缺省值賦給這個變量。如果您指定了其他值,那么缺省值就不起作用了。

  不太明白?比方說,您在連接數(shù)據(jù)庫時,幾乎總是連接到相同的服務器,并且使用相同的用戶名和口令。不過有時候,您也需要連接到其他的服務器?纯聪旅娴某绦颍

 $#@60;html$#@62;

$#@60;body$#@62;

$#@60;?php



function db_connect($host = "localhost", $user="username", $pass="graeme") {

$db = mysql_connect($host, $username, $password);

return $db;

}


$old_db = db_connect();



$new_host = "site.com";

$new_db = db_connect($new_host);

?$#@62;


$#@60;/body$#@62;

$#@60;/html$#@62;

  很“酷”是不是?在定義函數(shù)時,函數(shù)內(nèi)部用到的變量也定義好了。第一次調(diào)用這個函數(shù)時,全部參數(shù)變量都是用的缺省值。第二次調(diào)用時,服務器名變了,而用戶名和口令沒有變。真是太棒了!

  想想您在什么地方還能用到函數(shù)。您可以用函數(shù)來作數(shù)據(jù)校驗,來完成常用的功能,等等。在對Web網(wǎng)頁上顯示的文字作處理時,我用到了很多函數(shù)。我可以一次完成對文字的檢查、解析和修改,來加入換行符和HTML標記等。

  現(xiàn)在,剩下的就是我要給您的一些忠告了。

五、進階技巧

  談起數(shù)據(jù)庫開發(fā),我們有很多東西要學。如果您還沒有學習過怎樣進行數(shù)據(jù)庫設計,和怎樣在不同的平臺上可靠地運行數(shù)據(jù)庫,那么請您趕快去找本這方面的好書來讀一讀。這方面的能力會帶給您無法估量的好處,從長遠的眼光看,它會為您節(jié)省大量的時間與精力。還有,認真學學MySQL。這是一個復雜而有趣的數(shù)據(jù)庫,有很多不錯的文檔。學學數(shù)據(jù)庫的表結(jié)構(gòu)、數(shù)據(jù)類型,還有SQL。如果您真正掌握了SQL,您可以完成相當多的實際工作。

  最后,還有PHP。您想要的一切幾乎都可以在PHP的網(wǎng)站上找到,包括全面的文檔、郵件討論組的討論內(nèi)容、程序代碼庫,等等。學習PHP的一個絕好的辦法是研究用戶手冊中給出的實例,并查閱網(wǎng)上的代碼。網(wǎng)友們發(fā)表的代碼包括許多函數(shù)和類,您可以在自己的程序中直接使用,而不必自己從頭來過。另外,如果您遇到問題,郵件討論組是一個非常值得利用的資源。PHP的開發(fā)人員自己也會參加郵件討論組,還有許多經(jīng)驗豐富的高手們,他們都可以幫助您解決問題。

  祝您編程順利,一切順利!





相關(guān)文章