快捷搜索:

Smarty实例教学,原来也不过如此

2019-11-19 17:36栏目:关于澳门金莎
TAG:

Smarty实例教学 实例篇(三、使用ADODB连接数据库)

 虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。 

include_once("./comm/Smarty.class.php"); //包含smarty类文件 
$smarty = new Smarty(); //建立smarty实例对象$smarty 
$smarty->templates("./templates"); //设置模板目录 
$smarty->templates_c("./templates_c"); //设置编译目录 
//****大家注意,这里我是我新加入的****// 
$smarty->cache("./cache"); //设置缓存目录 
$smarty->cache_lifetime = 60 * 60 * 24; //设置缓存时间 
$smarty->caching = true; //设置缓存方式 
//---------------------------------------------------- 
//左右边界符,默认为{},但实际应用当中容易与JavaScript 
//相冲突,所以建议设成<{}>或其它。 
//---------------------------------------------------- 
$smarty->left_delimiter = "<{"; 
$smarty->right_delimiter = "}>"; 
$smarty->assign("name", "李晓军"); //进行模板变量替换 
//编译并显示位于./templates下的index.tpl模板 
$smarty->display("index.tpl"); 
?>
我们可以看到,smarty的程序部分实际就是符合php语言规范的一组代码,我们依次来解释一下:
1。/**/语句:
包含的部分为程序篇头注释。主要的内容应该为对程序的作用,版权与作者及编写时间做一个简单的介绍,这在smarty中不是必 
需的,但从程序的风格来讲,这是一个好的风格。 
2。include_once语句:
它将安装到网站的smarty文件包含到当前文件中,注意包含的路径一定要写正确。 
3。$smarty = new Smarty():
这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。 
4。$smarty->templates(""):
这一句指明$smarty对象使用tpl模板时的路径,它是一个目录,在没有这一句时,Smarty默认的模板路径为当前目录的templates 
目录,实际在写程序时,我们要将这一句写明,这也是一种好的程序风格。
5。$smarty->templates_c(""):
这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言,而这个目录,就是它编译 
模板的目录,这里要注意,如果站点位于*nix服务器上,请确保teamplates_c里定义的这个目录具有可写可读权限,默认情况下它的编译目录 
是当前目录下的templates_c,出于同样的理由我们将其明确的写出来。 
6。$smarty->left_delimiter与$smarty->right_delimiter:
指明在查找模板变量时的左右分割符。默认情况下为"{"与"}",但在实际中因为我们要在模板中使用<script>,Script中的函数定 
义难免会使用{},虽然它有自己的解决办法,但习惯上我们将它重新定义为"<{"与"}>"或是"<!--{"与"}-->"或其它标志符,注意,如果在这里 
定义了左右分割符后,在模板文件中相应的要使每一个变量使用与定义相同的符号,例如在这里指定为"<{"与"}>",tpl模板中也要相应的将 
{$name}变成<{$name}>,这样程序才可以正确的找到模板变量。 
7。$smarty->cache("./cache"):
告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存,这里就是设置缓存的目录。默认情 
况下为当前目录下的cache目录,与templates_c目录相当,在*nix系统中我们要确保它的可读可写性。 
8. $smarty->cache_lifetime = 60 * 60 * 24: 
这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的 
取值为-1时表示建立起的缓存从不过期,为0时表示在程序每次执行时缓存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。 
9. $smarty->caching = 1:
这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值,0:Smarty默认值,表示不对模板进行缓存;1:表示 
Smarty将使用当前定义的cache_lifetime来决定是否结束cache;2:表示Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使 
用true与false来表示是否进行缓存。 
10. $smarty->assign("name", "李晓军"):
该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量,var指出要将模板变量替换的变量名;其 
第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法,assign是Smarty的核心函数之一,所有对模板变 
量的替换都要使用它。 
11. $smarty->display("index.tpl"):
该函数原形为display(string varname),作用为显示一个模板。简单的讲,它将分析处理过的模板显示出来,这里的模板文件不 
用加路径,只要使用一个文件名就可以了,它路径我们已经在$smarty->templates(string path)中定义过了。 
程序执行完后我们可以打开当前目录下的templates_c与cache目录,就会发现在下边多出一些%%的目录,这些目录就是Smarty的编译与 
缓存目录,它由程序自动生成,不要直接对这些生成的文件进行修改。
以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下,在后边的例子中你可以看到将它们将被多次的使用。 
接下来介绍一个section循环块与foreach循环块,本来它应该属于模板部分,但是由于它们是smarty的精华所在,而且与smarty程序设计 
部分联系非常紧密,所以就在本节单独拿出来讲一下。 
1. foreach:用于循环简单数组,它是一个选择性的section循环,它的定义格式为: 
{foreach from=$array item=array_id}
{foreachelse}
{/foreach}
其中,from 指出要循环的数组变量,item为要循环的变量名称,循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当 

