ADODB結(jié)合SMARTY使用~超級(jí)強(qiáng)
更新時(shí)間:2006年11月25日 00:00:00 作者:
Smarty實(shí)例教學(xué)實(shí)例篇(三、使用ADODB連接數(shù)據(jù)庫)
前兩個(gè)月因?yàn)楣ぷ魃系脑蛞恢焙苊?所以沒有及時(shí)完成這個(gè)教程,正好今天周六不用加班,抽個(gè)空完成它吧! 在開始新的的教程的時(shí)候,我
先把以前的我寫的那個(gè)教程中的一些錯(cuò)誤的地方修改過來,在這里要感謝 nesta2001zhang兄弟,是他找出了文章中的一些錯(cuò)誤,否則真的被別人
罵"誤人子弟了 (說來真是慚愧,我的初稿發(fā)布后后就發(fā)現(xiàn)在一大堆的問題,后來一些時(shí)候發(fā)重新修改后的文件中居然也出現(xiàn)了錯(cuò)誤,真是不應(yīng)
該...)
在上幾篇教程中的:
=========================================================
while($db->next_record() && $i > 0)
{
$array[] = array("NewsID", csubstr($db->f("iNewsID"), 0, 20),
"NewsTitle", csubstr($db->f("vcNewsTitle"), 0, 20));
$i--;
}
=========================================================
應(yīng)該更改為:
=========================================================
while($db->next_record() && $i > 0)
{
$array[] = array("NewsID" => $db->f("iNewsID"),
"NewsTitle" => csubstr($db->f("vcNewsTitle"), 0, 20));
$i--;
}
=========================================================
為什么這樣改呢?因?yàn)榈诙N方法更清晰明了一些,實(shí)際上第一種方式所執(zhí)行的效果與第二種方法沒什么差別,而且那幾個(gè)程序我都曾經(jīng)調(diào)試過,
沒有任何問題.
好了,那我們今天就先來說說ADODB.說到ADODB,可能做過ASP的都知道WINDOWS平臺(tái)的ADO組件,但我們這里的ADODB不是微軟的那個(gè)數(shù)據(jù)庫操
作組件,而是由php語言寫的一套數(shù)據(jù)庫操作類庫,先讓我們來看看它倒底有什么樣的優(yōu)點(diǎn).
1. 以標(biāo)準(zhǔn)的SQL語句書寫的數(shù)據(jù)庫執(zhí)行代碼在進(jìn)行數(shù)據(jù)庫移植時(shí)不用更改源程序,也就是說它可以支持多種數(shù)據(jù)庫,包括ACCESS.
2. 提供與微軟ADODB相似的語法功能.這一點(diǎn)對(duì)于從ASP轉(zhuǎn)行到PHP的人們是一大福音,它的很多操作都與WINDOWS中的ADODB相似.
3. 可以生成Smarty循環(huán)需要的二維數(shù)組,這樣會(huì)簡化smarty開發(fā).這一點(diǎn)是等會(huì)我給大家演示.
4. 支持?jǐn)?shù)據(jù)庫的緩存查詢,最大可能的提高查詢數(shù)據(jù)庫的速度。
5. 其它的實(shí)用功能.
雖然說優(yōu)點(diǎn)很多,但是由于這個(gè)類庫非常的龐大,光它的主執(zhí)行類就107K,所以如果大家考慮執(zhí)行效率的話就要認(rèn)真想想了.不過說實(shí)話,它的
功能還是很強(qiáng)大的,有很多的很實(shí)用的功能,使用它的這些功能,可以非常方便的實(shí)現(xiàn)我們想要的功能.所以對(duì)于那些老板沒有特殊要求時(shí)大家不
防用用它
一、如何得到ADODB? 它的運(yùn)行環(huán)境是什么?
從http://sourceforge.net/project/show...簆hp4.0.5以上。
二、如何安裝ADODB?
解壓下載回的壓縮文件,注意:大家下載回來的格式為ADODB.tar.gz,這是linux的壓縮格式,在windows下大家可以使用winrar對(duì)其進(jìn)
行解壓,解壓完成后將目錄拷貝到指定的目錄的adodb目錄下,像我在例子中將它拷貝到了/comm/adodb/中。
三、如何調(diào)用ADODB?
使用include_once ("./comm/adodb/adodb.inc.php");這行就不用說了吧?包含ADODB的主文件。
四、如何使用ADODB?
1.進(jìn)行初始化:
ADODB采用$conn = ADONewConnection();這樣的語句進(jìn)行初始化,對(duì)ADODB進(jìn)行初始化有兩種方式:
第一種方式為:傳統(tǒng)方式。我暫時(shí)稱它為這個(gè)名稱。它使用的建立一個(gè)新連接的方式很像php中的標(biāo)準(zhǔn)連接方式:
$conn = new ADONewConnection($dbDriver);
$conn->Connect($host, $user, $passwd, $db);
簡單吧?如果使用過phplib中的db類應(yīng)該對(duì)它很熟悉的。
第二種方式:采用dsn方式,這樣是將數(shù)據(jù)庫的連接語句寫成一條語句來進(jìn)行初始化,dsn的寫法有為:$dsn =
"DBType://User:Passwd@Host/DBName"; 其中DBType表示數(shù)據(jù)庫類型,User表示用戶名,Passwd為密碼,Host為服務(wù)器名,DBName為數(shù)據(jù)庫名
,像這樣我使用oracle數(shù)據(jù)庫,用戶名:oracleUser,密碼為oraclePasswd,數(shù)據(jù)庫服務(wù)器為localhost, 數(shù)據(jù)庫為oradb的dsn這樣寫:
$dsn = "oracle://oracleUser:OraclePasswd@localhost/oradb";
$conn = new ADONewConnection($dsn);
這種方式可能從ASP轉(zhuǎn)行來的程序員會(huì)更感興趣。
這兩種方式都可以使用,要看個(gè)人習(xí)慣來選用了.
2. 相關(guān)的概念:
使用ADODB有兩個(gè)基本的類,一是是ADOConnection類,另一個(gè)是ADORecordSet類,使用過ASP的人看到這兩個(gè)類會(huì)明白它的含義,
ADOConnection指的是數(shù)據(jù)庫連接的類,而ADORecordSet指的是由ADOConnection執(zhí)行查詢語句返回的數(shù)據(jù)集類,相關(guān)的資料大家可以查詢ADODB
類的手冊。
3.基本的函數(shù):
關(guān)于ADOConnection類的相關(guān)方法有:
1.Connect:數(shù)據(jù)庫連接方法,上邊我們介紹過的。對(duì)于mysql還有PConnect,與PHP語言中的用法一樣
2.Execute($sql):執(zhí)行查詢語句結(jié)果返回一個(gè)ADORecordSet類。
3.GetOne($sql):返回第一行的第一個(gè)字段
4.GetAll($sql):返回所有的數(shù)據(jù)。這個(gè)函數(shù)可是大有用處,記得不記的我在以前的教程中寫關(guān)于新聞列表的輸入時(shí)要將需要在頁面顯示的
新聞列表做成一個(gè)二維數(shù)組?就是這樣的語句:
=====================================================================================
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"=>"這里新聞的第二條");
...
這樣的形式,但如果我們不需要對(duì)標(biāo)題進(jìn)行控制,在ADODB中我們就有福了,我們可以這樣寫:
==================================================================================
$strQuery = "select iNews, vcNewsTitle from tb_news_ch";
$array = &$conn->GetAll($strQuery);//注意這條語句
$smarty->assign("News_CH", $array);
unset($array);
==================================================================================
當(dāng)然,這里的$conn應(yīng)該進(jìn)行初始化過了,不知大家看明白了沒有?原來我要手工創(chuàng)建的二維數(shù)據(jù)在這里直接使用GetAll就行了?。。∵@也是為
什么有人會(huì)說ADODB+Smarty是無敵組合的原因之一了...
4.SelectLimit($sql, $numrows=-1, $offset=-1, $inputarrr=false): 返回一個(gè)數(shù)據(jù)集,大家從語句上也不難看出它是一條限量查詢語
句,與mysql語句中的limit 有異曲同工之效,來一個(gè)簡單的例子:
$rs = $conn->SelectLimit("select iNewsID, vcNewsTitle from tb_news_CH", 5, 1);
看明白了嗎?$rs中保存的是數(shù)據(jù)庫中從第一記錄開始的5條記錄。我們知道,在oracle數(shù)據(jù)庫不支持在SQL語句中使用limit,但是我們?nèi)绻?
用ADODB的話,那這個(gè)問題就容易解決多了!
5.Close():關(guān)閉數(shù)據(jù)庫,雖然說PHP在頁面結(jié)束時(shí)會(huì)自動(dòng)關(guān)閉,但為了程序的完整大家還是要在頁面結(jié)束進(jìn)行數(shù)據(jù)庫的關(guān)閉。
關(guān)于ADORecordSet.ADORecordSet為$conn->Execute($sql)返回的結(jié)果,它的基本函數(shù)如下:
1. Fields($colname):返回字段的值.
2. RecordCount():所包含的記錄數(shù).這個(gè)記錄確定數(shù)據(jù)集的記錄總數(shù).
3. GetMenu($name, [$default_str=''], [$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])非常好的一
個(gè)函數(shù),使用它可以返回一個(gè)name=$name的下拉菜單(或多選框)!!!當(dāng)然,它是一個(gè)HTML的字符串,這是一個(gè)令人激動(dòng)的好東西,$name指的是
option的name屬性,$default_str是默認(rèn)選中的字串,$blank1stItem指出第一項(xiàng)是否為空,$multiple_select指出是否為多選框,而我們得到這個(gè)
字串后就可以使用$smarty->("TemplateVar", "GetMenuStr")來在模板的"TemplateVar" 處輸入一個(gè)下拉列表(或是多先框)
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):一樣的,看函數(shù)名大家就可以知道它是什么意思了.
6. FetchRow():返回一行,看代碼:
=========================================================
$rs = &$conn->Exceute($sql);
if($rs)
{
while($row = $rs->FetchRow())
{
$array[] = array("NewsID" => $row["iNewsID"],
"NewsTitle" => csubstr($row["vcNewsTitle"]), 0, 20);
}
}
前兩個(gè)月因?yàn)楣ぷ魃系脑蛞恢焙苊?所以沒有及時(shí)完成這個(gè)教程,正好今天周六不用加班,抽個(gè)空完成它吧! 在開始新的的教程的時(shí)候,我
先把以前的我寫的那個(gè)教程中的一些錯(cuò)誤的地方修改過來,在這里要感謝 nesta2001zhang兄弟,是他找出了文章中的一些錯(cuò)誤,否則真的被別人
罵"誤人子弟了 (說來真是慚愧,我的初稿發(fā)布后后就發(fā)現(xiàn)在一大堆的問題,后來一些時(shí)候發(fā)重新修改后的文件中居然也出現(xiàn)了錯(cuò)誤,真是不應(yīng)
該...)
在上幾篇教程中的:
=========================================================
while($db->next_record() && $i > 0)
{
$array[] = array("NewsID", csubstr($db->f("iNewsID"), 0, 20),
"NewsTitle", csubstr($db->f("vcNewsTitle"), 0, 20));
$i--;
}
=========================================================
應(yīng)該更改為:
=========================================================
while($db->next_record() && $i > 0)
{
$array[] = array("NewsID" => $db->f("iNewsID"),
"NewsTitle" => csubstr($db->f("vcNewsTitle"), 0, 20));
$i--;
}
=========================================================
為什么這樣改呢?因?yàn)榈诙N方法更清晰明了一些,實(shí)際上第一種方式所執(zhí)行的效果與第二種方法沒什么差別,而且那幾個(gè)程序我都曾經(jīng)調(diào)試過,
沒有任何問題.
好了,那我們今天就先來說說ADODB.說到ADODB,可能做過ASP的都知道WINDOWS平臺(tái)的ADO組件,但我們這里的ADODB不是微軟的那個(gè)數(shù)據(jù)庫操
作組件,而是由php語言寫的一套數(shù)據(jù)庫操作類庫,先讓我們來看看它倒底有什么樣的優(yōu)點(diǎn).
1. 以標(biāo)準(zhǔn)的SQL語句書寫的數(shù)據(jù)庫執(zhí)行代碼在進(jìn)行數(shù)據(jù)庫移植時(shí)不用更改源程序,也就是說它可以支持多種數(shù)據(jù)庫,包括ACCESS.
2. 提供與微軟ADODB相似的語法功能.這一點(diǎn)對(duì)于從ASP轉(zhuǎn)行到PHP的人們是一大福音,它的很多操作都與WINDOWS中的ADODB相似.
3. 可以生成Smarty循環(huán)需要的二維數(shù)組,這樣會(huì)簡化smarty開發(fā).這一點(diǎn)是等會(huì)我給大家演示.
4. 支持?jǐn)?shù)據(jù)庫的緩存查詢,最大可能的提高查詢數(shù)據(jù)庫的速度。
5. 其它的實(shí)用功能.
雖然說優(yōu)點(diǎn)很多,但是由于這個(gè)類庫非常的龐大,光它的主執(zhí)行類就107K,所以如果大家考慮執(zhí)行效率的話就要認(rèn)真想想了.不過說實(shí)話,它的
功能還是很強(qiáng)大的,有很多的很實(shí)用的功能,使用它的這些功能,可以非常方便的實(shí)現(xiàn)我們想要的功能.所以對(duì)于那些老板沒有特殊要求時(shí)大家不
防用用它
一、如何得到ADODB? 它的運(yùn)行環(huán)境是什么?
從http://sourceforge.net/project/show...簆hp4.0.5以上。
二、如何安裝ADODB?
解壓下載回的壓縮文件,注意:大家下載回來的格式為ADODB.tar.gz,這是linux的壓縮格式,在windows下大家可以使用winrar對(duì)其進(jìn)
行解壓,解壓完成后將目錄拷貝到指定的目錄的adodb目錄下,像我在例子中將它拷貝到了/comm/adodb/中。
三、如何調(diào)用ADODB?
使用include_once ("./comm/adodb/adodb.inc.php");這行就不用說了吧?包含ADODB的主文件。
四、如何使用ADODB?
1.進(jìn)行初始化:
ADODB采用$conn = ADONewConnection();這樣的語句進(jìn)行初始化,對(duì)ADODB進(jìn)行初始化有兩種方式:
第一種方式為:傳統(tǒng)方式。我暫時(shí)稱它為這個(gè)名稱。它使用的建立一個(gè)新連接的方式很像php中的標(biāo)準(zhǔn)連接方式:
$conn = new ADONewConnection($dbDriver);
$conn->Connect($host, $user, $passwd, $db);
簡單吧?如果使用過phplib中的db類應(yīng)該對(duì)它很熟悉的。
第二種方式:采用dsn方式,這樣是將數(shù)據(jù)庫的連接語句寫成一條語句來進(jìn)行初始化,dsn的寫法有為:$dsn =
"DBType://User:Passwd@Host/DBName"; 其中DBType表示數(shù)據(jù)庫類型,User表示用戶名,Passwd為密碼,Host為服務(wù)器名,DBName為數(shù)據(jù)庫名
,像這樣我使用oracle數(shù)據(jù)庫,用戶名:oracleUser,密碼為oraclePasswd,數(shù)據(jù)庫服務(wù)器為localhost, 數(shù)據(jù)庫為oradb的dsn這樣寫:
$dsn = "oracle://oracleUser:OraclePasswd@localhost/oradb";
$conn = new ADONewConnection($dsn);
這種方式可能從ASP轉(zhuǎn)行來的程序員會(huì)更感興趣。
這兩種方式都可以使用,要看個(gè)人習(xí)慣來選用了.
2. 相關(guān)的概念:
使用ADODB有兩個(gè)基本的類,一是是ADOConnection類,另一個(gè)是ADORecordSet類,使用過ASP的人看到這兩個(gè)類會(huì)明白它的含義,
ADOConnection指的是數(shù)據(jù)庫連接的類,而ADORecordSet指的是由ADOConnection執(zhí)行查詢語句返回的數(shù)據(jù)集類,相關(guān)的資料大家可以查詢ADODB
類的手冊。
3.基本的函數(shù):
關(guān)于ADOConnection類的相關(guān)方法有:
1.Connect:數(shù)據(jù)庫連接方法,上邊我們介紹過的。對(duì)于mysql還有PConnect,與PHP語言中的用法一樣
2.Execute($sql):執(zhí)行查詢語句結(jié)果返回一個(gè)ADORecordSet類。
3.GetOne($sql):返回第一行的第一個(gè)字段
4.GetAll($sql):返回所有的數(shù)據(jù)。這個(gè)函數(shù)可是大有用處,記得不記的我在以前的教程中寫關(guān)于新聞列表的輸入時(shí)要將需要在頁面顯示的
新聞列表做成一個(gè)二維數(shù)組?就是這樣的語句:
=====================================================================================
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"=>"這里新聞的第二條");
...
這樣的形式,但如果我們不需要對(duì)標(biāo)題進(jìn)行控制,在ADODB中我們就有福了,我們可以這樣寫:
==================================================================================
$strQuery = "select iNews, vcNewsTitle from tb_news_ch";
$array = &$conn->GetAll($strQuery);//注意這條語句
$smarty->assign("News_CH", $array);
unset($array);
==================================================================================
當(dāng)然,這里的$conn應(yīng)該進(jìn)行初始化過了,不知大家看明白了沒有?原來我要手工創(chuàng)建的二維數(shù)據(jù)在這里直接使用GetAll就行了?。。∵@也是為
什么有人會(huì)說ADODB+Smarty是無敵組合的原因之一了...
4.SelectLimit($sql, $numrows=-1, $offset=-1, $inputarrr=false): 返回一個(gè)數(shù)據(jù)集,大家從語句上也不難看出它是一條限量查詢語
句,與mysql語句中的limit 有異曲同工之效,來一個(gè)簡單的例子:
$rs = $conn->SelectLimit("select iNewsID, vcNewsTitle from tb_news_CH", 5, 1);
看明白了嗎?$rs中保存的是數(shù)據(jù)庫中從第一記錄開始的5條記錄。我們知道,在oracle數(shù)據(jù)庫不支持在SQL語句中使用limit,但是我們?nèi)绻?
用ADODB的話,那這個(gè)問題就容易解決多了!
5.Close():關(guān)閉數(shù)據(jù)庫,雖然說PHP在頁面結(jié)束時(shí)會(huì)自動(dòng)關(guān)閉,但為了程序的完整大家還是要在頁面結(jié)束進(jìn)行數(shù)據(jù)庫的關(guān)閉。
關(guān)于ADORecordSet.ADORecordSet為$conn->Execute($sql)返回的結(jié)果,它的基本函數(shù)如下:
1. Fields($colname):返回字段的值.
2. RecordCount():所包含的記錄數(shù).這個(gè)記錄確定數(shù)據(jù)集的記錄總數(shù).
3. GetMenu($name, [$default_str=''], [$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])非常好的一
個(gè)函數(shù),使用它可以返回一個(gè)name=$name的下拉菜單(或多選框)!!!當(dāng)然,它是一個(gè)HTML的字符串,這是一個(gè)令人激動(dòng)的好東西,$name指的是
option的name屬性,$default_str是默認(rèn)選中的字串,$blank1stItem指出第一項(xiàng)是否為空,$multiple_select指出是否為多選框,而我們得到這個(gè)
字串后就可以使用$smarty->("TemplateVar", "GetMenuStr")來在模板的"TemplateVar" 處輸入一個(gè)下拉列表(或是多先框)
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):一樣的,看函數(shù)名大家就可以知道它是什么意思了.
6. FetchRow():返回一行,看代碼:
=========================================================
$rs = &$conn->Exceute($sql);
if($rs)
{
while($row = $rs->FetchRow())
{
$array[] = array("NewsID" => $row["iNewsID"],
"NewsTitle" => csubstr($row["vcNewsTitle"]), 0, 20);
}
}
相關(guān)文章
ThinkPHP 模板substr的截取字符串函數(shù)詳解
這篇文章主要介紹了ThinkPHP 模板substr的截取字符串函數(shù)詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01php+html優(yōu)化頁面顯示速度的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了php結(jié)合html優(yōu)化頁面顯示速度的一些常見方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12linux php mysql數(shù)據(jù)庫備份實(shí)現(xiàn)代碼
想在PHP后臺(tái)管理直接能夠備份數(shù)據(jù)庫,于是想呀想,一直沒有什么思路,一開始是考慮用php來訪問服務(wù)器安裝mysql的目錄,比如 /usr/local/mysql/data目錄,直接把下面對(duì)應(yīng)的文件進(jìn)行備份2009-03-03php自定義函數(shù)br2nl實(shí)現(xiàn)將html中br換行符轉(zhuǎn)換為文本輸入中換行符的方法【與函數(shù)nl2br功能相反】
這篇文章主要介紹了php自定義函數(shù)br2nl實(shí)現(xiàn)將html中br換行符轉(zhuǎn)換為文本輸入中換行符的方法,具有與函數(shù)nl2br相反的功能,并附帶了相應(yīng)的JS實(shí)現(xiàn)方法,需要的朋友可以參考下2017-02-02