`

教程之四:---实例篇(使用phplib的DB类)

阅读更多

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

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

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

该...)
在上几篇教程中的:

代码:

<?php

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

$i--;
}
=========================================================

?>


应该更改为:
代码:

<?php

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

$i--;
}
=========================================================

?>


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

<?php

=========================================================
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://adodb.sourceforge.net , 是一个PHP语言写成的数据库抽象层, 适合php4, php5

二、如何安装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://Userasswd@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):返回所有的数据。这个函数可是大有用处,记得不记的我在以前的教程中写关于新闻列表的输入时要将需要在页面显示的

新闻列表做成一个二维数组?就是这样的语句:
=====================================================================================
代码:

<?php

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中我们就有福了,我们可以这样写:
==================================================================================
代码:

<?php

$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():来看一段代码:
=========================================================
代码:

<?php

$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():返回一行,看代码:
=========================================================
代码:

<?php

$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,先来看看目录结构:
代码:

<?php

+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
======================================================
代码:


<?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. $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
=============================================================
代码:


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

简单吧,确实很简单:)

下面再来看看新闻列表:
================================================================
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");
?>



================================================================
分别来说明一下:

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

记住:它返回的是一个二维数组而不是一个RecordSet,所在你可以程序中直接在3处使用.
2. 这里是为了给新闻标题做链接时要GET参数type=XX而做的

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

注意这里的大小写问题.
分享到:
评论

相关推荐

    phplib-7.4.tar.gz_phplib

    "phplib-7.4.tar.gz_phplib"可能指的是该类库的一个特定版本,即7.4版,它被打包成一个gzip压缩的tar文件。 1. **Tar与Gzip**: Tar是一个用于打包多个文件和目录到一个单一档案文件的工具,方便存储和传输。Gzip则...

    PHPLIB简明教程.rar

    由于笔者使用phplib做开发的时间并不很长,而且程序本身很多高级的算法并没采用phplib,因此phplib的很多核心高级功能也没有完全使用。水平有限,所以如果出现任何的错误疏漏,请各位不吝赐教。 《PHPLIB简明...

    面试PHPXXX

    - 对于中文或其他非ASCII字符,需要使用多字节字符集处理,如 `mbstring` 扩展。示例代码展示了使用GB2312编码的中文字符串翻转方法。 6. **MySQL优化**: - 使用索引可以显著提高查询速度。 - 优化查询语句以...

    php经典面试题

    - 这里 `$foo` 是一个 Java 对象实例。 #### 题目五:版本控制系统 1. **CVS 与 SVN**: - CVS(Concurrent Versions System):早期的版本控制系统,基于客户端/服务器架构。 - SVN(Subversion):改进版的...

    php面试技巧.docx

    - OOP(面向对象编程),包括类、对象、继承、封装和多态 - PHP性能优化和内存管理 - 安全性问题,如SQL注入和XSS攻击 - PHP函数和常量的熟悉程度 - PHP与其他技术(如JavaScript、Ajax、CSS、HTML)的集成 - 设计...

    PHPLIB 中文教程.zip

    这个"PHPLIB 中文教程.zip"文件包含了一系列帮助文档和指南,旨在帮助中文用户更好地理解和使用PHPLIB。 首先,"phplib.chm"是一个Windows帮助文件,通常包含了对PHPLIB库的详细文档,包括其架构、类库、函数和方法...

    PHPLIB 中文教程

    PHPLIB 中文教程 PHPLIB 中文教程

    phplib教程

    2. **数据库抽象层**:DB类提供了一个统一的接口来访问多种数据库系统,如MySQL、PostgreSQL、Oracle等,降低了数据库迁移的难度。 3. **模板引擎**:phplib内置了模板引擎,允许开发者将视图与逻辑分离,提高代码...

    php经典面试题及答案

    使用`date()`函数结合时间戳,可以很容易地获取前一天的日期和时间。例如: ```php echo date("Y-m-d H:i:s", time() - (3600 * 24)); // 使用当前时间戳减去24小时 echo date("Y-m-d H:i:s", strtotime("-1 day...

    phplib用法的几个小实例

    通常,开发者会创建一个 DB 类的实例,设置连接参数,然后使用 SQL 查询语句来获取数据。 2. **表单处理**: Phplib 包含了处理 HTML 表单的工具,比如 `Form` 类。这个类可以帮助验证用户输入,防止 SQL 注入等...

    PHP经典面试题集

    - **PHPLib** - **FastTemplate** - **Savant** - **MiniTemplator** - **TagTemplate** 这些模板引擎提供了强大的功能,如缓存机制、插件扩展等,可以帮助开发者更高效地组织代码。 #### 4. 如何实现PHP与JSP交互...

    phplib

    在解压后的文件中,"CodePub.Com说明.txt"很可能是包含关于这个库的使用说明、安装指南或更新日志的文本文件,而"phplib-7.4a"可能是库的源代码目录,包含了所有相关的PHP类和函数。 学习和使用phplib,开发者可以...

    phplib-7[1].4a.tar.gz

    "phplib-7.4a.tar.gz"是一个包含Phplib 7.4a版本源代码的压缩文件,通过tar和gzip格式进行打包。 **1. Phplib简介** Phplib是PHP的一个早期框架,它提供了一套面向对象的编程工具,帮助开发者构建结构化和可维护的...

    phplib-7.2c.rar_phplib

    在“phplib-7.2c”中,我们可以期待找到以下关键组件: 1. **数据库抽象层**:PHPLOB提供了一个统一的接口,可以连接和操作多种数据库系统,如MySQL、PostgreSQL、Oracle等。这使得开发者无需关心底层数据库的具体...

    phplib简明教程(中文)

    想学习PHPlib但是又英文水平不好的朋友不妨看看本书

    phper杂志 !!!!!!!!!!!!!!!!!!

    PHPlib(19.1%)、TemplateLite(10.5%)和XTemplate(3.5%)等也有一定比例的使用。 - **开发框架**:Zend Framework是最常用的框架,占比41.7%;其次是自定义框架(36.6%),FleaPHP/QeePHP框架(27.2%),...

    phplib-7.2

    其中phplib就是这些库中相当优秀的产品,它特别在数据库访问、数据库驱动以及访问认证和模板等方面具有很高的价值和实用性。用来开发大中型程序是相当适合的。 利用phplib可以非常轻易的开发出跨硬件、操作系统平台...

    PHPLIB

    在本文中,我们将深入探讨PHPLIB的核心特性、应用场景以及如何利用它来提升你的Web开发效率。...如果你还没有尝试过PHPLIB,建议你下载最新的phplib-7.2c版本,开始探索这个强大的工具带给你的开发新体验。

    PHP面试题及答案,另附学习心得

    - **PHPLib**: 较早出现的模板引擎之一。 - **FastTemplate**: 轻量级模板引擎。 - **Savant**: 提供高级特性。 这些模板引擎的主要作用是将HTML与PHP逻辑分开,便于维护和重用。 #### 四、PHP与JSP的交互 **题目...

    C#版phplib模板类Template

    在用MVC方法开发一个网站时,希望使用PHPLIB的模板类来处理所有的模板,想在网上找一份C#的template源代码,未果,最后找到一了份vbscript版本的源码,在此基础上翻写成C#版,经试用,效果和性能还算可以,适合中小型网站的...

Global site tag (gtag.js) - Google Analytics