前两个月因为工作上的原因一直很忙,所以没有及时完成这个教程,正好今天周六不用加班,抽个空完成它吧! 在开始新的的教程的时候,我

目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自由软件社群发展之后贡献出来的)。 

程序中传递过来的数组为空时的处理,下面是一个简单的例子:

先把以前的我写的那个教程中的一些错误的地方修改过来,在这里要感谢 nesta2001zhang兄弟,是他找出了文章中的一些错误,否则真的被别人

使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续使用,转移数据库平台时,程序代码也不必做太大的更动。 

example6.tpl

<html>
<head><title>这是一个foreach使用的例子</title></head>
<body>
这里将输出一个数组:<br>
{foreach from=$newsArray item=newsID}
新闻编号:{$newsID}<br>
新闻内容:{$newsTitle}<br><hr>
{foreachelse}
对不起,数据库中没有新闻输出!
{/foreach}
</body>

骂"误人子弟了"(说来真是惭愧,我的初稿发布后后就发现在一大堆的问题,后来一些时候发重新修改后的文件中居然也出现了错误,真是不应

其实 ADODB 这样的发展理念,并不是首创的,DBI 比 ADODB 出现得更早,它提供 Perl 存取数据库时,使用一致的 API 呼叫接口。相信用过 Perl + DBI 的朋友,再来用 ADODB 时,会有一种似曾相识的感觉。 

</html> 

该...)

另外,ADODB 对用过 ASP 的人而言,应该不陌生,这类朋友对 ADODB 应该很容易接受。 

example6.php

<?php 
/********************************************* 

* 文件名: example6.php 
* 作 用: 显示实例程序2 

* 作 者: 大师兄 
* Email: teacherli@163.com 

*********************************************/ 
include_once("./comm/Smarty.class.php"); 
$smarty = new Smarty(); 
$smarty->templates("./templates");    //一般不要,要了出错.自己实验得出
$smarty->templates_c("./templates_c");   //一般不要,要了出错.自己实验得
$smarty->cache("./cache");  //一般不要,要了出错.自己实验得
$smarty->cache_lifetime = 0;  //一般不要,要了出错.自己实验得
$smarty->caching = true;  //一般不要,要了出错.自己实验得
$smarty->left_delimiter = "<{"; 
$smarty->right_delimiter = "}>"; 
$array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻"); 
$array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻"); 
$array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻"); 
$array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻"); 
$array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻"); 
$array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻"); 
$smarty->assign("newsArray", $array); 
//编译并显示位于./templates下的index.tpl模板 
$smarty->display("example6.tpl"); 
?>

在上几篇教程中的:

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

$i--;

我们来看一下,ADODB 的简单用法: 

}

<?php 

应该更改为:

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

$i--;

// 引入 adodb 的 inc 档,才能呼叫 adodb 提供的函式 

}

为什么这样改呢?因为第二种方法更清晰明了一些,实际上第一种方式所执行的效果与第二种方法没什么差别,而且那几个程序我都曾经调试过,

没有任何问题.
好了,那我们今天就先来说说ADODB.说到ADODB,可能做过ASP的都知道WINDOWS平台的ADO组件,但我们这里的ADODB不是微软的那个数据库操

作组件,而是由php语言写的一套数据库操作类库,先让我们来看看它倒底有什么样的优点.
1. 以标准的SQL语句书写的数据库执行代码在进行数据库移植时不用更改源程序,也就是说它可以支持多种数据库,包括ACCESS.
2. 提供与微软ADODB相似的语法功能.这一点对于从ASP转行到PHP的人们是一大福音,它的很多操作都与WINDOWS中的ADODB相似.
3. 可以生成Smarty循环需要的二维数组,这样会简化smarty开发.这一点是等会我给大家演示.

  1. 支持数据库的缓存查询,最大可能的提高查询数据库的速度。
  2. 其它的实用功能.
    虽然说优点很多,但是由于这个类库非常的庞大,光它的主执行类就107K,所以如果大家考虑执行效率的话就要认真想想了.不过说实话,它的

功能还是很强大的,有很多的很实用的功能,使用它的这些功能,可以非常方便的实现我们想要的功能.所以对于那些老板没有特殊要求时大家不

防用用它

一、如何得到ADODB? 它的运行环境是什么?

二、如何安装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类应该对它很熟悉的。

include('adodb/adodb.inc.php'); 

第二种方式:采用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转行来的程序员会更感兴趣。

这两种方式都可以使用,要看个人习惯来选用了.

  1. 相关的概念:
    使用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"=>"这里新闻的第二条");
...

// 以下 $conn 即此一物件(object) 

这样的形式,但如果我们不需要对标题进行控制,在ADODB中我们就有福了,我们可以这样写:

$strQuery = "select iNews, vcNewsTitle from tb_news_ch";
$array = &$conn->GetAll($strQuery);//注意这条语句
$smarty->assign("News_CH", $array);

$conn = &ADONewConnection('mysql'); 

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" 处输入一个下拉列表(或是多先框)

// 要不要显示侦错讯息,false 不要,true 要。 

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

// $conn->debug = false; 

}

明白了吗?很像MS ADODB中的那一套嘛!

  1. MoveFirst(),MoveLast(), Move($to):一样的,看函数名大家就可以知道它是什么意思了.
  2. 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要用到.

  1. 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:

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

$conn->debug = true; 

index.php

<?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"); //连接数据库

//这里将处理国内新闻部分

  1. $strQuery = "SELECT iNewsID AS NewsID, vcNewsTitle AS NewsTitle FROM tb_news_CH ORDER BY iNewsID DESC";
  2. $rs = &$conn->Execute($strQuery);
  3. $smarty->assign("News_CH", $rs->GetArray(NEWS_NUM));
  4. 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);

  1. $conn->close();

//编译并显示位于./templates下的index.tpl模板
$smarty->display("index.tpl");

// 连接数据库 

?>

同样,我在关键的地方加了数标,下面来说明一下它们的含义:

  1. 建立一个连接对象$conn,大家在这里要注意的是它的初始不是以$conn = new ADONewConnection($dbType)这样的形式出现的,也就是说

,ADONewConnection不是一个class,你不能使用new 对它进行初始化.看看它的源码你就会明白,这只不过是一个函数.

  1. 这个就不用说了吧?打开一个News的数据库,主机为:localhost, 用户名为root, 密码为""

3. 一个查询语句,注意,这里要将查询的字段使用AS关键字来重新标识,名称为你在模板中设置的模板变量的名称.

  1. 使用Execute来执行这个查询,结果返回一个RecordSet数据集

  2. 这里有个方法:$rs->GetArray($num) 这个在上边介绍过,它是要从$rs这个数据集中返回$num行,结果为一个可被Smarty所识别的二维数

据.这样ADODB就自动为我们构建起了这样的结构,而在我们以前的例子中,都是使用一个循环构建这样的数组的.

  1. 这一句我看也不用说了吧?

  2. 关闭内存中的相关资源.

大家可以看看,整个程序中再没有出现什么while语句,程序整体结构显的非常清楚,这就是为什么ADODB+Smarty是黄金组合的原因.不过话也

说回来了,简单有简单的问题,不知大家想过没有,这里对显示的新闻标题的长度没有控制,也就是说,如果某条新闻标题的长度超出一行显示的范

围,它就是自动折行到下一行,那么整个的版面就会变乱,所说大家自已适自己的情况来决定是否这样使用吧当然,你也可以使用像上一节中介

