首頁 >後端開發 >php教程 >Smarty實例教學 實例篇_PHP教程

Smarty實例教學 實例篇_PHP教程

WBOY
WBOY原創
2016-07-21 16:11:05764瀏覽


Smarty實例教學實例篇(三、使用ADODB連接數據庫)

前兩個月因為工作上的原因一直很忙,所以沒有及時完成這個教程,正好今天週六不用加班,抽個空完成它吧! 在開始新的教程的時候,我

先把以前的我寫的那個教程中的一些錯誤的地方修改過來,在這裡要感謝nesta2001zhang兄弟,是他找出了文章中的一些錯誤,否則真的被別人

罵"誤人子弟了"(說來真是慚愧,我的初稿發布後就發現在一大堆的問題,後來一些時候發重新修改後的文件中居然也出現了錯誤,真是不應

該...)
在上幾篇教程中的:
============ =============================================
while( $db->next_record() && $i > 0)
{
$array[] = array("NewsID", csubstr($db->f("iNewsID"), 0, 20),
"NewsTitle", csubstr($db->f("vcNewsTitle"), 0, 20));

$i--;
}
======= ==================================================
應該改為:
======================================== =================
while($db->next_record() && $i > 0)
{
$array[] = array(" NewsID" => $db->f("iNewsID"),
"NewsTitle" => csubstr($db->f("vcNewsTitle"), 0, 20));

$i --;
}
======================================== =================
為什麼這樣改呢?因為第二種方法更清晰明了一些,實際上第一種方式所執行的效果與第二種方法沒什麼差別,而且那幾個程式我都曾經調試過,

沒有任何問題.
好了,那我們今天就先來說說ADODB.說到ADODB,可能做過ASP的都知道WINDOWS平台的ADO組件,但我們這裡的ADODB不是微軟的那個資料庫操

作組件,而是由php語言寫的一套資料庫操作類庫,先讓我們來看看它倒底有什麼樣的優點.
1. 以標準的SQL語句書寫的資料庫執行程式碼在進行資料庫移植時不用更改原始程式,也就是說它可以支援多種資料庫,包括ACCESS.
2. 提供與微軟ADODB相似的語法功能.這一點對於從ASP轉行到PHP的人們是一大福音,它的很多操作都與WINDOWS中的ADODB相似.
3. 可以生成Smarty循環需要的二維數組,這樣會簡化smarty開發.這一點是等會我給大家演示.
4. 支援資料庫的快取查詢,最大可能的提高查詢資料庫的速度。
5. 其它的實用功能.
雖然說優點很多,但是由於這個類庫非常的龐大,光它的主執行類就107K,所以如果大家考慮執行效率的話就要認真想想了.不過說實話,它的

功能還是很強大的,有很多的很實用的功能,使用它的這些功能,可以非常方便的實現我們想要的功能.所以對於那些老闆沒有特殊要求時大家不

防用它

一、如何得到ADODB? 它的運作環境是什麼?
從http://sourceforge.net/project/show...簆hp4.0.5以上。
二、如何安裝ADODB?
解壓縮下載回的壓縮文件,注意:大家下載回來的格式為ADODB.tar.gz,這是linux的壓縮格式,在windows下大家可以使用winrar對其進

行解壓縮,解壓縮完成後將目錄拷貝到指定的目錄的adodb目錄下,像我在例子中將它拷貝到了/comm/adodb/中。
三、如何呼叫ADODB?
使用include_once ("./comm/adodb/adodb.inc.php");這行就不用說了吧?包含ADODB的主檔案。
四、如何使用ADODB?
1.進行初始化:
ADODB採用$conn = ADONewConnection();這樣的語句進行初始化,對ADODB進行初始化有兩種方式:
第一種方式為:傳統方式。我暫時稱它為這個名稱。它使用的建立一個新連線的方式很像php中的標準連線方式:
$conn = new ADONewConnection($dbDriver);
$conn->Connect($host, $user, $passwd, $ db);
簡單吧?如果使用過phplib中的db類別應該對它很熟悉的。

