日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

用PHP5進(jìn)行三層開發(fā)

瀏覽:98日期: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三層開發(fā)的強(qiáng)大功能,PEAR::DB_DataObject用于業(yè)務(wù)邏輯,Smarty用于顯示邏輯,這里假設(shè)你熟

悉了HTML,Smarty,PEAR::DB_DataObject,Mysql和PHP5.如果你需要補(bǔ)充知識(shí),下面的文章解釋了一些原理:

用PHP DataObject簡化業(yè)務(wù)邏輯Smarty簡介:一個(gè)PHP模板引擎PHP可伸縮性:Myth

你應(yīng)該已安裝和配置好了Apache,MySQL,和PHP5(或者IIS,MySQL5和PHP)

PEAR::DB_DataObjectPEAR::DB_DataObject 是一個(gè)用戶數(shù)據(jù)庫訪問的抽象API.它是一個(gè)基于PEAR::DB的SQL構(gòu)建器和數(shù)據(jù)建模層.它

把數(shù)據(jù)庫表映射到PHP類并且提供像SELECT,INSERT,UPDATE,和DELETE這樣的公共SQL函數(shù).這使即使不了

解SQL的開發(fā)者也可以寫出好的數(shù)據(jù)庫訪問代碼,并且鼓勵(lì)演示邏輯和業(yè)務(wù)邏輯有一個(gè)清晰的分離.

(DB_OO已經(jīng)移動(dòng)到的PEAR,現(xiàn)在是DB_DataObject,如果你有老的代碼要更新,查看關(guān)于從老的db_oo代碼更新到

DB_DataObjects的注釋).

相關(guān)閱讀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 執(zhí)行兩個(gè)任務(wù).第一,它構(gòu)建基于對(duì)象變量的SQL語句和構(gòu)建器方法.第二,它作為數(shù)據(jù)庫表的數(shù)據(jù)存

儲(chǔ).這里有個(gè)核心類,對(duì)于每個(gè)表繼承它,以使你把數(shù)據(jù)邏輯放入數(shù)據(jù)類中.這里還包括一個(gè)生成器,

DataObject 極大的簡化了數(shù)據(jù)庫訪問代碼,它使開發(fā)大型的,數(shù)據(jù)驅(qū)動(dòng)的站點(diǎn)更加容易.

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是一個(gè)從web頁演示中分離內(nèi)容的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:

創(chuàng)建工作環(huán)境

創(chuàng)建一個(gè)叫做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文件復(fù)制到dataobjects目錄中.

還要復(fù)制core和plugins目錄和其中所有的內(nèi)容.創(chuàng)建幾個(gè)新的目錄,命名為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

創(chuàng)建數(shù)據(jù)庫創(chuàng)建一個(gè)名為example的數(shù)據(jù)庫,它包含一個(gè)名為User的表,不必?fù)?dān)心模式,稍后我們會(huì)創(chuàng)建.

配置PEAR::DB_DataObject要構(gòu)建數(shù)據(jù)對(duì)象,創(chuàng)建下面的文件

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配置文件中的值創(chuàng)建一個(gè)到數(shù)據(jù)庫的連接,顯示如下.

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

自動(dòng)構(gòu)建數(shù)據(jù)庫模式

包含兩個(gè)過程,構(gòu)建數(shù)據(jù)庫的對(duì)象-關(guān)系映射,和從example數(shù)據(jù)庫user表中自動(dòng)創(chuàng)建一個(gè)類.在表中的所有字段

名將成為類成員變量.

創(chuàng)建適當(dāng)?shù)哪J?

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}?>

它還會(huì)為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文件現(xiàn)在是創(chuàng)建幾個(gè)Smarty文件的時(shí)候了:

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/';?>

此腳本實(shí)例化了一個(gè)新Smarty對(duì)象.設(shè)置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 使用的變量.調(diào)用模板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.b3g6.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; ?>

此腳本顯示所有存儲(chǔ)在user表中的數(shù)據(jù).它加載PEAR::DataObject 和include.php文件(給smarty模板分配變量).第5行創(chuàng)建一個(gè)user對(duì)象的工廠.第6行執(zhí)行find()方法.SELECT * FROM user從數(shù)據(jù)庫中檢索出了數(shù)據(jù),通

過fetch()方法為模板保存數(shù)據(jù),一次返回一條記錄.

9 到14行是分配其他的變量給Smarty.

這些文件都應(yīng)當(dāng)放在dataobjects目錄中.

對(duì)于模板,這里有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.b3g6.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.b3g6.com/bcjs/view.php';'>23</td>24</tr>25; </table>26; </body>27 </html>

站點(diǎn)主頁,它在的3行和第9行分別顯示$TITLE 和$HEADER,這些變量值是從index.php傳遞過來的.

這個(gè)腳本在web瀏覽器上生成兩個(gè)按鈕,Insert和View,他們有相應(yīng)的行為.如果用戶點(diǎn)擊Insert,系統(tǒng)將調(diào)

用Insert.php.如果用戶點(diǎn)擊View,那么view.php將被調(diào)用

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.b3g6.com/bcjs/index.php';'>36; </td>37;;;;;</tr>38;;;</table>39;</form>40; </body>41 </html>

這個(gè)模板有一個(gè)表單和兩個(gè)按鈕,Add 和Return/Cancel.

用戶輸入數(shù)據(jù),first name,last name 和電子郵件字段.insert.php期望在名為x,y,z的變量中接收這些信息,用戶點(diǎn)

擊Add按鈕將運(yùn)行save.php.如果用戶點(diǎn)擊Return/Cancel,將會(huì)執(zhí)行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.b3g6.com/bcjs/index.php';'>52;;;;</td>53;;</tr>54</table>55; </body>56 </html>

這個(gè)模板顯示所有存儲(chǔ)在example數(shù)據(jù)庫中的所有數(shù)據(jù).

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

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

標(biāo)簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜在线精品偷拍| 精品国产亚洲一区二区三区| 国产成人精品福利| 精品一区二区男人吃奶| 亚洲精品在线国产| 日日夜夜免费精品| 日韩国产欧美三级| 欧美三级第一页| 欧美亚洲tv| 国产精品毛片aⅴ一区二区三区| 欧美偷窥清纯综合图区| 日本综合视频| 日本不卡一二三区黄网| 日韩高清在线观看一区二区| 亚洲一区二区成人| 国产中文在线播放| 午夜视频一区二区在线观看| 美女久久网站| 国产精品多人| 欧美成人基地| 久久免费影院| 亚洲精品第一| 亚洲一区网站| 久久狠狠亚洲综合| 日韩高清成人在线| 美女av一区| 成人美女视频| 美女少妇全过程你懂的久久| 日韩中文字幕区一区有砖一区| 日本免费新一区视频| 国产精品欧美日韩一区| 国产美女高潮在线| 伊人影院久久| 国产毛片精品| 国产精品黑丝在线播放| 九九久久婷婷| 亚洲精品激情| 四虎8848精品成人免费网站| 伊人久久亚洲影院| 国产精品久久久亚洲一区| 国产精品成人一区二区不卡| 自由日本语亚洲人高潮| 国产美女久久| 亚洲男女av一区二区| 91成人在线网站| 日韩欧美一区二区三区在线观看| 视频一区在线播放| 久久精品资源| 狠狠久久婷婷| 国产麻豆一区二区三区| 日韩免费福利视频| 亚洲精品在线二区| 黄在线观看免费网站ktv| 欧美专区在线| 黄色精品视频| 亚洲深深色噜噜狠狠爱网站| 色爱综合网欧美| 国产精品一区二区中文字幕| 日本在线不卡视频一二三区| 麻豆久久久久久久| 欧美亚洲三级| av中文字幕在线观看第一页| 日韩欧美一区二区三区免费观看| 免费不卡在线视频| 国产精品99免费看| 国产精品久久久亚洲一区| 男人的天堂久久精品| 精品成av人一区二区三区| 婷婷综合五月| 国产精品videossex久久发布| 欧美美女一区| 麻豆精品一区二区综合av| 日本欧美在线看| 日韩电影免费在线观看| 欧美亚洲tv| 亚洲一区日韩| 正在播放日韩精品| 欧美日韩18| 日韩中文字幕麻豆| 久草免费在线视频| 国产欧美综合一区二区三区| 久久午夜精品| 999国产精品永久免费视频app| 欧美欧美黄在线二区| 日韩亚洲精品在线| 亚洲性色av| 精品一区视频| 国产乱码精品一区二区三区四区| 麻豆9191精品国产| 欧美精品一二| 日韩不卡视频在线观看| 激情综合婷婷| 麻豆一区二区三区| 日本成人一区二区| 婷婷亚洲五月色综合| 亚洲综合电影| 国语对白精品一区二区| 国产欧美日韩精品高清二区综合区 | 精品一区二区三区免费看| 国产精品亚洲四区在线观看| 欧美激情麻豆| 亚洲影视一区二区三区| 久久精品国内一区二区三区水蜜桃| 99国产精品久久久久久久| 欧美亚洲日本精品| 麻豆国产欧美一区二区三区| 国产精品久久久免费| 99成人在线视频| 国产亚洲高清一区| 亚洲天堂av资源在线观看| 国产精品普通话对白| 亚洲高清毛片| 欧美日韩在线观看视频小说| 少妇久久久久| 久久免费高清| 日韩精品欧美| 精品国产a一区二区三区v免费| 国产日韩欧美| 亚洲人成毛片在线播放女女| 国产农村妇女精品一二区| 玖玖玖国产精品| 中文字幕亚洲精品乱码| 亚洲欧洲日韩| 日韩高清一区二区| 国产日韩一区| 久久精品国产免费| 九九99久久精品在免费线bt| 精品久久久久中文字幕小说| www在线观看黄色| 亚洲不卡av不卡一区二区| 91tv亚洲精品香蕉国产一区| 在线日韩一区| 久久亚洲风情| 综合色一区二区| 日本国产欧美| 国产欧美自拍| 国产一区二区三区视频在线| 日韩理论片av| 欧美日韩国产精品一区二区亚洲| 亚洲欧美日本日韩| 亚洲精品九九| 91综合久久爱com| 麻豆精品在线| 九九精品调教| 宅男噜噜噜66国产日韩在线观看| 亚洲精选91| 国产精品亚洲一区二区在线观看| 国产精品久久久久久久久久10秀| 91亚洲国产成人久久精品| 欧美性感美女一区二区| 久久亚洲欧洲| 国产伦精品一区二区三区千人斩 | 四虎成人av| 亚洲高清不卡| 亚洲一区导航| 久久国产精品美女| 亚洲一级少妇| 国产一级久久| 亚州欧美在线| 卡一卡二国产精品| 婷婷成人在线| 天堂精品久久久久| 久久精品三级| 激情欧美亚洲| 日韩av资源网| 91精品韩国| 亚洲日韩中文字幕一区| 久久丁香四色| 亚洲国产不卡| 国产精品日韩精品中文字幕| 久久久久蜜桃| 日韩午夜视频在线| 色在线中文字幕| 在线 亚洲欧美在线综合一区| 欧美一区精品| 久久精品青草| 青青伊人久久| 亚洲网站视频| 国产乱人伦精品一区| 亚洲91视频| 国产欧美日韩综合一区在线播放| 亚洲不卡av不卡一区二区| 日本不卡一二三区黄网| 日韩欧美在线中字| 偷拍亚洲精品| 电影91久久久| 亚洲一区二区三区久久久| 国产在线观看91一区二区三区| 欧美日韩国产亚洲一区| 久久激情av| 夜夜嗨av一区二区三区网站四季av| 国产亚洲第一伦理第一区| 亚洲午夜精品久久久久久app| 国产精品综合色区在线观看| 香蕉国产精品| 久久香蕉网站| 日韩高清一区在线 | 亚洲综合福利| 欧美手机在线| 精品三级久久久|