绍的那样,使用一个循环语句重构这个二维数组,使它符合你的用途,怎么做大家自己去想吧,参考PHPLIB中的做法,上节我介绍过了...

再来看看新闻页吧

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

// 用法:$conn->Connect('主机', '使用者', '密码', '数据库'); 

news.php

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

简单吧,确实很简单

$conn->Connect('localhost', 'piza', 'ooo123', 'test'); 

下面再来看看新闻列表:

// 若欲采用持续性连接,上式可换用 PConnect: 

newsList.php

<?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");

// $conn->PConnect('localhost', 'piza', 'ooo123', 'test'); 

?>

分别来说明一下:

1. GetAll($strQuery):这个函数可是个好东东,它的作用是将$strQuery查询到的所有数据组合成为一个能够被Smarty所识别的二维数组,

记住:它返回的是一个二维数组而不是一个RecordSet,所在你可以程序中直接在3处使用.

  1. 这里是为了给新闻标题做链接时要GET参数type=XX而做的

后记:
大家在使用ADODB时有几个地方要注意:

  1. 初始化: 初始化的方式不是使用new,因为它不是一个对象
  2. 方 法: 基本上每个方法都是以大写字母开头大小写混合的名称,这一点好像与*NIX的习惯有些不同,也不同于PHP的整体风格,所以

注意这里的大小写问题.

好了,这个Smarty的系列教程到这里就基本已经完成了,我的这几篇初级教程就算是抛砖引玉吧,希望更多的高手将更多的经验写出来,大家

共同提高!因为公司不允许开QQ,如果大家有想要与我进行交流的话,请大家加我的MSN:teacherli@ceua.org,欢迎大家一起讨论!

(出处:Viphot)

// 设定 sql 命令 

$sql = "insert into t values ('abcde', 18)"; 

// 执行 sql 命令 

$rs = $conn->Execute($sql); 

// 检查执行结果,若 $rs == false,则呼叫 $conn 对象的成员函式 ErrorMsg() 

if (!$rs) print $conn->ErrorMsg(); else print "OK!"; 

?> 

结果如下: 

--------------------------------------------- 

(mysql): insert into t values ("abcde",18) 

--------------------------------------------- 

OK! 

若把侦错关掉,即 $conn->debug=false,则结果如下: 

OK! 

以下,逐步为各位介绍:使用 ADODB 的重点方法。 

2. 安装 
ADODB 的首页在: 版,可至 ADODB 下载或至台南县教网中心 FTP 下载。 

安装 ADODB 的方法超极简单,只要下载、解压、放入适当位置,即可完成 ! 如下所示: 

1. 下载: 

$ ncftp ftp.tnc.edu.tw 

cd sysop/ADODB 

get adodb242.tgz 

2. 解压: 

假设我把 adodb242.tgz 放入 /var/www/html 中 

$ cp adodb242.tgz /var/www/html 

$ tar xvzf adodb242.tgz 

如下所示: 

adodb/adodb-cryptsession.php 

adodb/adodb-csvlib.inc.php 

adodb/adodb-errorhandler.inc.php 

adodb/adodb-errorpear.inc.php 

adodb/adodb-lib.inc.php 

adodb/adodb-pager.inc.php 

....以下省略.... 

现在,您在 /var/www/html/adodb 已安装好 ADODB 了。 

3. 引入 ADODB 
一旦安装好 ADODB,使用前,应把 ADODB 相关的含入文件引入您的程序中。adodb 目录放在任何位置无所谓,只要能指向正确路径文件名即可。一般而言,您的程序代码只须引入 adodb.inc.php。 

作法如下: 

在您的 PHP 程序中: 

include('路径/adodb/adodb.inc.php'); 

或 

include_once('路径/adodb/adodb.inc.php'); 

例: 

若您的程序和 adodb 在同一目录下: 

.. 

adodb/ 

something.php* 

则: 

include('adodb/adodb.inc.php'); 

即可。 

若位置是在某一个目录 somedir 中: 

.. 

adodb 

somedir/something.php 

则必须使用: 

include('../adodb/adodb.inc.php'); 

除了 adodb.inc.php 这个含入档,ADODB 还提供许多 adodb-*.inc.php 的含入档,这些多半是为驱动某些数据库的特殊用法而设的。 

若是引入 adodb-session.php 则可让您将 session 存入数据库中来维护运用。 

若是引入 adodb-pager.inc.php,可方便您做分页显示。 

若是引入 adodb-errorhandler.inc.php,可让您自订错误处理讯息。 

若是含入 adodb-pear.inc.php,可让您使用 PHP4 的 PEAR DB 语法来使用 ADODB。此时,尚可使用 DSN 连接数据库的字符串设定。如 $dsn="mysql://piza:ooo123@localhost/test"; 

若是引入 tohtml.inc.php,可帮您在程序代码中,方便将取出的记录,转成 HTML 的表格(table)来显示。 

若是引入 toexport.inc.php,可让您方便地输出 CSV 档或以 tab 分隔字段的数据文件。 

若是引入 rsfilter.inc.php,可让您在使用记录之前,预做过滤处理。 

若是引入 pivottable.inc.php,可让您使用 pivot table 功能(俗称 cross-tabulations)。 

注意 ! adodb.inc.php 是一定要引入的,其它,则视您要使用那一个功能,再引入该含入档即可。 

4. 选用数据库种类,建立联机对象 
由于 ADODB 使用对象导向的作法,因此您在引入档之后,接着请视您后端数据库的种类,建立一个联机对象。作法如下: 

以 MySQL 数据库为例: 

$conn = &ADONewConnection('mysql'); 

注:NewADOConnection 和 ADONewConnection 是一样的,二者皆可使用。 

上例中的 'mysql' 是指数据库的 drvier 的种类,ADODB 会据此呼叫对应的数据库 driver。 

其它常用的 driver 有:access、ado、ado_access、ado_mssql、db2、vfp、ibase、borland_ibase、informix、imformix72、mssql、oci8、odbc、postgres、postgres64、postgres7、sqlanywhere、sybase....等等。 

我们称建立的对象 $conn 为一 ADOConnection 对象,它代表与数据库的连接事务,皆透过这个对象来处理。ADOConnection 对象会提供许多处理的方法,以对象导向的说法,这些方法称为成员函式,这是外界存取此一对象的接口。 

一旦联机对象建立之后,就有许多对象函式可供您使唤啦 ! 请看下一节的介绍。 

5. 侦错模式 
程序开发的过程,为了方便查出出现问题可能的地方,通常我们会打开侦错模式,俟程序功能确实稳定之后,再将它关闭。ADODB 提供侦错模式,存取数据库时,能显示其运作方式。 

打开侦错模式,使用法: 

$conn->debug=true 

关闭侦错模式,使用法: 

$conn->debug=false 

6. 连接数据库 
接着,使用 $conn 联机对象的 Connect 或 PConnect 函式来连接特定的数据库,此时必须提供 DSN (Data Source Names)相关数据,DSN 可能包括:主机名称、数据库使用者、数据库密码、数据库名称。不同的数据库种类,DSN 可能可以省略其中若干项。以 MySQL 而言,则上述四者都要提供。 

该函式会传回 true 或 false,用以表示是否连接成功。 

用例: 

// 格式:$conn->Connect('主机', '使用者', '密码', '数据库'); 

$conn->Connect('localhost', 'piza', 'ooo123', 'test'); 

或者,采持续性连接: 

// 格式:$conn->PConnect('主机', '使用者', '密码', '数据库'); 

$conn->PConnect('localhost', 'piza', 'ooo123', 'test'); 

若欲探查是否有联机成功,可用一个变量来接取传回值: 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$cok = $conn->Connect($mch, $user, $pwd, $database); 

或者,采持续性连接: 

$cok = $conn->PConnect($mch, $user, $pwd, $database); 

if (!$cok) { echo "无法连接数据库 $database"; exit; } 

7. 设定 sql 命令语法、执行 sql 命令 
接下来,您就可以设计您要执行的 sql 命令语法,然后付诸执行。 

$sql = "这里放 SQL 的命令语法"; 

$rs = $conn->Execute($sql); 

其中,$rs 为回传的结果,若 $rs == false,则表示执行失败,您必须仔细检查一下。 

您不一定要把命令语法放在 $sql 变量中,也可以直接放入 Execute( ) 括号中。若命令较短无妨,若命令较长,我建议您还是用一个变量 $sql 来设定命令字符串吧 ! 

下一节开始,为各位介绍 SQL 的基本命令,如:Insert、Select、Update、Delete 等等的用法。 

8. 插入记录(Insert) 
Insert 的用法如下: 

// $name 为字符串,$year 为数字 

$name='abcde'; 

$year=18; 

// 插入一笔记录,命令的大小写无妨,但数据表 t 及变量则大小写有分别 ! 

$sql = "INSERT INTO t VALUES ('$name', $year)"; 

// $sql = "insert into t values ('$name', $year)"; 亦可。 

// 执行 

$rs = $conn->Execute($sql); 

// 检查执行结果,进行错误处理;若正常,则继续其它动作.... 

if (!$rs) print $conn->ErrorMsg(); 

....以下省略.... 

ErrorMsg() 是错误显示的函式,它会取出错误讯息,并显示出来。 

另外,ADODB 提供一种 记录集(RecordSet) 函式 GetInsertSQL(),可帮您产生 Insert 的语法。 

例子如下: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 侦错 

$conn->debug=true; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="root"; 

$pwd="jack168"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 产生一笔空记录 

$sql = "select * from t where year=-1"; 

$rs = $conn->Execute($sql); 

// 用一个空数组来装要更新的数据 

$r = array(); 

$r['name']='john'; 

$r['year']=28; 

// 用 GetInsertSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $insertSQL 中 

$insertSQL = $conn->GetInsertSQL($rs, $r); 

// 执行插入 

$conn->Execute($insertSQL); 

$conn->Close(); 

?> 

侦错讯息如下: 

----------------------------------------------------------- 

(mysql): select * from t where year=-1 

----------------------------------------------------------- 

(mysql): INSERT INTO t ( name, year ) VALUES ( 'john', 28 ) 

----------------------------------------------------------- 

9. 取出记录(Select) 
Select 的用法如下: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 不侦错 

$conn->debug=false; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 执行 Select 由表格 t 取出数据, 

// 它会传回一个 ADORecordSet 记录集对象 $rs (RecordSet) 

// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录(row 或称 record), 

// 该记录的所有字段数据的内容,存放在 fields 这个数组之中 

// ,以数字为索引,第一个由 0 开始 

$rs = &$conn->Execute('select * from t'); 

// 若 $rs 为 false,则秀出错误讯息 

if (!$rs) { 

print $conn->ErrorMsg(); 

} else { 

// 当尚未到达 记录集 $rs 的结束位置(EOF:End Of File)时,(即:还有记录尚未取出时) 

while (!$rs->EOF) { 

// 秀出所有字段,$FieldCount() 会传回字段总数 

for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { 

print $rs->fields[$i] . " "; 

// 移至下一笔记录 

$rs->MoveNext(); 

// 换列 

echo "<br>n"; 

$rs->Close(); // 可不用 

$conn->Close(); // 可不用 

?> 

$rs->fields[] 数组是由 PHP 的数据库扩展功能产生的,某些扩展功能并不支持使用字段名称当作索引。 

若欲使用名称当作索引,也就是俗称的 hash 或 associative arrays,则需使用全域变量 $ADODB_FETCH_MODE 加以指定。 

以下设定:使用数字索引 $ADODB_FETCH_MODE= ADODB_FETCH_NUM; 

以下设定:使用名称索引 $ADODB_FETCH_MODE= ADODB_FETCH_ASSOC; 

下面是使用名称索引的例子: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 不侦错 

$conn->debug=false; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="root"; 

$pwd="jack168"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 执行 sql 之前,指定使用名称索引 

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; 

// 执行 Select,它会传回一个 ADORecordSet 记录集对象 $rs 

// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录内容, 

// 该记录存放在 fields 这个数组之中 

$rs = &$conn->Execute('select * from t'); 

// 若 $rs 为 false,则秀出错误讯息 

if (!$rs) { 

print $conn->ErrorMsg(); 

} else { 

// 当尚未到达记录集结束位置(EOF)时, 

while (!$rs->EOF) { 

// 秀出所有字段 

print $rs->fields['name'] . " " . $rs->fields['year']; 

// 移至下一笔记录 

$rs->MoveNext(); 

// 换列 

echo "<br>n"; 

$rs->Close(); // 可不用 

$conn->Close(); // 可不用 

?> 

10. 取出记录(使用 FetchRow) 
这里示范 FetchRow 的用法: 

$sql = "select * from t"; 

$rs = $conn->Execute($sql); 

if ($rs) { 

while( $ar = $rs->FetchRow() ) { 

print $ar['name'] ." " . $ar['year']; 

print "<br>n"; 

FetchRow() 会将取出的记录传回,您可用一个 array 来接取。 

注意 ! 使用 FetchRow() 就不必再用 MoveNext(),FetchRow 内部会自动完成移至下一笔记录的动作。 

11. 更新记录(Update) 
您可以用传统的方式: 

$sql ="UPDATE t SET name='john', year=28 WHERE year=18"; 

$conn->Execute($sql); 

也可以用以下这种方式: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 侦错 

$conn->debug=true; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 选择要更新的那一笔记录 

$sql = "select * from t where year=18"; 

$rs = $conn->Execute($sql); 

// 用一个空数组来装要更新的数据 

$r = array(); 

$r['name']='john'; 

$r['year']=28; 

// 用 GetUpdateSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $updateSQL 中 

$updateSQL = $conn->GetUpdateSQL($rs, $r); 

// 执行更新 

$conn->Execute($updateSQL); 

$conn->Close(); 

?> 

侦错讯息如下: 

------------------------------------------------------------- 

(mysql): select * from t where year=18 

------------------------------------------------------------- 

(mysql): UPDATE t SET name = 'john', year = 28 WHERE year=18 

------------------------------------------------------------- 

12. 删除记录(Delete) 
删除记录很简单,采传统方式即可: $sql = "DELETE FROM t WHERE year=18"; 

$rs = $conn->Execute($sql); 

13. 使用字段对象(Field Objects) 
这里示范字段对象 FetchField 的用法,用以取得字段名称及字段型态: 

$sql = "select * from t"; 

$rs = &$conn->Execute($sql); 

if ($rs) { 

while (!$rs->EOF) { 

// 取出第二个字段 

$f = $rs->FetchField(1); 

// 印出字段名称 及 字段型态 

print $f->name . ":" . $f->type; 

$rs->MoveNext(); 

print "<br>n"; 

另外,ADODB 提供一个 RecordSet 函式 MetaType(),可将原始的字段型态转成一般型态代码: 

C : 字符 

X : text 

B : blob 

D : 日期 

T : timestamp 

L : 布尔值或位 

I : 整数 

N : 数字型态,包括:自动增加、数值、浮点数、实数及整数 

R : serial、自动增加 

用例: 

$f = $rs->FetchField(1); 

// 印出字段名称 及 字段型态的代码 

print $f->name . ":" . $rs->MetaType($f->type); 

14. 简单分页(Pager) 
ADODB 提供一种简单分页显示记录的方法,使用前,要将 adodb-pager.inc.php 引入。 

<?php 

include('adodb/adodb.inc.php'); 

// 引入分页功能 

include('adodb/adodb-pager.inc.php'); 

// 启动 session 

session_start(); 

$db = ADONewConnection('mysql'); 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$db->Connect($mch, $user, $pwd, $database); 

$sql = "select * from t"; 

// 产生 pager 对象 

$pager = new ADODB_Pager($db, $sql); 

// 每一页秀 5 笔记录 

$pager->Render($rows_per_page=5); 

?> 

结果如下: 

Figure 1. 简单分页功能 

每页显示记录的数目是由 Render() 来控制的,若没有传入指定的 row 数给 Render(),默认值每页秀 10 笔。 

另外,字段名称也可以改变,如下示范: 

<?php 

include('adodb/adodb.inc.php'); 

// 引入分页功能 

include('adodb/adodb-pager.inc.php'); 

// 启动 session 

session_start(); 

$db = ADONewConnection('mysql'); 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$db->Connect($mch, $user, $pwd, $database); 

$sql = "select name as '姓名', year as '年纪' from t"; 

// 产生 pager 对象 

$pager = new ADODB_Pager($db, $sql); 

// 每一页秀 5 笔记录 

$pager->Render($rows_per_page=5); 

?> 

结果如下: 

Figure 2. 改变字段名称 

15. 输出 CSV 档 
ADODB 提供输出 CSV 档的方法,使用前,要将 toexport.inc.php 引入。 

<?php 

include('adodb/adodb.inc.php'); 

// 引入输出 CSV 文件功能 

include('adodb/toexport.inc.php'); 

$db = ADONewConnection('mysql'); 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$db->Connect($mch, $user, $pwd, $database); 

$sql = "select name as '姓名', year as '年纪' from t"; 

$rs = $db->Execute($sql); 

// 秀出 CSV 格式 

print rs2csv($rs); 

?> 

结果如下: 

姓名,年纪 

abcde,45 

yyy,20 

ppp,34 

mmm,13 

hhh,41 

rrr,65 

kkk,29 

miso,154 

sss,89 

abc,18 

abcde,0 

uyt,58 

john,28 

也可用 tab 分隔字段,使用 rs2tab 方法如下: 

print rs2tab($rs, false); 

注: false 表示不显示字段名称 

结果如下: 

abcde 45 

yyy 20 

ppp 34 

mmm 13 

hhh 41 

rrr 65 

kkk 29 

miso 154 

sss 89 

abc 18 

abcde 0 

uyt 58 

john 28 

若是 print rs2tab($rs, true); 

结果如下: 

姓名 年纪 

abcde 45 

yyy 20 

ppp 34 

mmm 13 

hhh 41 

rrr 65 

kkk 29 

miso 154 

sss 89 

abc 18 

abcde 0 

uyt 58 

john 28 

也可以将结果由标准输出(STDOUT)显示,使用 rs2tabout 方法如下: 

print rs2tabout($rs); 

执行结果如下: 

Figure 1. 在console中显示结果 

也可以存成 CSV 档: 

// 档案路径 

$path = "/tmp/test.csv"; 

// 开档供写入 

$fhd = fopen($path, "w"); 

// 若开档成功 

if ($fhd) { 

// 则写入 CSV 

rs2csvfile($rs, $fhd); 

// 也可以使用 rs2tabfile($rs, $fhd); 

// 关档 

fclose($fhd); 

结果如下: 

[ols3@p web]$ cat /tmp/test.csv 

姓名,年纪 

abcde,45 

yyy,20 

ppp,34 

mmm,13 

hhh,41 

rrr,65 

kkk,29 

miso,154 

sss,89 

abc,18 

abcde,0 

uyt,58 

john,28 

16. 取出一定笔数的记录 (使用 SelectLimit) 
ADODB 提供一个 ADOConnect 函式 SelectLimit,可供您取出一定笔数的记录,用法如下: 

$conn->Connect($mch, $user, $pwd, $database); 

rs = $conn->SelectLimit("Select * from t", 3, 1); 

// 取出 3 笔、在第 1 笔之后 

// 秀出这 3 笔记录 

if ($rs) { 

while( $ar = $rs->FetchRow() ) { 

print $ar['name'] ." " . $ar['year']; 

print "<br>n"; 

上式是说:在第 1 笔记录之后,取出 3 笔,也就是第 2、3、4 笔记录。 

结果如下: 
-------------------------------------- 

(mysql): select * from t LIMIT 1,3 

-------------------------------------- 

注意 ! SelectLimit 的写法刚好和 MySQL 语法相反 !

您可能感兴趣的文章:

  • PHP ADODB实现事务处理功能示例
  • PHP ADODB实现分页功能简单示例
  • PHP程序中使用adodb连接不同数据库的代码实例
  • php中adodbzip类实例
  • PHP数据库万能引擎类adodb配置使用以及实例集锦
  • php adodb连接不同数据库
  • 常用的php ADODB使用方法集锦
  • 用ADODB来让PHP操作ACCESS数据库的方法
  • PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】

版权声明:本文由澳门金莎娱乐发布于关于澳门金莎,转载请注明出处:Smarty实例教学,原来也不过如此