美工统筹SEO,为企业电子商务营销助力!
PHP仿博客园 小我博客(2) 数据库增加改删
一佰互联网站开辟设想(www.taishanly.com) 宣布日期 2020-04-29 09:02:35 阅读数: 117
简略先容一下这个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 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 欢愉,嘿嘿。