国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP仿博客園 個(gè)人博客(2) 數(shù)據(jù)庫增添改刪

2020-03-22 17:55:44
字體:
供稿:網(wǎng)友
廢話不多說了,上一篇有個(gè)核心概念就是 give action do something !

這篇我就用代碼來解釋這個(gè)概念是啥意思,先看我的 post.html' target='_blank'>class.php . 這個(gè)文件是我們的數(shù)據(jù)層處理類。

簡單介紹一下這個(gè)model 類,它繼承了一個(gè)數(shù)據(jù)庫基類來做crud 等常用操作, 每次初始化時(shí)就會(huì)初始化一個(gè)數(shù)據(jù)庫對(duì)象 $db. 我們就用這個(gè)對(duì)象來操作我們的數(shù)據(jù)。
對(duì)于數(shù)據(jù)操作有2個(gè)重要方法 storePostFormValues( ) , storeDiaryFormValues( ),它們2個(gè)方法是數(shù)據(jù)流的開始。
還有2個(gè)方法很有意思,addChildNumber( ), reduceChildNumber( ), 它們負(fù)責(zé)在插入或刪除文檔時(shí)的 一個(gè)暗箱操作。因?yàn)槲业奈臋n可以用多個(gè)分類,所以在操作文檔的時(shí)候,要考慮到一個(gè)問題,就是 category 表中有個(gè)字段 記錄了該分類下的 文檔數(shù)量。所以要?jiǎng)討B(tài)地改變這些數(shù)目的值。
下面配合 post.php 控制器,我們就可以開始我們數(shù)據(jù)的流程了(我的控制器還不是一個(gè)類,所以無法生成API文檔。因?yàn)檫@還不是真正地MVC架構(gòu)。)所以在MVC之前,這個(gè)也能更利于的理解MVC到底是神馬東東,以及你自己如何去應(yīng)用,寫出自己的MVC。 以下的情形都是假設(shè): $action = "天上掉下個(gè)女朋友給我吧!"; 讓我們傳入這個(gè)控制器看會(huì)發(fā)生神馬事情。 復(fù)制代碼 代碼如下:
require_once( "config/config.php" );
session_start( );
$action = isset( $_GET['action'] ) ? $_GET['action'] : "";
$username = isset( $_SESSION['username'] ) ? $_SESSION['username'] : ""; if( !$username )
{
header("Location: index.php?action=login");
exit;
}
這里我們有個(gè)重要流程控制語句 switch , 這個(gè)單詞是 開關(guān)的意思; 所以當(dāng)上面那個(gè) $action = "天上掉下個(gè)女朋友給我吧!"; 傳入 switch 時(shí),只有2種可能,一種是開,一種是關(guān)。這里有點(diǎn)雙關(guān)地意思,有些同學(xué)可能看出來了。嘿嘿! 言歸正傳:看看我們的 switch 是如何開關(guān)這些 $action , 很明顯 天上不會(huì)掉個(gè)女朋友給我,因?yàn)榭刂破骼餂]有這個(gè)開關(guān),所以只能還是說說代碼的事。 復(fù)制代碼 代碼如下:
switch( $action )
{
case "newPost" :
newPost( );
break;

case "delete" :
delete( ) ;
break;

case "updatePost":
updatePost( );
break;

case "IsDraft":
listDraft( );
break;

case "logout" :
logout( );
break;

case "isPost":
listPost( );
break;

case "diffentCategoryPost":
diffentCategoryPost( );
break;

case "unCategory":
unCategory( );
break;

default :
listPost( );
break;
}
每個(gè)switch都應(yīng)該定義默認(rèn)的 開關(guān),這樣當(dāng)沒有女朋友的時(shí)候,可以確保我們還有基友。
如何傳入 action 呢?
來看這樣一個(gè)url,也就是我們的后臺(tái)框架的導(dǎo)航, post.php?action=isPost 這個(gè)是一個(gè)標(biāo)準(zhǔn)的action, 我們每個(gè)url 其實(shí)都是由這些action組成的,也可以加入其他的一些參數(shù)到我們的url 中, 這樣我們可以在控制器定義的方法中 GET (得到這些變量的值),然后我們可以多些控制。
好了,當(dāng)這個(gè)url 到達(dá)我們的控制器后,我們接收判斷,然后打開一個(gè) isPost 的開關(guān),這樣我們就可以調(diào)用后面的方法了,想想 開關(guān)燈,開關(guān)電腦,開關(guān)就是我們經(jīng)常做的事。
這里我們只是換了一個(gè)地方。
ok 。 來看看這個(gè)開關(guān)的下面的方法。 復(fù)制代碼 代碼如下:
function listPost( )
{
$results = array( );
$results['pageTitle'] = "Post List" ;
$results['path'] = " a href='?action=isPost' 隨筆 /a
// set the message
if ( isset( $_GET['error'] ) )
{
if ( $_GET['error'] == "InsertedFailed" ) $results['errorMessage'] = "文檔添加失敗";
if ( $_GET['error'] == "postDeleteFailed" ) $results['errorMessage'] = "文檔刪除失敗";
}
if ( isset( $_GET['status'] ) )
{
if ( $_GET['status'] == "changesSaved" ) $results['statusMessage'] = "文檔保存了!";
if ( $_GET['status'] == "Deleted" ) $results['statusMessage'] = "文檔刪除了!";
if ( $_GET['status'] == "Inserted" ) $results['statusMessage'] = "你添加了新的文檔!";
if ( $_GET['status'] == "SaveToDraft" ) $results['statusMessage'] = "文檔保存到了草稿箱!";
}

// 文檔的分類瀏覽
$db = MySQL::getInstance( );
$pagination = new Pagination;
$cat = new Category;
$results['categories'] = $cat- getCategoryList("post");

$pagination- countSQL = "select * from post where type = 'post' " ;
$db- Query( $pagination- countSQL );
$pagination- totalRecords = $db- RowCount( );
$records = $db- HasRecords( $pagination- rebuiltSQL( ) );
if( $records )
{
$results['posts'] = $db- QueryArray( $pagination- rebuiltSQL( ) );
require_once(TEMPLATE_PATH . "/post/post_list.php");
}
else
{
require_once(TEMPLATE_PATH . "/post/post_list.php");
}

}
我們定義了一個(gè)數(shù)組,$results = array( ); 這個(gè)數(shù)組的作用明顯,它將保存我們從 model 中獲取的任何數(shù)據(jù),也可以保存從url上 GET 的特殊參數(shù)。然后將在我們下面require_once(*****) 包含的模版中顯示出來, 路徑定義在了 path 變量中。 同時(shí)我們會(huì)接收2個(gè)提示參數(shù), error , 表示操作出現(xiàn)錯(cuò)誤,任何人都在所難免,包括電腦,誰都會(huì)犯錯(cuò),關(guān)鍵是去承認(rèn),電腦做的很好,他們勇于承認(rèn)錯(cuò)誤。 status; 表示狀態(tài),就是成功的操作。 $pagination = new Pagination; 這個(gè)類是我們的分頁類,我們傳入一個(gè) 總的數(shù)量給它,然后它自己會(huì)算出總頁數(shù),每跳轉(zhuǎn)一個(gè)頁面,相當(dāng)于刷新了一次,所以大家的做法就是,在構(gòu)造器里 GET(獲取)url上的page 的值,讓我們知道是當(dāng)前那一頁了。同時(shí)我們重新生成了查詢的語句,后面加上一條限制的語句,類似 limit $start(起始的id), $offset(長度); 原理就是從這個(gè)id起,往后給我10 條記錄;我的設(shè)定就是 10 條,你也可以更靈活。
$cat = new Category;這個(gè)類后面會(huì)詳細(xì)說,也是非常重要的分類model。這里我們就是簡單獲取 這個(gè)類型下的所有分類,顯示在側(cè)邊欄,我已經(jīng)完成了。有圖有真相!

這樣 我們的 $results 數(shù)組中就儲(chǔ)存了我們頁面所需的所有數(shù)據(jù)。 好的,來看看我們的模版,是怎么輸出的。 復(fù)制代碼 代碼如下:
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
html
head
title
博客后臺(tái)管理 /title
meta http-equiv="Content-Type" content="text/html; charset=utf-8"/
link rel="stylesheet" type="text/css" href="assert/css/blog.css" /
/head
body id="Posts"
table id="BodyTable" border="0" cellpadding="0" cellspacing="0" width="100%"
tr
td id="Header" colspan="2" div id="SiteNav" /div
div id="BlogTitle"
Arist's Blog
/div
div id="Site Title"
b blockquote Hinging there, everything will be fine. /blockquote /b
/div
/td
/tr
tr
td
div id="LeftNavHeader" 操作 /div
/td
td
ul id="TopNav"
li a href="post.php?action=IsPost" 隨筆 /a /li
li a href="article.php?action=IsArticle" 文章 /a /li
li a href="diary.php?action=IsDiary" 日記 /a /li
li a href="comment.php?action=IsComment" 評(píng)論 /a /li
li a href="photo.php?action=IsPhoto" 相片 /a /li
/ul
div id="SubNav"
當(dāng)前位置: ?php if( isset( $results['path'] )) echo $results['path']; ?
/div
/td
/tr
tr
td
div
ul id="LinksActions"
li a href="article.php?action=newArticle" 添加新文章 /a /li
/ul
/div
div id="CategoriesHeader"
分類
/div
div
ul id="LinksCategories"
li a href="category.php?action=ListCat&type=article" [編輯分類] /a /li
li a href="article.php?action=IsArticle" [所有分類] /a /li
li a href="article.php?action=unCategory" [未分類] /a /li
?php
if( isset( $results['categories'] ) && ! empty( $results['categories'] ) ){
foreach( $results['categories'] as $category ){
echo EOB
li a href="article.php?action=diffentCategoryArticle&catID={$category['category_id']}" {$category['name']}({$category['count_child_number']}) /a /li
EOB;
}
}
?
/ul
/div
/td
td id="Body"
div id="Main"
div id="Editor_Messages"
!-- 顯示提示信息 --
?php
if( isset( $results['statusMessage'] )){echo $results['statusMessage'];}
if( isset( $results['errorMessage'] )){echo $results['errorMessage'];}
?
/div
div id="Editor_Results"
div id="Editor_Results_Header"
span id="Editor_Results_headerTitle" 文章(主要用于轉(zhuǎn)載,發(fā)布原創(chuàng)博文要通過“隨筆”) /span
/div
div id="Editor_Results_Contents"
?php
if( isset( $results['posts'] )){
echo EOB
table id="Listing" cellspacing="0" cellpadding="0" border="0"
tr
th valign="bottom"
標(biāo)題
/th
th width="40"
發(fā)布 br /
狀態(tài)
/th
th valign="bottom" width="50"
評(píng)論
/th
th width="50"
頁面 br /
瀏覽
/th
th valign="bottom" width="40"
操作
/th
th valign="bottom" width="40"
操作
/th
/tr

EOB;
foreach( $results['posts'] as $post ){
$time = date("Y-m-d H:i:s", $post['create_time']);
if( $post['status'] == "1" ){
$post['status'] = "發(fā)布";
} else {
$post['status'] = " b 未發(fā)布 /b
}
echo EOB
tr id="entry_{$post['post_id']}"
td {$post['title']} ({$time}) /td
td {$post['status']} /td
td {$post['view_count']} /td
td {$post['comment_count']} /td
td a href="article.php?action=editArticle&postID={$post['post_id']}" 編輯 /a /td
td a href="JavaScript:if(confirm('從數(shù)據(jù)庫中刪除這篇文檔?')==true){window.location='article.php?action=delete&postID={$post['post_id']}';}" 刪除 /a /td
/tr
EOB;
}
echo " /table
if( isset( $pagination) ){$pagination- createLinks( ) ;}
} else {
echo "當(dāng)前無內(nèi)容!";
}

?

/div
/div

span id="currentPostId" /span

/div
/td
/tr
/table
div id="blog_top_nav_block"
div id="site_nav"
/div
div id="login_area"
span id="span_userinfo" b ?php echo $_SESSION['username']; ? /b a href="?action=logout" logout /a /span
/div
div /div
/div
table id="Footer" border="0" cellpadding="0" cellspacing="0" width="100%"
tr
td colspan="2"
div
?php echo date("Y", time( ) ); ? Arist
/div
/td
/tr
/table
/body
/html
以上只是顯示數(shù)據(jù),人人都會(huì)啊。 我們?cè)趺床僮鬟@些數(shù)據(jù)呢? 操作,就像是一種控制能力。 學(xué)生時(shí)代踢足球,我對(duì)球場有一種很強(qiáng)的控制能力,大學(xué)足球比賽拿了1次冠軍,1次亞軍,1次季軍,大四沒去,中學(xué)更是無數(shù)榮譽(yù)。 我的位置是中衛(wèi),在足球場上,這個(gè)位置,你得有統(tǒng)觀全局的能力,也得有很強(qiáng)的個(gè)人能力,還有指揮能力;扯的遠(yuǎn)了,現(xiàn)在天天坐在電腦前,這些東西也早就沒了, 就剩下些經(jīng)驗(yàn)之談。不過其中滋味,你也須也體驗(yàn)過。 我這個(gè)博客有個(gè)缺點(diǎn),每次你對(duì)數(shù)據(jù)庫進(jìn)行一次讀寫操作,你得刷新啊!我知道這對(duì)服務(wù)器的負(fù)載很大,但是我覺得如果一個(gè)新技術(shù)你沒有完全吃透,盲目運(yùn)用,只會(huì)適得其反。 所以暫時(shí)我還是犧牲服務(wù)器的響應(yīng)時(shí)間,內(nèi)存消耗,來獲得一種相對(duì)的穩(wěn)定! 所以我對(duì)全局還不是很了解,還有很多未知地領(lǐng)域沒有涉入,如深入ajax,深入php,c 。。。 不多說了。 好了,看看怎么對(duì)數(shù)據(jù)進(jìn)行CRUD 吧! DELETE 刪除
先看這個(gè)指令 post.php?action=delete postID=132 當(dāng)我們確認(rèn)要?jiǎng)h除時(shí),這里有個(gè)注意的地方,我們能先要對(duì)該文檔所屬的分類下的 count_child_number 這個(gè)字段進(jìn)行 一個(gè)減 1 的操作。 為什么? 因?yàn)槲乙查_始犯了個(gè)邏輯錯(cuò)誤,刪除后我才調(diào)用這個(gè)方法,還記得嘛!reduceChildNumber( ) 有趣地地方就是這里,讓我受益匪淺!也讓我調(diào)試了N久! 所以:當(dāng)你的語法都沒錯(cuò)的時(shí)候,可能是你的邏輯錯(cuò)了!或是方法錯(cuò)了!這就是我的注釋! 請(qǐng)看: 復(fù)制代碼 代碼如下:
$post = new Post;
$filter['post_id'] = isset( $_GET['postID'] ) ? ( int )$_GET['postID'] : "";

// !important 在數(shù)據(jù)刪除之前 先將該分類下的文章數(shù)量減 1
// 否則你不知道刪除那個(gè)分類下的文章數(shù)量
// 我犯了個(gè)邏輯錯(cuò)誤 先刪除了 文檔, 然后查該文檔的分類ID;永遠(yuǎn)也查不到,因?yàn)橐呀?jīng)不存在了。
$post- reduceChildNumber( "category", ( int ) $_GET['postID'] );

$result = $post- delete("post", $filter );
這里我們只要初始化我們文章頭頂?shù)哪莻€(gè) model 就可以輕松調(diào)用 delete() 方法。 CREATE 插入
先看這個(gè)指令 post.php?action=newPost
說實(shí)話,我很久沒有插入了。呵呵! 看控制方法: 復(fù)制代碼 代碼如下:
function newPost( )
{
$results['action'] = "newPost" ;
$results['pageTitle'] = " Add New post" ;
$results['newPost'] = "true";
$results['path'] = " a href='?action=isPost' 隨筆 /a span 添加隨筆 /span
$post = new Post;
$cat = new Category;
$results['categories'] = $cat- getCategoryList( "post");
// 新建文檔
if( isset( $_POST['saveChanged'] ))
{
$post- storePostFormValues( $_POST );
$result = $post- insertPost( );
if( $result )
{
$post- addChildNumber( "category", $_POST['category'] );
header("Location: post.php?action=isPost&status=Inserted");
}
else
{
header("Location: post.php?action=isPost&error=InsertedFailed");
}
// 保存到草稿箱
} else if( isset( $_POST['saveDraft']) )
{
$post = new Post;
$post- storePostFormValues( $_POST );
$post- saveDraft( );
header("Location: post.php?action=isPost&status=postSaveToDraft");
// cancel
} else if( isset( $_POST['cancel'] ))
{
header("Location: post.php?action=isPost");
}
else
{
require_once(TEMPLATE_PATH . "/post/post_edit.php");
}
}
我們使用一個(gè)模版來同時(shí)進(jìn)行文檔的插入和更新。關(guān)鍵就是 isset( ),當(dāng)我們調(diào)用控制器的 newPost 方法時(shí),我們并沒有往模版中傳入文檔。
所以在模版中,我們用 isset() 來做判斷時(shí),我們獲得了空值,是個(gè)好東西;這樣我們不會(huì)輸出任何內(nèi)容到模版中去。這樣,我們等待用戶提交表單,在這里,我為了省事,暫時(shí)沒有對(duì)表單進(jìn)行過濾,不過我留了個(gè)后門以后來更新。 好的,假設(shè)我們的表單被提交了,(也被你基本的過濾了)。 我們調(diào)用 post model中 的 storePostFormValues( ) , storeDiaryFormValues( ); 記得嘛,這個(gè)方法把所有的表單內(nèi)容放入一個(gè)數(shù)組,在做了基本的類型檢查之后,
到這里已經(jīng)成功一半了。下面就是 insert***()。 這就是mysql 萬能數(shù)據(jù)庫操作類的好處,它能幫你處理各種表單,各種類型。當(dāng)然你如果要求更細(xì),更多,你可以繼承它,擴(kuò)展
它的方法,或新建方法。 到這里離完成還有一步,addChildNumber( )。 當(dāng)你為你的文檔選擇分類時(shí),同時(shí)也要在相應(yīng)的分類表中的 count_child_number中加 1 。
如果用戶選擇將文檔放入草稿箱的話,只需插入一個(gè) type = PostDraft 的文檔記錄。

UPDATE 更新
先看這個(gè)指令 post.php?action=updatePost postID=132
更新首先就要獲得這個(gè)文檔的數(shù)據(jù),postID, 同樣是 GET方法得到。 這樣我們就可以初始化表單中的 value 值了。 isset( ) 在這里起了關(guān)鍵作用,不是嘛? 后面的部分大同小異, storePostFormValues( ) , storeDiaryFormValues( ); 然后你調(diào)用 post model update***( ) 。
看代碼: 復(fù)制代碼 代碼如下:
function updatePost( )
{
$results['action'] = "updatePost";
$results['pageTitle'] = "Edit post";
$post = new Post;
$cat = new Category;
$results['categories'] = $cat- getCategoryList("post");
if( isset( $_POST['saveChanged'] ))
{
// do update
$post- storePostFormValues( $_POST );
$post- updatePost( );
header("Location: post.php?action=isPost&status=changesSaved") ;
} else if( isset( $_POST['cancel'] ) )
{
header("Location: post.php?action=isPost&status=Cancel");
}else
{
// get the post
$postID = isset( $_GET['postID'] ) ? $_GET['postID'] : " ";
$results['post'] = $post- getPostByID( $postID );
require_once(TEMPLATE_PATH . "/post/post_edit.php");
}

}
到這里就差不多了,我們實(shí)現(xiàn)了幾乎所有的基本操作。 幾點(diǎn)說明,這些action 有的是導(dǎo)航,有的是生成的,大部分是固定的。自己看著用吧。 下篇說說 分類的事!還有就是這篇博客寫完后會(huì)放在一個(gè)網(wǎng)站上 你如果想要源碼學(xué)習(xí)的話,我會(huì)提供下載。謝謝你花這么長時(shí)間聽我嘮叨, 看到這句的人,祝你們 昨天 6,1 快樂,嘿嘿。PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 靖远县| 新泰市| 安宁市| 平潭县| 南通市| 临澧县| 禄劝| 福鼎市| 张家界市| 肥乡县| 南充市| 苍溪县| 莫力| 吉木萨尔县| 垣曲县| 晋江市| 鄱阳县| 开化县| 且末县| 南和县| 鹿邑县| 金山区| 天全县| 长岭县| 阳新县| 江津市| 奎屯市| 尤溪县| 宁陵县| 翁源县| 勐海县| 资兴市| 长治县| 吉林市| 原阳县| 三明市| 南郑县| 文成县| 聊城市| 达州市| 潮安县|