快捷搜索:

Smarty实例教学实例篇

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

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

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

unset($rs);

//这里将处置惩罚娱乐新闻部分

$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();

//编译并显示位于./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

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

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 " . $dbName;

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

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

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,迎接大年夜家一路评论争论!

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

您可能还会对下面的文章感兴趣: