成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

用PHP5進行三層開發

瀏覽:65日期:2024-01-31 17:58:48

原文:http://www.onlamp.com/pub/a/php/2004/12/09/three_tier.htmlThree-Tier Development with PHP 5by Luis Yordano Cruz12/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_DataObjectPEAR::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 5By Adam Trachtenberg

Table of ContentsIndexSample Chapter

Read Online--Safari Search this book on Safari: Only This Book All of SafariCode 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 TwoThe 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;STATEArchive_Tar;;;;1.2;;;stableConsole_Getopt;1.2;;;stable DB;;;;;1.6.5;stableDB_DataObject;;1.7.1;stable; *(Goal)Date;;;1.4.3;stableMail;;;1.1.3;stableNet_SMTP; 1.2.6;stableNet_Socket;;;;;1.0.2;stablePEAR;;;1.3.1;stablePHPUnit1.0.1;stableXML_Parser;;;;;1.2.0;stableXML_RPC1.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> cache11/10/2004; 11:17 a.m.;<DIR> configs11/10/2004; 11:17 a.m.;<DIR> core11/10/2004; 11:17 a.m.;<DIR> plugins11/10/2004; 11:17 a.m.;<DIR> templates11/10/2004; 11:17 a.m.;<DIR> templates_c07/09/2004; 09:48 a.m.; 13,105 Config_File.class.php16/04/2004; 03:03 a.m.; 5,117 debug.tpl10/09/2004; 02:15 p.m.; 65,350 Smarty.class.php10/09/2004; 07:14 p.m.; 90,924 Smarty_Compiler.class.php 4 archivos;;;;;174,496 bytes 8 dirs6,699,454,464 bytes libres

創建數據庫創建一個名為example的數據庫,它包含一個名為User的表,不必擔心模式,稍后我們會創建.

配置PEAR::DB_DataObject要構建數據對象,創建下面的文件

configDB.php<?phprequire_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/exampleschema_location; = /dataobjects/schema/class_location= /dataobjects/require_prefix= /dataobjects/class_prefix;;= DataObjects_extends_location = DB/DataObject.phpextends; = DB_DataObject

自動構建數據庫模式

包含兩個過程,構建數據庫的對象-關系映射,和從example數據庫user表中自動創建一個類.在表中的所有字段

名將成為類成員變量.

創建適當的模式:

C:PHPPEARDBDataObject>C:PHPphp.exe createTables.php C:dataobjectsexample.ini

這將生成User.php文件:

<?php/*** Table Definition for user* www.mypchelp.cn*/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;= 129first_Name = 130last_Name; = 130email;;;= 130

[user__keys]user_Id = N

Smarty filesIt's time to create several files for Smarty:

Smarty文件現在是創建幾個Smarty文件的時候了:

include.php1 <?2require('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.php1 <? 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.php1; <? 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.php1<?2require_once('DB/DataObject.php');3require('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='http://www.piao2010.com/bcjs/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.php1; <? 2require_once('DB/DataObject.php');3require('configDB.php');4require('include.php');5$user = DB_DataObject::factory('user');6$user->find();7while ($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.tpl1; <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 border='1' >14<tr> 16;;<td align='center'>17;;;;<input type='button' name='insert' value='Insert'; onclick='javascript:location.href='http://www.piao2010.com/bcjs/insert.php';'>18;</td>19</tr>20<tr> 21;;<td align='center'>22;;;<input type='button' name='view' value='View' onclick='javascript:location.href='http://www.piao2010.com/bcjs/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.tpl1 <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 border='1' >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='http://www.piao2010.com/bcjs/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.tpl1 <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 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='http://www.piao2010.com/bcjs/index.php';'>52;;;;</td>53;;</tr>54</table>55; </body>56 </html>

這個模板顯示所有存儲在example數據庫中的所有數據.

最后,Return按鈕把用戶帶回到主頁.

所有的這些(*.tpl)文件必須放在templates目錄下.

標簽: PHP
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产美女诱惑一区二区| 日本韩国欧美一区| 噜噜噜在线观看免费视频日韩| 日本一区二区三区久久久久久久久不| 毛片一区二区三区| 欧美综合国产| 亚洲综合无码一区二区| 精品9999| 中文字幕中文字幕中文字幕亚洲无线| 99久久精品国产观看| 精品电影一区二区| 成人av第一页| 久久婷婷综合激情| 色综合色综合色综合| 国产日韩亚洲欧美综合| 91丝袜美腿高跟国产极品老师 | 欧美午夜精品理论片a级按摩| 亚洲精品伦理在线| 夜夜爽99久久国产综合精品女不卡| **网站欧美大片在线观看| 伊人久久亚洲热| 国产精品免费视频一区| 亚洲私人影院| 成人欧美一区二区三区| 伊人久久亚洲美女图片| 亚洲欧美另类久久久精品2019| 亚洲成人资源| 一区二区三区欧美日| 亚洲国产婷婷| 亚洲欧洲美洲综合色网| 亚洲精品黄色| 亚洲一区自拍偷拍| 国产精品日本| 婷婷综合久久一区二区三区| 玖玖国产精品视频| 麻豆精品国产传媒mv男同| 欧美日韩国产精选| 国产99久久久精品| 久久久99久久| 99pao成人国产永久免费视频| 亚洲资源在线观看| 国产伦精品一区二区三区视频青涩| 91精品综合久久久久久| eeuss鲁片一区二区三区 | 亚洲精品在线二区| 亚洲第一主播视频| 色av成人天堂桃色av| 国产精品自产自拍| 久久精品亚洲国产奇米99| 激情六月综合| 天天综合天天综合色| 欧美日韩视频专区在线播放| 国产精品77777| 国产欧美综合在线| 一本一本a久久| 日韩激情av在线| 91.麻豆视频| 欧美一区1区三区3区公司| 中文字幕制服丝袜成人av| 在线日韩av| 天天综合天天综合色| 在线综合视频播放| 国产精品二区三区四区| 亚洲香蕉伊在人在线观| 精品视频在线看| 91尤物视频在线观看| 成人午夜电影久久影院| 亚洲视频一二区| 在线观看91视频| 99re热视频这里只精品| 亚洲永久免费av| 欧美精品在线观看播放| 欧美激情第六页| 偷拍与自拍一区| 欧美一激情一区二区三区| 狠狠色综合一区二区| 日韩黄色免费网站| 欧美刺激脚交jootjob| 伊人久久成人| 精品亚洲国产成人av制服丝袜| 久久在线观看免费| 国产一级一区二区| 国产一区二区三区四区五区美女| 国产日韩欧美精品电影三级在线| 亚洲欧美日韩精品一区二区| 黑人精品欧美一区二区蜜桃| 国产日韩高清在线| 久久久久欧美| 波多野结衣在线一区| 亚洲精品中文在线| 91精品国产aⅴ一区二区| 激情综合久久| 国产一区二区三区四| 亚洲精品视频一区| 日韩视频一区二区| 国产精品久久国产三级国电话系列| 国产露脸91国语对白| 亚洲免费视频中文字幕| 91精品国产综合久久精品| 亚洲国产精品第一区二区| 国产精品888| 一区二区三区精品在线| 精品国产伦理网| 久久黄色影院| 99久久伊人精品| 男人的天堂久久精品| 国产欧美久久久精品影院| 欧美亚日韩国产aⅴ精品中极品| 欧美日韩国产综合在线| 国模少妇一区二区三区| 亚洲另类在线一区| 精品国产凹凸成av人导航| 国产女优一区| 97久久久精品综合88久久| 美女一区二区三区在线观看| 亚洲婷婷综合久久一本伊一区| 91麻豆精品91久久久久久清纯| 亚洲一卡久久| 国产精品jizz在线观看美国 | 国产一区视频导航| 一区二区三区精品视频| 久久久久99精品一区| 欧美日韩一区二区电影| aa日韩免费精品视频一| 成人小视频在线观看| 五月开心婷婷久久| 亚洲欧洲av在线| 精品久久久久99| 欧美午夜精品一区二区蜜桃| 国产精品日韩| 一区二区在线不卡| 成人app软件下载大全免费| 午夜精品视频| 国产91精品在线观看| 日韩影视精彩在线| 亚洲桃色在线一区| 亚洲精品一区二区在线观看| 欧美日韩一级片网站| 欧美一级专区| 99国产精品久久久久久久| 色综合中文字幕| 成人三级伦理片| 韩国av一区二区三区在线观看| 亚洲成av人片www| 亚洲男人的天堂在线观看| 亚洲激情亚洲| 国产精品v欧美精品v日韩 | 丁香六月综合激情| 蜜臀av性久久久久蜜臀aⅴ| 玉足女爽爽91| 亚洲视频在线一区| 国产精品美日韩| 久久久国产一区二区三区四区小说| 欧美二区三区91| 影音先锋中文字幕一区二区| 99在线视频精品| 欧美一区二区三区免费观看视频| 日韩国产在线观看| 午夜在线精品偷拍| 久久久久久久久久看片| 欧美日韩综合在线免费观看| 亚洲美女色禁图| 蜜桃久久av| 国产精品综合一区二区三区| 亚洲小说欧美另类婷婷| 精品国产亚洲在线| 在线观看国产日韩| 久久婷婷av| 国产乱码精品一区二区三区不卡| 亚洲视频1区| 国产欧美一级| 国产日韩欧美一区二区三区在线观看| 色综合欧美在线| 欧美不卡三区| 欧美国产先锋| av在线不卡免费看| 成人免费视频网站在线观看| 成人午夜激情影院| 成人激情免费电影网址| 成人午夜av在线| 99re成人精品视频| 欧美一区二区三区久久精品| 色综合天天综合给合国产| 99久久国产综合色|国产精品| jlzzjlzz亚洲女人18| 成人av在线播放网站| 99精品久久久久久| 欧美激情aⅴ一区二区三区| 欧美天堂亚洲电影院在线观看 | 国产亚洲欧美一区在线观看| 久久美女艺术照精彩视频福利播放| 精品福利一二区| 国产欧美一区二区三区网站 | 欧美成人国产| 你懂的国产精品永久在线| 色综合中文综合网| 综合久久综合久久| 亚洲自拍另类综合| 午夜精品视频一区| 日韩国产精品久久|