分享
 
 
 

用PHP5进行三层开发

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

用PHP5进行三层开发

原文:http://www.onlamp.com/pub/a/php/2004/12/09/three_tier.html

Three-Tier Development with PHP 5

by Luis Yordano Cruz

12/09/2004

此文演示了PHP三层开发的强大功能,PEAR::DB_DataObject用于业务逻辑,Smarty用于显示逻辑,这里假设你熟

悉了HTML,Smarty,PEAR::DB_DataObject,Mysql和PHP5.如果你需要补充知识,下面的文章解释了一些原理:

用PHP DataObject简化业务逻辑

Smarty简介:一个PHP模板引擎

PHP可伸缩性:Myth

你应该已安装和配置好了Apache,MySQL,和PHP5(或者IIS,MySQL5和PHP)

PEAR::DB_DataObject

PEAR::DB_DataObject 是一个用户数据库访问的抽象API.它是一个基于PEAR::DB的SQL构建器和数据建模层.它

把数据库表映射到PHP类并且提供像SELECT,INSERT,UPDATE,和DELETE这样的公共SQL函数.这使即使不了

解SQL的开发者也可以写出好的数据库访问代码,并且鼓励演示逻辑和业务逻辑有一个清晰的分离.

(DB_OO已经移动到的PEAR,现在是DB_DataObject,如果你有老的代码要更新,查看关于从老的db_oo代码更新到

DB_DataObjects的注释).

相关阅读

Upgrading to PHP 5

By Adam Trachtenberg

Table of Contents

Index

Sample Chapter

Read Online--Safari Search this book on Safari:

Only This Book All of Safari

Code Fragments only

DataObject performs two tasks. First, it builds SQL statements based on the object's variables and the builder

methods. Second, it acts as a datastore for a table row. There's a core class, which you extend for each of

your tables so that you put the data logic inside the data classes. There's also an included Generator to make

your configuration files and your base classes.

DataObject 执行两个任务.第一,它构建基于对象变量的SQL语句和构建器方法.第二,它作为数据库表的数据存

储.这里有个核心类,对于每个表继承它,以使你把数据逻辑放入数据类中.这里还包括一个生成器,

DataObject 极大的简化了数据库访问代码,它使开发大型的,数据驱动的站点更加容易.

At present, Alan Knowles, the lead developer of PEAR::DB_DataObject, is working on a new project called DBDO,

a C implementation of the PEAR package DB_DataObjects, based on libgda. His goal is to create the next

generation of PEAR::DB_DataObjects.

SMARTY

Smarty是一个从web页演示中分离内容的PHP模板引擎.它使用GPL许可.

Large projects commonly separate the role of the graphic designer from that of the programmer. However,

programming in PHP has the tendency to combine those two roles in a person and inside the code. This can bring

difficulties when it comes time to change some part of the page's design. If the page mixes content and

presentation, the developer has to crawl through the program to find the presentation. Smarty helps to solve

this problem.

Combining the Two

The first thing to do when starting this project is to create a workspace in which to store the project's code.

Then it's time to configure PEAR::DB_DataObject to connect to the MySQL database MySQL (name: example),

map the database tables to PHP classes, and then configure Smarty for the presentation tier for the user. Here

are those steps in more detail:

创建工作环境

创建一个叫做dataobjects的目录.

从命令行安装PEAR::DB_DataObject,键入:

>pear install Date

>pear install DB_DataObject

>pear list

INSTALLED PACKAGES:

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

PACKAGE VERSION STATE

Archive_Tar 1.2 stable

Console_Getopt 1.2 stable

DB 1.6.5 stable

DB_DataObject 1.7.1 stable *(Goal)

Date 1.4.3 stable

Mail 1.1.3 stable

Net_SMTP 1.2.6 stable

Net_Socket 1.0.2 stable

PEAR 1.3.1 stable

PHPUnit 1.0.1 stable

XML_Parser 1.2.0 stable

XML_RPC 1.1.0 stable

安装和配置Smarty

从下载开始,(我使用2.6.5版的Smarty)解压到你自己的目录.从它的libs目录中把Smarty.class.php,

Smarty_Compiler.class.php, Config_File.class.php, and debug.tpl文件复制到dataobjects目录中.

还要复制core和plugins目录和其中所有的内容.创建几个新的目录,命名为templates, templates_c, configs,

和cache.

最后dataobjects目录包含:

|---- cache

|---- configs

|---- core

|---- plugins

|---- templates

|---- templates_c

11/10/2004 11:17 a.m. <DIR> .

11/10/2004 11:17 a.m. <DIR> ..

11/10/2004 11:17 a.m. <DIR> cache

11/10/2004 11:17 a.m. <DIR> configs

11/10/2004 11:17 a.m. <DIR> core

11/10/2004 11:17 a.m. <DIR> plugins

11/10/2004 11:17 a.m. <DIR> templates

11/10/2004 11:17 a.m. <DIR> templates_c

07/09/2004 09:48 a.m. 13,105 Config_File.class.php

16/04/2004 03:03 a.m. 5,117 debug.tpl

10/09/2004 02:15 p.m. 65,350 Smarty.class.php

10/09/2004 07:14 p.m. 90,924 Smarty_Compiler.class.php

4 archivos 174,496 bytes

8 dirs 6,699,454,464 bytes libres

创建数据库

创建一个名为example的数据库,它包含一个名为User的表,不必担心模式,稍后我们会创建.

配置PEAR::DB_DataObject

要构建数据对象,创建下面的文件

configDB.php

<?php

require_once 'DB/DataObject.php';

$config = parse_ini_file('example.ini',TRUE);

foreach($config as $class=>$values) {

$options = &PEAR::getStaticProperty($class,'options');

$options = $values;

}

?>

此脚本基于example配置文件中的值创建一个到数据库的连接,显示如下.

example.ini

[DB_DataObject]

database = mysql://root:@localhost/example

schema_location = /dataobjects/schema/

class_location = /dataobjects/

require_prefix = /dataobjects/

class_prefix = DataObjects_

extends_location = DB/DataObject.php

extends = DB_DataObject

自动构建数据库模式

包含两个过程,构建数据库的对象-关系映射,和从example数据库user表中自动创建一个类.在表中的所有字段

名将成为类成员变量.

创建适当的模式:

C:\PHP\PEAR\DB\DataObject>C:\PHP\php.exe createTables.php C:\dataobjects\example.ini

这将生成User.php文件:

<?php

/**

* Table Definition for user

*/

require_once 'DB/DataObject.php';

class DataObjects_User extends DB_DataObject

{

###START_AUTOCODE

/* the code below is auto generated do not remove the above tag */

var $__table = 'user'; // table name

var $user_Id; // int(11) not_null primary_key auto_increment

var $first_Name; // string(30) not_null

var $last_Name; // string(40) not_null

var $email; // string(100) not_null

/* Static get */

function staticGet($k,$v=NULL) {

return DB_DataObject::staticGet('DataObjects_User',$k,$v);

}

/* the code above is auto generated do not remove the tag below */

###END_AUTOCODE

}

?>

它还会为user表模式生成example.ini配置文件:

[user]

user_Id = 129

first_Name = 130

last_Name = 130

email = 130

[user__keys]

user_Id = N

Smarty files

It's time to create several files for Smarty:

Smarty文件

现在是创建几个Smarty文件的时候了:

include.php

1 <?

2 require('Smarty.class.php');

3 $smarty = new Smarty;

4 $smarty->template_dir = 'templates/';

5 $smarty->compile_dir = 'templates_c/';

6 $smarty->config_dir = 'configs/';

7 $smarty->cache_dir = 'cache/';

?>

此脚本实例化了一个新Smarty对象.设置Smarty属性.

index.php

1 <?

2 require("include.php");

3 $smarty->assign('TITLE','ACCESS MySQL DATABASE IN THREE TIERS WITH PHP');

4 $smarty->assign('HEADER','WHAT WISH DO ?');

5 $smarty->display('index.tpl');

?>

给Smarty模板分配变量.

insert.php

1 <?

2 require("include.php");

3 $smarty->assign('TITLE','INSERT DATA');

4 $smarty->assign('HEADER','Insert Data');

5 $smarty->assign('data1','First Name');

6 $smarty->assign('data2','Last Name');

7 $smarty->assign('data3','email');

8 $smarty->display('insert.tpl');

?>

添加将在insert.tpl 使用的变量.调用模板insert.tpl .

save.php

1 <?

2 require_once('DB/DataObject.php');

3 require('configDB.php');

4 $user = DB_DataObject::factory('user');

5 $user->first_Name = $x;

6 $user->last_Name = $y;

7 $user->email = $z;

8 $user_Id = $user->insert();

9 $user->update();

10 echo "<script>location.href='index.php'</script>";

11 ?>

This script saves data by using a PEAR::DataObject for the user table. Line 2 loads the class DataObject, and

line 3 calls configdb.php to connect to the database. Line 4 creates an instance of a user object (see User.php).

Lines 5 through 7 pass the variables collected from the form in insert.tpl ($x, $y, and $z) in order to save the

data in the database. The primary key of the table is an autoincrement column, so it doesn't need a value there.

Line 8 inserts the object, and line 9 carries out an update.

view.php

1 <?

2 require_once('DB/DataObject.php');

3 require('configDB.php');

4 require("include.php");

5 $user = DB_DataObject::factory('user');

6 $user->find();