第二種方式:採用dsn方式,這樣是將資料庫的連接語句寫成一條語句來進行初始化,dsn的寫法有為:$dsn =

"DBType://User :Passwd@Host/DBName"; 其中DBType表示資料庫類型,User表示使用者名,Passwd為密碼,Host為伺服器名,DBName為資料庫名稱

,像這樣我使用oracle資料庫,使用者名稱:oracleUser ,密碼為oraclePasswd,資料庫伺服器為localhost, 資料庫為oradb的dsn這樣寫:
$dsn = "oracle://oracleUserraclePasswd@localhost/oradb";
$conn = new ADONewConnection($dsn);
這種方式可能從ASP轉行來的程式設計師會更感興趣。

這兩種方式都可以使用,要看個人習慣來選用了.

2. 相關的概念:
使用ADODB有兩個基本的類,一是ADOConnection類,另一個是ADORecordSet類,使用過ASP的人看到這兩個類會明白它的含義,

ADOConnection指的是資料庫連接的類,而ADORecordSet指的是由ADOConnection執行查詢語句傳回的資料集類,相關的資料大家可以查詢ADODB

類別的手冊。

3.基本的函數:

關於ADOConnection類別的相關方法有:
1.Connect:資料庫連線方法,上邊我們介紹過的。對於mysql還有PConnect,與PHP語言中的用法一樣
2.Execute($sql):執行查詢語句結果回傳一個ADORecordSet類別。
3.GetOne($sql):傳回第一行的第一個欄位
4.GetAll($sql):傳回所有的資料。這個函數可是大有用處,記得不記的我在以前的教程中寫關於新聞列表的輸入時要將需要在頁面顯示的

新聞列表做成一個二維數組?就是這樣的語句:
========================================== ===========================================
while($db ->next_record())
{
$array[] = array("NewsID" => $db->f("iNewsID"),
"NewsTitle" => csubstr($db-> f("vcNewsTitle"), 0, 20));
}
============================== ================================================== =====
這一行是什麼意思呢?就是將要顯示的新聞例表產生
$array[0] = array("NewsID"=>1, "NewsTitle"=>"這裡新聞的第一條");
$array[1] = array("NewsID"=>2, "NewsTitle"=>"這裡新聞的第二條");
...
這樣的形式,但如果我們不需要對標題進行控制,在ADODB中我們就有福了,我們可以這樣寫:
===================================== =============================================
$strQuery = "select iNews, vcNewsTitle from tb_news_ch";
$array = &$conn->GetAll($strQuery);//注意這句話
$smarty->assign("News_CH", $array);
unset($array);
====================================== ============================================
當然,這裡的$conn應該要初始化過了,不知大家看明白沒有了?原來我要手動創建的二維資料在這裡直接使用GetAll就行了! ! !這也是

有人會說ADODB Smarty是無敵組合的原因之一了...
4.SelectLimit($sql, $numrows=-1, $offset=-1, $inputarrr =false): 回傳一個資料集,大家從語句上也不難看出它是一條限量查詢語

句,與mysql語句中的limit 有異曲同工之效,來一個簡單的例子:
$rs = $conn->SelectLimit("select iNewsID, vcNewsTitle from tb_news_CH", 5, 1);
看懂了嗎? $rs中保存的是資料庫中從第一記錄開始的5筆記錄。我們知道,在oracle資料庫不支援在SQL語句中使用limit,但是我們如果讓

用ADODB的話,那這個問題就容易解決多了!
5.Close():關閉資料庫,雖然說PHP在頁面結束時會自動關閉,但為了程式的完整大家還是要在頁面結束進行資料庫的關閉。

關於ADORecordSet.ADORecordSet為$conn->Execute($sql)傳回的結果,它的基本函數如下:
1. Fields($colname):傳回欄位的值.
2 . RecordCount():所包含的記錄數.這個記錄確定資料集的記錄總數.
3. GetMenu($name, [$default_str=''], [$blank1stItem=true], [$multiple_select=false ], [$size=0], [$moreAttr=''])非常好的一

個函數,使用它可以回傳一個name=$name的下拉式選單(或多選框)!! !當然,它是一個HTML的字串,這是一個令人激動的好東西,$name指的是

option的name屬性,$default_str是預設選取的字串,$blank1stItem指出第一項是否為空,$multiple_select指出是否為多選框,而我們得到這個

字符串後就可以使用$smarty->("TemplateVar", "GetMenuStr")來在模板的"TemplateVar " 處輸入下拉清單(或是多先框)
4. MoveNext():來看一段程式碼:
====================== =====================================
$rs = &$conn->Exceute( $sql);
if($rs)
{
while($rs->EOF)
{
$array[] = array("NewsID" => $rs-> fields["iNewsID"],
"NewsTitle" => csubstr($rs->fields["vcNewsTitle"]), 0, 20);

$rs->MoveNext();
}
}
========================================= ================
明白了嗎?很像MS ADODB中的那一套!
5. MoveFirst(),MoveLast(), Move($ to):一樣的,看函數名大家就可以知道它是什麼意思了.
6. FetchRow():回傳一行,看程式碼:
============= ============================================
$rs = &$conn->Exceute($sql);
if($rs)
{
while($row = $rs->FetchRow())
{
$array[] = array("NewsID" => $row["iNewsID"],
"NewsTitle" => csubstr($row["vcNewsTitle"]), 0, 20);
}
}
=============================================== ==========
它實現了與4一樣的功能,但看起來更符合PHP的習慣,而4的習慣看起來更像是MS ADODB的辦法.

7.GetArray($num):傳回資料集中的$num行資料,將其組合成二維數組.這個方法我們在範例index.php要用到.

8 . Close():同mysql_free_result($rs);清除內容佔用.

好了,初步的函數就介紹到這裡,夠我們用的啦!實際上ADODB還有很多實用的技術,包括格式化日期時間,格式化查詢語句,輸出表格,更高級

點的Cache查詢,帶參查詢等等,大家可以自行查看手冊.

下面我們開始學習我們的程式,同樣還是那個Web程式,我將其中的comm目錄重新組織了一下,同時為了提高效率對Smarty重新進行了封裝

,mySmarty.class.php是封裝後的類別,它繼承自Smarty,所以以後所有的程式檔案只呼叫新的類別MySmarty,先來看看目錄結構:
Web (站點根目錄)

|---- comm (Smarty相關文件目錄)

| |---- smarty (Smarty原始檔案目錄)
| |---- adodb (adodb原文目錄)
| |-----mySmarty.class.php (擴充後的smarty檔)
| |-----csubstr.inc (截取中文字元)

|---- cache (Smarty快取目錄,*nix下保證讀寫權限)

|---- templates (網站範本檔案存放目錄)

| |----header.tpl(頁面頁頭範本檔案)
| |---- index.tpl(網站首頁範本檔案)
| |----foot.tpl(頁面頁尾範本檔案)
| |----news.tpl (新聞頁範本檔案)

|
|---- templates_c (範本檔案編譯後存放目錄,*nix下保證讀寫權限)

|---- css (站點CSS檔案目錄)

|---- image (站點圖片目錄)

|---- media (站點Flash動畫存放目錄)

|----indexbak.htm (首頁原始效果圖)

|----newsbak,htm (新聞頁原始效果圖)

|----index.php (Smarty首頁程式檔案)

| ----news.php (Smarty新聞顯示檔)

|----newsList.php (顯示新聞列表)

|----例程說明.txt (本文件)

相對於前兩個教程,有將comm目錄重新組織了一下,其它的文件結構沒有變化,整個站點相對於上兩個教程來講,改變的地方只有comm目錄與

index.php與news.php,同時增加了新聞列表,大家可以在index.php執行後的頁面中點擊"國內新聞","國際新聞", "娛樂新聞"來分別查看各自的

新聞列表, 我們先來看看index.php:

============================ ============================
index.php
============= =========================================
/*********************************************
*
* 檔案名稱: index.php
* 作用: 顯示實例程式
*
* 作者: 大師兄弟
* Email: teacherli@163.com
*
**** *****************************************/
include_once("./comm/mySmarty.class.php"); //包含smarty的擴充類別檔案
include_once("./comm/adodb/adodb.inc. php"); //包含ADODB主執行檔
include_once("./comm/csubstr.inc"); //包含中文截取類別

define ("NEWS_NUM", 5); //定義新聞列表顯示數目

$smarty = new MySmarty(); //建立smarty實例物件$smarty

1. $conn = ADONewConnection("mysql"); //初始化ADODB
2. $conn->Connect("localhost", "root", "", "News"); //連接資料庫


//這裡將處理國內新聞部分
3. $strQuery = "SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_CH ORDER BY iNewsID DESC";
4. $rs = &$conn->Execute($strQuery);
5. $rs = &$conn->Execute($strQuery);
5. $smarty> assign("News_CH", $rs->GetArray(NEWS_NUM));
6. unset($rs);


//這裡處理國際新聞部分
$strQuery = " SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_IN ORDER BY iNewsID DESC";
$rs = &$conn->Execute($strQuery);
$smarty->assign("News_IN", $rs->IN", $rs-> GetArray(NEWS_NUM));
unset($rs);

//這裡將處理娛樂新聞部分
$strQuery = "SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM _news_MU ORDER BY iNewsNews ";
$rs = &$conn->Execute($strQuery);
$smarty->assign("News_MU", $rs->GetArray(NEWS_NUM));
unset($rs) ;

7. $conn->close();

//編譯並顯示位於./templates下的index.tpl模板
$smarty->display("index. tpl");
?>
====================================== =======================================
同樣,我在關鍵的地方加了數標,下面來說明一下它們的意義:

1. 建立一個連接物件$conn,大家在這裡要注意的是它的初始不是以$conn = new ADONewConnection($dbType)這樣的形式出現的,也就是說

,ADONewConnection不是一個class,你不能使用new 對它進行初始化.看看它的源碼你就會明白,這只不過是一個函數.
2. 這個就不用說了吧?打開一個News的資料庫,主機為:localhost, 使用者名為root, 密碼為""

3. 一個查詢語句,注意,這裡要將查詢的欄位使用AS關鍵字來重新標識,名稱為你在模板中設定的模板變數的名稱.

4. 使用Execute來執行這個查詢,結果回傳一個RecordSet資料集

5. 這裡有個方法:$rs->GetArray($num) 這個在上邊介紹過,它是要從$rs這個數據集中返回$num行,結果為一個可被Smarty所識別的二維數

據.這樣ADODB就自動為我們構建起了這樣的結構,而在我們以前的例子中,都是使用一個循環構建這樣的數組的.

6. 這一句我看也不用說了吧?

7. 關閉記憶體中的相關資源.

大家可以看看,整個程式中再沒有出現什麼while語句,程式整體結構顯的非常清楚,這就是為什麼ADODB Smarty是黃金組合的原因.不過話也

說回來了,簡單有簡單的問題,不知大家想過沒有,這裡對顯示的新聞標題的長度沒有控制,也就是說,如果某條新聞標題的長度超出一行顯示的範

圍,它就是自動折行到下一行,那麼整個的版面就會變亂,所說大家自已適自己的情況來決定是否這樣使用吧當然,你也可以使用像上一節中介

紹的那樣,使用一個循環語句重構這個二維數組,使它符合你的用途,怎麼做大家自己去想吧,參考PHPLIB中的做法,上節我介紹過了...

再來看看新聞頁吧

===================== ========================================
news.php
= ================================================== ==========
/*********************************************
*
* 檔案名稱: news.php
* 作用: 新聞顯示程式
*
* 作者: 大師兄弟
* Email: teacherli@163.com
*
**** *****************************************/
include_once("./comm/mySmarty.class.php"); //包含smarty的擴充類別檔案
include_once("./comm/adodb/adodb.inc.php"); //包含ADODB主執行檔

$smarty = new MySmarty(); //建立smarty實例物件$smarty

$conn = ADONewConnection("mysql"); //初始化ADODB
$conn->Connect("localhost", "root", "", "News"); //連接資料庫

$NewsID = $_GET["id"]; //取得新聞編號
$NewsType = $_GET["type"]; //要顯示的新聞類型
switch($ NewsType)
{
case 1:
$dbName = "tb_news_CH";
break;
case 2:
$dbName = "tb_news_IN";
break; >case 3:
$dbName = "tb_news_MU";
break;
}

$strQuery = "SELECT vcNewsTitle AS NewsTitle, ltNewsContent AS NewsContent FROM " . $ 1. $row = &$conn->GetRow($strQuery); //回傳一個一維數組,下標為模板變數名

$smarty->display($row);
unset ($row);

$conn->Close();
?>
======================= ======================================
說明一下關鍵的地方,其實在news .php中也只有一個地方值的說明一下了.

1. $conn->GetRow($strQuery):這一句回傳一個一維數組,回傳的形式為:

$array = ("NewsTitle"=>"xxxx", "NewsContent"=>"yyyyy...")
明白如果使用$smarty($array)後Smarty會幹什麼嗎?對了,就是相當於:
$smarty->assign("NewsTitle", "xxxx");
$smarty->assign("NewsContent", "yyyyy...");

簡單吧簡單

下面再來看看新聞清單:
================================= ===============================
newsList.php
========== ================================================== ====
/*********************************************
*
* 檔案名稱: newsList.php
* 作用: 新聞列表顯示程式
*
* 作者: 大師兄弟
* Email: teacherli@163.com
*
*** ******************************************/
include_once("./comm/mySmarty.class.php"); //包含smarty的擴充類別檔案
include_once("./comm/adodb/adodb.inc.php"); //包含ADODB主執行檔

$smarty = new MySmarty(); //建立smarty實例物件$smarty

$conn = ADONewConnection("mysql"); //初始化ADODB
$conn->Connect("localhost", "root", "", "News"); //連接資料庫

$NewsID = $_GET["id"]; //取得新聞號碼
$NewsType = $_GET["type"]; //要顯示的新聞類型
switch($NewsType)
{
case 1:
$tbName = "tb_news_CH";
break;
case 2:
$tbName = "tb_news_IN";
break;
case 3:
$tbName = "tb_news_MU";
break;
}

$strQuery = "SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM " . $tbName;
1. $rs = &$conn->GetAll($strQuery);
2. $smarty ->assign("NewsType", $NewsType); //這句話為新聞清單中的連結服務
3. $smarty->assign("NewsList", $rs);
unset($rs) ;
$conn->close();

$smarty->display("newsList.tpl");
?>
============= ================================================== ===
分別來說明一下:

1. GetAll($strQuery):這個函數可是個好東東,它的作用是將$strQuery查詢到的所有資料組合成為一個能夠被Smarty所識別的二維數組,

記住:它返回的是一個二維數組而不是一個RecordSet,所在你可以程序中直接在3處使用.
2. 這裡是為了給新聞標題做連結時要GET參數type=XX而做的

後記:
大家在使用ADODB時有幾個地方要注意:
1. 初始化: 初始化的方式不是使用new ,因為它不是一個物件
2. 方法: 基本上每個方法都是以大寫字母開頭大小寫混合的名稱,這一點好像與*NIX的習慣有些不同,也不同於PHP的整體風格,所以

注意這裡的大小寫問題.

好了,這個Smarty的系列教程到這裡就基本已經完成了,我的這幾篇初級教程就算是拋磚引玉吧,希望更多的高手將更多的經驗寫出來,大家

共同提高!因為公司不允許開QQ,如果大家有想要與我進行交流的話,請大家加我的MSN:teacherli@ceua.org ,歡迎大家一起討論!

(出處:Viphot)

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/314055.htmlTechArticleSmarty實例教學實例篇(三、使用ADODB連結資料庫) 前兩個月因為工作上的原因一直很忙,所以沒有及時完成這個教程,正好今天週六不用加班...
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn