|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不懂的问题有很多高手帮你解决。但不要认为你是新手,就不能帮助别人,比如今天你学会了怎样安装PHP,明天还可能有朋友会问这个问题,你就可以给他解答,不要认为这是浪费时间,忙别人其实就是帮助自己。 Smarty实例教授教养 实例篇(3、利用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,所以假如人人思索履行效力的话就要仔细想一想了.不外说假话,它的
功效仍是很壮大的,有良多的很适用的功效,利用它的这些功效,可以十分便利的完成咱们想要的功效.所以关于那些老板没有特别请求时人人不
防用用它
1、若何失掉ADODB? 它的运转情况是甚么?
从http://sourceforge.net/project/show...php4.0.5以上。
2、若何装置ADODB?
解压下载回的紧缩文件,注重:人人下载回来的格局为ADODB.tar.gz,这是linux的紧缩格局,在windows下人人可使用winrar对其进
行解压,解压完成后将目次拷贝到指定的目次的adodb目次下,像我在例子中将它拷贝到了/comm/adodb/中。
3、若何挪用ADODB?
利用include_once ("./comm/adodb/adodb.inc.php");这行就不必说了吧?包括ADODB的主文件。
4、若何利用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
======================================================
<?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的全体作风,所以
注重这里的巨细写成绩.
好了,这个Smarty的系列教程到这里就根基已完成了,我的这几篇低级教程就算是抛砖引玉吧,但愿更多的高手将更多的经历写出来,人人
配合进步!由于公司不答应开QQ,假如人人有想要与我停止交换的话,请人人加我的MSN:teacherli@ceua.org,接待人人一同会商!
==================
学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。 |
|