7 while ($user->fetch()) {

8 $smarty->append('users', array(

'ID' => $user->user_Id,

'FIRSTNAME' => $user->first_Name,

'LASTNAME' => $user->last_Name,

'EMAIL' => $user->email,

));

}

9 $smarty->assign('TITLE','List Users');

10 $smarty->assign('HEADER','List User');

11 $smarty->assign('data0','User_Id');

12 $smarty->assign('data1','First Name');

13 $smarty->assign('data2','Last Name');

14 $smarty->assign('data3','email');

15 $smarty->display('view.tpl');

16 ?>

此脚本显示所有存储在user表中的数据.它加载PEAR::DataObject 和include.php文件(给smarty模板分配变量).

第5行创建一个user对象的工厂.第6行执行find()方法.SELECT * FROM user从数据库中检索出了数据,通

过fetch()方法为模板保存数据,一次返回一条记录.

9 到14行是分配其他的变量给Smarty.

这些文件都应当放在dataobjects目录中.

对于模板,这里有index.tpl,list.tpl,和save.tpl.这里是他们的代码:

index.tpl

1 <html>

2 <head>

3 <title>{$TITLE}</title>

4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

5 </head>

6 <table align="center">

7 <tr>

8 <td>

9 <b>{$HEADER}</b>

10 </td>

11 </tr>

12 </table>

13 <table width="250" border="1" align="center" >

14 <tr>

16 <td align="center">

17 <input type="button" name="insert" value="Insert"

onclick="javascript:location.href='insert.php';">

18 </td>

19 </tr>

20 <tr>

21 <td align="center">

22 <input type="button" name="view" value="View"

onclick="javascript:location.href='view.php';">

23 </td>

24 </tr>

25 </table>

26 </body>

27 </html>

站点主页,它在的3行和第9行分别显示$TITLE 和$HEADER,这些变量值是从index.php传递过来的.

这个脚本在web浏览器上生成两个按钮,Insert和View,他们有相应的行为.如果用户点击Insert,系统将调

用Insert.php.如果用户点击View,那么view.php将被调用

insert.tpl

1 <html>

2 <head>

3 <title>{$TITLE}</title>

4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

5 </head>

6 <body>

7 <form name="form1" action="save.php" method="post">

8 <table width="300" border="1" align="center" >

9 <tr>

10 <td align="center">

11 <b>{$HEADER}</b>

12 </td>

13 </tr>

14 <tr>

15 <td>

16 {$data1}

17 <input type="text" name="x">

18 </td>

19 </tr>

20 <tr>

21 <td>

22 {$data2}

23 <input type="text" name="y">

24 </td>

25 </tr>

26 <tr>

27 <td>

28 {$data3}

29 <input type="text" name="z">

30 </td>

31 </tr>

32 <tr>

33 <td align="center">

34 <input type="submit" name="Submit" value="Add">

35 <input type="button" name="Reset" value="Return/Cancel"

onclick="javascript:location.href='index.php';">

36 </td>

37 </tr>

38 </table>

39 </form>

40 </body>

41 </html>

这个模板有一个表单和两个按钮,Add 和Return/Cancel.

用户输入数据,first name,last name 和电子邮件字段.insert.php期望在名为x,y,z的变量中接收这些信息,用户点

击Add按钮将运行save.php.如果用户点击Return/Cancel,将会执行index.php.

view.tpl

1 <html>

2 <head>

3 <title>{$TITLE}</title>

4 </head>

5 <body>

6 <table align="center">

7 <tr>

8 <td align="center">

9 <b>{$HEADER}</b>

10 </td>

11 </tr>

12 </table>

13 <table width="500" border="1" align="center">

14 <tr>

16 <td align="center">

17 <b>{$data0}</b>

18 </td>

19 <td align="center">

20 <b>{$data1}</b>

21 </td>

22 <td align="center">

23 <b>{$data2}</b>

24 </td>

25 <td align="center">

26 <b>{$data3}</b>

27 </td>

28 </tr>

29 {section name=display loop=$users}

30 <tr>

31 <td>

32 {$users[display].ID}

33 </td>

34 <td>

35 {$users[display].FIRSTNAME}

36 </td>

37 <td>

38 {$users[display].LASTNAME}

39 </td>

40 <td>

41 {$users[display].EMAIL}

42 </td>

43 </tr>

44 {/section}

45 <br>

46 </table>

47 <br>

48 <table align="center">

49 <tr>

50 <td align="center">

51 <input name="vol" type="button" value="Return"

onclick="javascript:location.href='index.php';">

52 </td>

53 </tr>

54 </table>

55 </body>

56 </html>

这个模板显示所有存储在example数据库中的所有数据.

最后,Return按钮把用户带回到主页.

所有的这些(*.tpl)文件必须放在templates目录下.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有