亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP仿博客園 個人博客(2) 數據庫增添改刪

2020-03-22 17:55:44
字體:
來源:轉載
供稿:網友
廢話不多說了,上一篇有個核心概念就是 give action do something !

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

簡單介紹一下這個model 類,它繼承了一個數據庫基類來做crud 等常用操作, 每次初始化時就會初始化一個數據庫對象 $db. 我們就用這個對象來操作我們的數據。
對于數據操作有2個重要方法 storePostFormValues( ) , storeDiaryFormValues( ),它們2個方法是數據流的開始。
還有2個方法很有意思,addChildNumber( ), reduceChildNumber( ), 它們負責在插入或刪除文檔時的 一個暗箱操作。因為我的文檔可以用多個分類,所以在操作文檔的時候,要考慮到一個問題,就是 category 表中有個字段 記錄了該分類下的 文檔數量。所以要動態地改變這些數目的值。
下面配合 post.php 控制器,我們就可以開始我們數據的流程了(我的控制器還不是一個類,所以無法生成API文檔。因為這還不是真正地MVC架構。)所以在MVC之前,這個也能更利于的理解MVC到底是神馬東東,以及你自己如何去應用,寫出自己的MVC。 以下的情形都是假設: $action = "天上掉下個女朋友給我吧!"; 讓我們傳入這個控制器看會發生神馬事情。 復制代碼 代碼如下:
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;
}
這里我們有個重要流程控制語句 switch , 這個單詞是 開關的意思; 所以當上面那個 $action = "天上掉下個女朋友給我吧!"; 傳入 switch 時,只有2種可能,一種是開,一種是關。這里有點雙關地意思,有些同學可能看出來了。嘿嘿! 言歸正傳:看看我們的 switch 是如何開關這些 $action , 很明顯 天上不會掉個女朋友給我,因為控制器里沒有這個開關,所以只能還是說說代碼的事。 復制代碼 代碼如下:
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;
}
每個switch都應該定義默認的 開關,這樣當沒有女朋友的時候,可以確保我們還有基友。
如何傳入 action 呢?
來看這樣一個url,也就是我們的后臺框架的導航, post.php?action=isPost 這個是一個標準的action, 我們每個url 其實都是由這些action組成的,也可以加入其他的一些參數到我們的url 中, 這樣我們可以在控制器定義的方法中 GET (得到這些變量的值),然后我們可以多些控制。
好了,當這個url 到達我們的控制器后,我們接收判斷,然后打開一個 isPost 的開關,這樣我們就可以調用后面的方法了,想想 開關燈,開關電腦,開關就是我們經常做的事。
這里我們只是換了一個地方。
ok 。 來看看這個開關的下面的方法。 復制代碼 代碼如下:
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");
}

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

這樣 我們的 $results 數組中就儲存了我們頁面所需的所有數據。 好的,來看看我們的模版,是怎么輸出的。 復制代碼 代碼如下:
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
html
head
title
博客后臺管理 /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" 評論 /a /li
li a href="photo.php?action=IsPhoto" 相片 /a /li
/ul
div id="SubNav"
當前位置: ?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" 文章(主要用于轉載,發布原創博文要通過“隨筆”) /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"
標題
/th
th width="40"
發布 br /
狀態
/th
th valign="bottom" width="50"
評論
/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'] = "發布";
} else {
$post['status'] = " b 未發布 /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('從數據庫中刪除這篇文檔?')==true){window.location='article.php?action=delete&postID={$post['post_id']}';}" 刪除 /a /td
/tr
EOB;
}
echo " /table
if( isset( $pagination) ){$pagination- createLinks( ) ;}
} else {
echo "當前無內容!";
}

?

/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
以上只是顯示數據,人人都會啊。 我們怎么操作這些數據呢? 操作,就像是一種控制能力。 學生時代踢足球,我對球場有一種很強的控制能力,大學足球比賽拿了1次冠軍,1次亞軍,1次季軍,大四沒去,中學更是無數榮譽。 我的位置是中衛,在足球場上,這個位置,你得有統觀全局的能力,也得有很強的個人能力,還有指揮能力;扯的遠了,現在天天坐在電腦前,這些東西也早就沒了, 就剩下些經驗之談。不過其中滋味,你也須也體驗過。 我這個博客有個缺點,每次你對數據庫進行一次讀寫操作,你得刷新啊!我知道這對服務器的負載很大,但是我覺得如果一個新技術你沒有完全吃透,盲目運用,只會適得其反。 所以暫時我還是犧牲服務器的響應時間,內存消耗,來獲得一種相對的穩定! 所以我對全局還不是很了解,還有很多未知地領域沒有涉入,如深入ajax,深入php,c 。。。 不多說了。 好了,看看怎么對數據進行CRUD 吧! DELETE 刪除
先看這個指令 post.php?action=delete postID=132 當我們確認要刪除時,這里有個注意的地方,我們能先要對該文檔所屬的分類下的 count_child_number 這個字段進行 一個減 1 的操作。 為什么? 因為我也開始犯了個邏輯錯誤,刪除后我才調用這個方法,還記得嘛!reduceChildNumber( ) 有趣地地方就是這里,讓我受益匪淺!也讓我調試了N久! 所以:當你的語法都沒錯的時候,可能是你的邏輯錯了!或是方法錯了!這就是我的注釋! 請看: 復制代碼 代碼如下:
$post = new Post;
$filter['post_id'] = isset( $_GET['postID'] ) ? ( int )$_GET['postID'] : "";

// !important 在數據刪除之前 先將該分類下的文章數量減 1
// 否則你不知道刪除那個分類下的文章數量
// 我犯了個邏輯錯誤 先刪除了 文檔, 然后查該文檔的分類ID;永遠也查不到,因為已經不存在了。
$post- reduceChildNumber( "category", ( int ) $_GET['postID'] );

$result = $post- delete("post", $filter );
這里我們只要初始化我們文章頭頂的那個 model 就可以輕松調用 delete() 方法。 CREATE 插入
先看這個指令 post.php?action=newPost
說實話,我很久沒有插入了。呵呵! 看控制方法: 復制代碼 代碼如下:
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");
}
}
我們使用一個模版來同時進行文檔的插入和更新。關鍵就是 isset( ),當我們調用控制器的 newPost 方法時,我們并沒有往模版中傳入文檔。
所以在模版中,我們用 isset() 來做判斷時,我們獲得了空值,是個好東西;這樣我們不會輸出任何內容到模版中去。這樣,我們等待用戶提交表單,在這里,我為了省事,暫時沒有對表單進行過濾,不過我留了個后門以后來更新。 好的,假設我們的表單被提交了,(也被你基本的過濾了)。 我們調用 post model中 的 storePostFormValues( ) , storeDiaryFormValues( ); 記得嘛,這個方法把所有的表單內容放入一個數組,在做了基本的類型檢查之后,
到這里已經成功一半了。下面就是 insert***()。 這就是mysql 萬能數據庫操作類的好處,它能幫你處理各種表單,各種類型。當然你如果要求更細,更多,你可以繼承它,擴展
它的方法,或新建方法。 到這里離完成還有一步,addChildNumber( )。 當你為你的文檔選擇分類時,同時也要在相應的分類表中的 count_child_number中加 1 。
如果用戶選擇將文檔放入草稿箱的話,只需插入一個 type = PostDraft 的文檔記錄。

UPDATE 更新
先看這個指令 post.php?action=updatePost postID=132
更新首先就要獲得這個文檔的數據,postID, 同樣是 GET方法得到。 這樣我們就可以初始化表單中的 value 值了。 isset( ) 在這里起了關鍵作用,不是嘛? 后面的部分大同小異, storePostFormValues( ) , storeDiaryFormValues( ); 然后你調用 post model update***( ) 。
看代碼: 復制代碼 代碼如下:
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");
}

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

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品极品视频免费观看| 日韩中文字幕在线精品| 国产精品专区第二| 一夜七次郎国产精品亚洲| 欧洲成人午夜免费大片| 国产日产欧美a一级在线| 亚洲欧美日韩国产成人| 中文字幕一精品亚洲无线一区| 亚洲欧美日韩精品久久奇米色影视| 亚洲在线一区二区| 亚洲第一精品电影| 伊人男人综合视频网| 欧美另类交人妖| 色综合伊人色综合网| 国产va免费精品高清在线观看| 青青草国产精品一区二区| 日韩欧美国产视频| 亚洲全黄一级网站| 日韩精品视频中文在线观看| 最近2019中文字幕第三页视频| 91爱爱小视频k| 正在播放欧美一区| 成人国产精品av| 亚洲国产精品一区二区三区| 亚洲品质视频自拍网| 性欧美长视频免费观看不卡| 欧美亚洲另类在线| 色婷婷综合久久久久中文字幕1| 免费99精品国产自在在线| 欧美日韩成人在线观看| 久久视频国产精品免费视频在线| 国产精品国产自产拍高清av水多| 欧美日韩一二三四五区| 国产精品精品一区二区三区午夜版| 亚洲国产精品网站| 久久精品视频在线观看| 亚洲另类xxxx| 黑人巨大精品欧美一区二区免费| 一本色道久久综合狠狠躁篇怎么玩| 国产精品日韩欧美综合| 久久精品电影网站| 亚洲人成电影网| 欧美一区二区.| 国产精品久久久精品| 亚洲精品suv精品一区二区| 亚洲免费视频在线观看| 91精品久久久久久久久久久久久| 日韩一区在线视频| 国产99久久精品一区二区 夜夜躁日日躁| 久久精品免费电影| 黑人巨大精品欧美一区二区免费| 久久天天躁狠狠躁老女人| 久久亚洲影音av资源网| 欧美成人午夜影院| 久久久国产视频| 中文字幕国产亚洲2019| 国产成人一区二区三区电影| 国产精品中文字幕在线| 97视频在线观看免费高清完整版在线观看| 欧美一级淫片aaaaaaa视频| 亚洲欧美国产日韩中文字幕| 日韩一区二区三区xxxx| 日韩三级成人av网| 黄色成人在线免费| 欧美另类第一页| 欧美日韩激情视频8区| 日韩欧美视频一区二区三区| 热99精品只有里视频精品| 欧美理论电影网| 国产日韩精品在线| 这里精品视频免费| 国产不卡av在线| 97精品在线视频| 国产成人一区二区三区小说| 国产一区二区三区视频| 狠狠躁18三区二区一区| 国产成人jvid在线播放| 久久精品视频亚洲| 91欧美精品午夜性色福利在线| 国产欧美精品在线播放| 国产亚洲精品久久久久动| 国产成人精品综合久久久| 欧美又大粗又爽又黄大片视频| 国产精品免费久久久久久| 精品色蜜蜜精品视频在线观看| 国模视频一区二区三区| 国产精品视频26uuu| 欧美在线视频播放| 国产一区二区三区直播精品电影| 全亚洲最色的网站在线观看| 欧美日韩999| 成人高h视频在线| 亚洲欧美日韩久久久久久| 欧美日韩精品二区| 色综合91久久精品中文字幕| 91视频免费网站| 日本中文字幕不卡免费| 精品自在线视频| 色婷婷综合成人av| 社区色欧美激情 | 精品福利在线看| 亚洲天堂日韩电影| 国内精品伊人久久| 亚洲性av在线| 欧美大全免费观看电视剧大泉洋| 国产丝袜一区二区三区免费视频| 日韩精品日韩在线观看| 亚洲精品美女久久久久| 欧美国产日韩一区二区三区| 国产精品白丝jk喷水视频一区| 欧美日韩国产91| 国产精品99久久久久久久久| 亚洲三级免费看| 久久免费视频这里只有精品| 国产精品流白浆视频| 国产拍精品一二三| 亚洲国产三级网| 日韩成人激情影院| 国产精品成人av在线| 久久国产天堂福利天堂| 欧美在线亚洲在线| 国产不卡av在线| 亚洲综合在线中文字幕| 欧美日韩在线看| 日韩欧亚中文在线| 性欧美办公室18xxxxhd| 国产精品国产三级国产aⅴ浪潮| 精品亚洲一区二区三区四区五区| 成人免费福利在线| 狠狠久久五月精品中文字幕| 亚洲国产日韩欧美在线图片| 懂色aⅴ精品一区二区三区蜜月| 欧美大片在线看| 国产噜噜噜噜噜久久久久久久久| 91精品国产91久久久久| 久久夜精品香蕉| 亚洲aa在线观看| 国产日韩精品入口| 久久久久久久久综合| 国产亚洲精品久久久优势| 精品亚洲精品福利线在观看| 国产精品自产拍高潮在线观看| 欧美另类高清videos| 国产成人精品av| 国产精品激情自拍| 中文字幕欧美日韩va免费视频| **欧美日韩vr在线| 色综久久综合桃花网| 国产裸体写真av一区二区| 欧美激情国产高清| 亚洲www在线观看| 欧美日韩亚洲一区二区| 欧美在线一区二区三区四| 亚洲精品国产精品国产自| 国产精品久久综合av爱欲tv| 欧美电影免费观看高清完整| 国产精品一区二区电影| 69视频在线免费观看| 欧美成人免费一级人片100| 97久久精品视频| 日日摸夜夜添一区| 亚洲v日韩v综合v精品v| 亚洲夜晚福利在线观看| 美女久久久久久久|