ホームページ > php教程 > php手册 > Smarty サンプル チュートリアル --- ADODB を使用したデータベースへの接続 (1)

Smarty サンプル チュートリアル --- ADODB を使用したデータベースへの接続 (1)

WBOY
リリース: 2016-06-21 09:08:51
オリジナル
1096 人が閲覧しました

ado|连接数据库

我们今天就先来说说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 のみが呼び出されます。まず、ディレクトリ構造を見てみましょう。ルートディレクトリ)
|
|----+comm (Smarty 関連ドキュメントディレクトリ)
| |----+smarty (Smarty のオリジナルファイルディレクトリ)
| |----+adodb (adodb のオリジナルテキスト)ディレクトリ)
| |- ----mySmarty.class.php (拡張 Smarty ファイル)
| |-----csubstr.inc (漢字のインターセプト)
|
|----+cache (Smarty キャッシュ ディレクトリ) 、*nix の下で、読み取りおよび書き込み権限が保証されます)
|
|----+templates (サイト テンプレート ファイルの保存ディレクトリ)
| |
| (ページ ヘッダー テンプレート ファイル) ---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 (本書)

前 2 つのチュートリアルと比較して、comm ディレクトリが再編成され、その他のファイル構造が変更されています。前の 2 つのチュートリアルと比較して、サイト全体の変更は、comm ディレクトリと

index.php と news.php だけです。同時に、ニュース リストが追加されます。

それぞれのニュース リストを表示するには、index.php を実行した後のページに「国内ニュース」と「海外ニュース」が表示されます。まず、index.php を見てみましょう:

====== ==================== =============================

Index.php

================ ============================ ========

/**********************************************
*
* ファイル名: Index.php
* 機能: サンプルプログラムを表示
*
* 作者: 先輩
* メール: Teacherli@163.com
*
******************** ************************ */
include_once("./comm/mySmarty.class.php"); file://smarty の拡張クラス ファイルが含まれます
include_once( "./comm/adodb/adodb.inc.php"); file:// ADODB のメイン実行可能ファイルが含まれます
include_once("./comm/csubstr.inc"); file://中国語のインターセプト クラスが含まれます

("NEWS_NUM", 5); file://ニュースリストの表示数を定義します

$ Smarty = new MySmarty(); file://smarty インスタンス オブジェクトを作成します $smarty

1. "); file://ADODBを初期化します

2. $conn->Connect("localhost" , "root", "", "News"); file://データベースに接続します


file://ここでは国内ニュース部分を処理します

3. $strQuery = "SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_CH ORDER BY iNewsID DESC";

4. $rs = &$conn->Execute($strQuery);
5 . $smarty->assign("News_CH", $rs->GetArray(NEWS_NUM));
6 . unset($rs);


file://ここで国際ニュース部分を処理します

$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->GetArray (NEWS_NUM));
unset($rs);

file://ここでエンターテイメント ニュース部分を処理します
$ strQuery = "SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_MU

ORDER BY iNewsID DESC";
$ rs = &$conn->Execute($strQuery);

$smarty->assign("News_MU", $ rs->GetArray(NEWS_NUM));

unset($rs); 7. $conn->close();

file://./templates テンプレートの下にあるindex.tpl をコンパイルして表示します
$smarty->display("index.tpl");

?>



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート