PHP仿博客园 个人博客(2) 数据库增添改删
废话不多说了,上一篇有个核心概念就是 give action do something ! 这篇我就用代码来解释这个概念是啥意思,先看我的 post.class.php . 这个文件是我们的数据层处理类。 简单介绍一下这个model 类,它继承了一个数据库基类来做crud 等常用操作,每次初始化时就会初始化一个数据库对象 $db. 我们就用这个对象来操作我们的数据。 以下的情形都是假设: $action = "天上掉下个女朋友给我吧!"; 让我们传入这个控制器看会发生神马事情。 代码如下: require_once( "config/config.php" );
session_start( ); $action = isset( $_GET['action'] ) ? $_GET['action'] : ""; $username = isset( $_SESSION['username'] ) ? $_SESSION['username'] : ""; if( !$username ) 这里我们有个重要流程控制语句 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都应该定义默认的 开关,这样当没有女朋友的时候,可以确保我们还有基友。 代码如下: function listPost( )
{ $results = array( ); $results['pageTitle'] = "Post List" ; $results['path'] = "随笔"; // 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 条,你也可以更灵活。 这样 我们的 $results 数组中就储存了我们页面所需的所有数据。 好的,来看看我们的模版,是怎么输出的。 代码如下: 博客后台管理
以上只是显示数据,人人都会啊。 我们怎么操作这些数据呢? 操作,就像是一种控制能力。 学生时代踢足球,我对球场有一种很强的控制能力,大学足球比赛拿了1次冠军,1次亚军,1次季军,大四没去,中学更是无数荣誉。 我的位置是中卫,在足球场上,这个位置,你得有统观全局的能力,也得有很强的个人能力,还有指挥能力;扯的远了,现在天天坐在电脑前,这些东西也早就没了, 就剩下些经验之谈。不过其中滋味,你也须也体验过。 我这个博客有个缺点,每次你对数据库进行一次读写操作,你得刷新啊!我知道这对服务器的负载很大,但是我觉得如果一个新技术你没有完全吃透,盲目运用,只会适得其反。 所以暂时我还是牺牲服务器的响应时间,内存消耗,来获得一种相对的稳定! 所以我对全局还不是很了解,还有很多未知地领域没有涉入,如深入ajax,深入php,c 。。。 不多说了。 好了,看看怎么对数据进行CRUD 吧! DELETE 删除 当我们确认要删除时,这里有个注意的地方,我们能先要对该文档所属的分类下的 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 插入 代码如下: function newPost( )
{ $results['action'] = "newPost" ; $results['pageTitle'] = " Add New post" ; $results['newPost'] = "true"; $results['path'] = "随笔» 添加随笔" ; $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 方法时,我们并没有往模版中传入文档。 我们调用 post model中 的 storePostFormValues( ),storeDiaryFormValues( ); 记得嘛,这个方法把所有的表单内容放入一个数组,在做了基本的类型检查之后, 后面的部分大同小异, 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 快乐,嘿嘿。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |