PHP/MySQL三日通-第三天(二)

來源:互聯網
上載者:User
三、 處理常規運算式

 

  我們稍微講講用ereg()和eregi()兩個函數處理常規運算式。前面我已經提過,這些函數有的很簡單,有的很複雜,看您的實際需要而定。

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

  我們在這裡不細究常規運算式的複雜細節了,僅僅給出幾個執行個體。您可以使用上一頁中用過的表格 - 把相應的程式碼複製過來,添加到下面的程式碼片段中,就可以看到它是怎樣工作的。

  首先,我們要確保表格中各欄只能輸入字母。下面的常規運算式在使用者輸入一個或多個小寫字母時判定為真,而輸入數字是不允許的:

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

現在我們更進一步,檢查字串的長度是否是四到六位字元長。用[[:alpha:]]是檢查字元是不是字母的簡單方式。大括弧內的數字檢查字元個數。還要說明的是,^ 和 $ 分別代表字串的開始和結束。

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

最後,我們來構造一個常規運算式,來檢驗電子郵件地址的有效性。這種檢驗方式的效果已經引發了相當多的討論。沒有什麼東西是十全十美的,不過我下面給出的這段程式還是十分奏效的。

  if (!ereg(^[-!#$%&\*+\\./0-9=?A-Z^_`a-z{|}~]+.

@.

[-!#$%&\*+\\/0-9=?A-Z^_`a-z{|}~]+\..

[-!#$%&\*+\\./0-9=?A-Z^_`a-z{|}~]+$, $last)) {

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

四、 簡便方法

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

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

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

  我們已經用過很多次函數了。每次我們查詢資料庫或檢查字串長度時,我們都是用函數來做的。這些函數是PHP內建的。如果您是位熱心的程式員,您可以用自己編寫的函數來擴充PHP本身的功能。但對本教程而言,這部分內容是太過高深了一點。我們要建立的函數不是那一種,而是寫在PHP指令碼程式內部的函數。

  函數就是一段程式碼,我們可以把一個或多個值傳給這段代碼,然後這段代碼會處理我們傳給它的資料並返回一個值。根據實際需要,函數可以很簡單,也可以十分複雜。但是只要我們傳進去一個數,然後能得到一個數,您管它裡面有是複雜還是簡單呢!這就是函數的可愛之處。

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

  那我們現在就來建立一個函數,先來個簡單的。我們要給它取個名字,指定它要接收什麼的變數。在調用這個函數之前,我們還得定義這個函數。

 

  $#@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;

這就行了!首先,我們建立了第一個自己的函數。我們定義了兩個新變數,$first和$second,注意它們是怎樣被定義的。在調用這個函數時,要給這兩個變數按它們出現的順序賦好值 - 4賦給$first,5賦給$second。然後我們簡單地把這兩個數加在一起,返回結果。“返回”在這裡的意思是把結果送回去。在程式最後部分我們把數字9顯示出來。

  我們再來建立一個函數,讓它對我們的資料庫應用有點協助。一個能妥善處理錯誤的函數怎麼樣?試試下面的程式:

  $#@60;html$#@62;

$#@60;body$#@62;

$#@60;?php

function do_error($error) {


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


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


echo "最好是暫時關閉網站並通知系統管理員。";

die;

}


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


$db_error = "無法串連到MySQL資料庫";

do_error($db_error);
}

?$#@62;

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

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

  在運行程式之前,試試關閉MySQL資料庫,或使用錯誤的使用者名稱或口令。您會看到友好的、有用的錯誤資訊 。細心的朋友會注意到在mysql_connect()函數之前的那個@符號。它會抑制系統錯誤資訊,使得程式只能從do_error()函數那裡得到有關的錯誤資訊。您還會注意到,我們可以把一個在別處定義的變數作為參數傳給函數,而不是在調用時直接賦一個值。

  還記得我過函數使用的是私人變數吧?這話說得不完全對。事實上,您可以讓函數訪問到函數外面的變數。您可能要寫一個函數,用它來查詢資料庫,然後把結果顯示在多個網頁中。您不想每次都把資料庫連接標識都傳給函數。在這種情況下,您可以把串連標識定義成一個全域的變數。例如:

  $#@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;

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

  最後,您可以使用選擇性參數,這樣看起來您已經是真正的專家了。這裡面關鍵的一點是,在函數中定義參數時要給它指定一個預設值。然後您在調用這個函數時,如果不為該參數變數指定其他值,那麼函數會自動把預設值賦給這個變數。如果您指定了其他值,那麼預設值就不起作用了。

  不太明白?比方說,您在串連資料庫時,幾乎總是串連到相同的伺服器,並且使用相同的使用者名稱和口令。不過有時候,您也需要串連到其他的伺服器。看看下面的程式:

  $#@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;

  很“酷”是不是?在定義函數時,函數內部用到的變數也定義好了。第一次調用這個函數時,全部參數變數都是用的預設值。第二次調用時,伺服器名變了,而使用者名稱和口令沒有變。真是太棒了!

  想想您在什麼地方還能用到函數。您可以用函數來作資料校正,來完成常用的功能,等等。在對Web網頁上顯示的文字作處理時,我用到了很多函數。我可以一次完成對文字的檢查、解析和修改,來加入分行符號和HTML標記等。

  現在,剩下的就是我要給您的一些忠告了。

五、進階技巧

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

  最後,還有PHP。您想要的一切幾乎都可以在PHP的網站上找到,包括全面的文檔、郵件討論群組的討論內容、程式碼庫,等等。學習PHP的一個絕好的辦法是研究使用者手冊中給出的執行個體,並查閱網上的代碼。網友們發表的程式碼封裝括許多函數和類,您可以在自己的程式中直接使用,而不必自己從頭來過。另外,如果您遇到問題,郵件討論群組是一個非常值得利用的資源。PHP的開發人員自己也會參加郵件討論群組,還有許多經驗豐富的高手們,他們都可以協助您解決問題。

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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.