激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP仿博客園 個人博客(2) 數據庫增添改刪

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

2020-05-09 12:37PHP教程網 PHP教程

先謝謝大家的鼓勵與支持,這是第2篇了。也是這個博客系統最核心的東西。這個博客寫完后,我會把它放在我的博客網站。這里也有我的一個簡歷

廢話不多說了,上一篇有個核心概念就是 give action do something !

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

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

簡單介紹一下這個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。這里我們就是簡單獲取 這個類型下的所有分類,顯示在側邊欄,我已經完成了。有圖有真相!

 

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

這樣 我們的 $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 class="NavHeaderRow">
                         <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 class="NavLeftCell">                       
                         <div class="left_nav">
                             <ul id="LinksActions">
                                 <li><a href="article.php?action=newArticle">» 添加新文章</a></li>
                             </ul>
                         </div>
                         <div id="CategoriesHeader" class="LeftNavHeader">
                             分類
                         </div>
                         <div class="left_nav">
                             <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" class="CollapsibleHeader">
         <span id="Editor_Results_headerTitle">文章(主要用于轉載,發布原創博文要通過“隨筆”)</span>
     </div>
     <div id="Editor_Results_Contents">    
 <?php 
     if( isset( $results['posts'] )){
     echo <<<EOB
             <table id="Listing" class="Listing" cellspacing="0" cellpadding="0" border="0" style='width:98%;'>
                 <tr style="text-align: center">
                     <th valign="bottom">
                         標題
                     </th>
                     <th width="40" style="text-align: center">
                         發布<br />
                         狀態
                     </th>
                     <th valign="bottom" width="50" style="text-align: center">
                         評論
                     </th>
                     <th width="50" style="text-align: center">
                         頁面<br />
                         瀏覽
                     </th>             
                     <th valign="bottom" width="40" style="text-align: center">
                         操作
                     </th>
                     <th valign="bottom" width="40" style="text-align: center">
                         操作
                     </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']}" class="Alt">
                 <td style="text-align: left">{$post['title']} ({$time})</td>
                 <td style="text-align: center">{$post['status']}</td>
                 <td style="text-align: center">{$post['view_count']}</td>
                 <td style="text-align: center">{$post['comment_count']}</td>
                 <td style="text-align: center"><a href="article.php?action=editArticle&postID={$post['post_id']}">編輯</a></td>
                 <td style="text-align: center"><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" style="display:none;"></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 class="clear"></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 快樂,嘿嘿。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 理论片中文字幕 | 国产乱轮视频 | 国产资源在线免费观看 | 色就操 | 国产一国产一级毛片视频在线 | 国产乱一区二区三区视频 | 精品久久久久久久久久久久久 | 免费观看又色又爽又黄的崩锅 | 污片视频网站 | 看免费黄色大片 | 国产精品久久久久久久久久久久久久久久 | 成人免费看片a | 亚洲一区二区三区高清视频 | 中文字幕亚洲一区二区三区 | 亚洲xxx视频 | 成人精品视频网站 | 91九色蝌蚪在线 | 免费黄色在线电影 | 日韩欧美中文字幕视频 | 国产免费美女 | 国产免费一级淫片a级中文 99国产精品自拍 | 欧美成人区 | 久久久久久久久久亚洲 | 国产一级爱c视频 | 羞羞视频免费观看入口 | 精品黑人一区二区三区国语馆 | 九九热九九 | 久久久久久亚洲国产精品 | 免费在线观看国产精品 | 在线观看日韩av电影 | 九九热在线精品视频 | 亚洲成人福利在线观看 | 精品1| 一级成人在线 | 国产精品久久99精品毛片三a | 鲁一鲁一鲁一鲁一曰综合网 | 免费看黄色一级大片 | 黄色视屏免费在线观看 | 看av网址 | 意大利av在线 | 中文字幕精品一二三四五六七八 |