热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用PHP5进行三层开发

原文:www.onlamp.compubaphp20041209three_tier.htmlThree-TierDevelopmentwithPHP5byLuisYordanoCruz12092004此文演示了PHP三层开发的强大功能,PEAR::DB_DataObject用于业务逻辑,Smarty用
原文: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. 

.
11/10/2004 11:17 a.m.  ..
11/10/2004 11:17 a.m.  cache
11/10/2004 11:17 a.m.  configs
11/10/2004 11:17 a.m.  core
11/10/2004 11:17 a.m.  plugins
11/10/2004 11:17 a.m.  templates
11/10/2004 11:17 a.m.  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
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文件:

/**
* Table Definition for user
* www.cncms.com
*/
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 "";
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
2 
3 
4  
5 
6 

 
7 
8  
11 
12

9    {$HEADER}
10 
 
13
14 
16  
19 
20 
21  
24 
25

17          >
18 

22        >
23 

26
27


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


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

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

insert.tpl
1
2
3 
4  
5
6
7  
8   


9   
10    
13   
14   
15    
19   
20   
21    
25   
26   
27    
31   
32   
33    
37   
38  

11      {$HEADER}
12    

16      {$data1}
17     
18    

22      {$data2}
23     
24    

28      {$data3}
29     
30    

34     
35               >
36    

39 
40
41


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


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

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

view.tpl
1
2
3 
4
5
6 


7  
8    
11  
12  

9     {$HEADER}
10   

13 
14 
16   
19   
22   
25  
28  
29 {section name=display loop=$users}
30  
31   
34   
37   
40   
43  
44   {/section}
45  

46 

17     {$data0}
18   

20     {$data1}
21   

23     {$data2}
24   

26     {$data3}
27   

32     {$users[display].ID}
33   

35     {$users[display].FIRSTNAME}
36   

38     {$users[display].LASTNAME}
39   

41     {$users[display].EMAIL}
42   

47 

48 
49  
50   
53  
54 

51             >
52   

55
56

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


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

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


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 这个问题发生在重新安装系统后,丢失了之前的privatekey等。所以解决方法就是提示的revokeandrequest。到developercenter中找到certificat ... [详细]
author-avatar
手机用户2502860131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有