PHP 原生php语言实现博客功能
摘要
声明: 本人小白 一枚,新学php语言,想要搞些小demo练练手,此blog项目从网上发现,前端模板是现成的,用php写后台与前端进行交互,么得使用tp框架,分阶段进行实现,是学习,也是成长,一步一步的走,欢迎各位大佬提出宝贵意见~
环境: PHP7.3.6 + Apache24 + MySQL5.5.62
前端模板文件: 在这这这里!(8ybd)
功能板块
博客网站:首先得有个首页展示,展示一些博客,文章之类的其次文章分类 > 栏目,简单的一个分类
然后评论功能,文章有评论以及回复评论功能,什么点赞了之类的再说
继续是文章板块,文章是整个博客的主体,没文章内容,想要流量,不要想好不好
接着留言板块,看到你的作品了,给你留个言,吹个牛啥的
最后,干就完了
以下是功能构建图
数据库
**注释**:数据库我们使用 **MySQL5.5.2**,图形化管理工具使用 **Navicat**(环境有需要可以联系我yo)数据库建模:
// 建立我们的数据库blog
create database blog character set utf8 collate utf8_general_ci;
表结构: cat:栏目表,art:文章表,user:用户表,comment:评论表
// cat:栏目表
CREATE TABLE IF NOT EXISTS `cat` ( `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,`catname` char(30) NOT NULL DEFAULT '', `num` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`cat_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
// 插入三个测试栏目名称
INSERT INTO `cat` (`cat_id`, `catname`, `num`) VALUES (1, '人生', 0), (2, '哲学', 0), (3, '技术', 0);
// art:文章表
CREATE TABLE IF NOT EXISTS `art` ( `art_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `cat_id` smallint(5) unsigned DEFAULT '0', `user_id` int(10) unsigned DEFAULT '0', `nick` varchar(45) DEFAULT '', `title` varchar(45) DEFAULT '', `content` text, `pubtime` int(10) unsigned NOT NULL DEFAULT '0', `lastup` int(10) unsigned DEFAULT '0',`comm` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`art_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='文章表';
// comment:评论表
CREATE TABLE IF NOT EXISTS `comment` ( `comment_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `art_id` int(10) unsigned NOT NULL, `user_id` int(10) unsigned NOT NULL DEFAULT '0', `nick` varchar(45) NOT NULL DEFAULT '', `content` varchar(1000) NOT NULL DEFAULT '', `ip` int(10) unsigned NOT NULL DEFAULT '0', `pubtime` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`comment_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
// user:用户表
CREATE TABLE IF NOT EXISTS `user` ( `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL DEFAULT '', `nick` char(20) NOT NULL DEFAULT '', `email` char(30) NOT NULL DEFAULT '', `password` char(32) NOT NULL DEFAULT '', `lastlogin` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`user_id`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
注释: 这是个人第一阶段的项目结构
添加栏目
 *如何实现一个栏目的添加? html表单页面 -> 提交到php -> php接收post数据 -> insert 添加到数据库 -> 是否添加成功 ok or fail*数据库连接文件:conn.php (不用每次都在后台里进行连接数据库操作,简化操作)
<?php
/**
*conn.php 连接数据库
*/
$host = 'localhost';
$username = 'root';
$pwd = 'rootmysql';
$db_name = 'msg';
$conn = mysqli_connect($host,$username,$pwd,$db_name);
mysqli_query($conn,'SET NAMES UTF8');
if (!$conn) {
die ('数据库连接失败'.mysqli_error($conn));
}
/*
else {
echo '数据库连接成功';
}
*/
?>
前端页面:catadd.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="./css/reset.css">
<link rel="stylesheet" href="./css/adm.css">
</head>
<body>
<header>
<h1>Blog后台管理界面</h1>
</header>
<div id="main">
<div id="lside">
<aside>
<h4>栏目管理</h4>
<ul>
<li><a href="">栏目列表</a></li>
<li><a href="">添加栏目</a></li>
</ul>
</aside>
<aside>
<h4>文章管理</h4>
<ul>
<li><a href="">文章列表</a></li>
<li><a href="">发布文章</a></li>
</ul>
</aside>
<aside>
<h4>个人中心</h4>
<ul>
<li><a href="">修改密码</a></li>
<li><a href="">退出登陆</a></li>
</ul>
</aside>
</div>
<div id="rside">
<form action="catadd.php" method="post">
<div class="form-group">
<label>栏目名称:</label>
<p>
<input type="text" name="catname">
</p>
</div>
<div class="form-group">
<label> </label>
<p>
<button type="submit">提交</button>
</p>
</div>
</form>
</div>
</div>
<footer>
Copyright © 2019 · GeneratePresas · WordPress .Bayue
</footer>
</body>
</html>
后台文件:catadd.php
<?php
/**
* catadd.php 添加栏目
*/
require 'conn.php';
// 检测是否有数据提交
if (empty($_POST)){
// 展示前台页面
require './view/admin/catadd.html';
exit();
}
// 检测栏目是否为空
$catname = trim($_POST['catname']);
if (empty($catname)){
echo '栏目名不能为空';
exit();
}
// SQL 查询语句
$sql = "select count(*) from cat where catname='$catname'";
// 执行SQL语句
$res = mysqli_query($conn,$sql);
// 检查栏目名称是否重复 PHP:mysqli_fetch_row()方法
$count = mysqli_fetch_row($res)[0];
if ($count>=1) {
echo '该栏目名已存在,请重新输入';
exit();
}
// 添加栏目
$sql = "insert into cat(catname) values('$catname')";
$res = mysqli_query($conn,$sql);
if (!$res) {
echo mysqli_error($conn);
} else {
// echo "栏目添加成功!";
header("location:catlist.php");
}
?>
栏目列表
*查询所有栏目,查哪张表 -> 查出来的内容显示到模版上*前端页面:catlist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="./css/reset.css">
<link rel="stylesheet" href="./css/adm.css">
</head>
<body>
<header>
<h1>Blog后台管理界面</h1>
</header>
<div id="main">
<div id="lside">
<aside>
<h4>栏目管理</h4>
<ul>
<li><a href="">栏目列表</a></li>
<li><a href="">添加栏目</a></li>
</ul>
</aside>
<aside>
<h4>文章管理</h4>
<ul>
<li><a href="">文章列表</a></li>
<li><a href="">发布文章</a></li>
</ul>
</aside>
<aside>
<h4>个人中心</h4>
<ul>
<li><a href="">修改密码</a></li>
<li><a href="">退出登陆</a></li>
</ul>
</aside>
</div>
<div id="rside">
<table>
<tr>
<td>序号</td>
<td>栏目名称</td>
<td>文章数</td>
<td>操作</td>
<td>操作</td>
</tr>
<?php foreach($data as $k=>$v){?>
<tr>
<td><?php echo $v['cat_id'];?></td>
<td><?php echo $v['catname'];?></td>
<td><span class="badge"><?php echo $v['num'];?></span></td>
<td><a href="catdel.php?cat_id=<?php echo $v['cat_id'];?>">删除</a></td>
<td><a href="catup.php?cat_id=<?php echo $v['cat_id'];?>">编辑</a></td>
</tr>
<?php }?>
</table>
</div>
</div>
<footer>
Copyright © 2019 · GeneratePresas · WordPress .Bayue
</footer>
</body>
</html>
后台文件:catlist.php
<?php
/**
* catlist.php 栏目展示
*/
require 'conn.php';
// 查询语句
$sql = "select * from cat";
// 进行查询,取值 (值被全部取出来,没有分条)
$res = mysqli_query($conn,$sql);
// 建立二位数组 存储值
$data = array();
// 循环进行取一行值
while($row = mysqli_fetch_assoc($res)){
$data[] = $row;
}
//var_dump($data);
//exit();
// 引入前端文件
require './view/admin/catlist.html';
?>
删除栏目
将catlist.html中的删除按钮变为超链接,链接到 catdel.php,表单提交设置为 GET,先判断$_GET数组是否为空→参数cat_id是否为空→参数cat_id是否为数字→该栏目下是否有文章(artnum有值)栏目是否删除成功
前端页面:catlist.html
同上:catlist.html
后台文件:catdel.php
<?php
/**
*catdel.php 删除页面
*/
// 引入数据库连接文件
require("conn.php");
// 获取前端传递的参数 cat_id 使用全局变量$_GET 进行获取
$id = $_GET["cat_id"];
// echo "$id";
// 校对参数,输入非数字进行提示
if(!is_numeric($id)){
die("非法操作,请返回重试!");
}
// 校对参数,输入错误数字进行提示
// sql语句编写 在数据库中进行查询
$sql = "select count(*) from cat where cat_id = $id";
$res = mysqli_query($conn,$sql);
// 如果未查询出 则报错
if(!$res){
die(mysqli_error($conn));
}
// count函数 利用 mysqli_fetch_row进行数据组收集
$count = mysqli_fetch_row($res)[0];
// var_dump($count);
// exit();
// 如果$count<=0 那么数据库中不存在数据,若>0,数据中则存在数据
if($count<=0){
die("栏目不存在");
}/*else{
die("栏目存在");
}
*/
// 数据库中进行删除操作
$sql = "delete from cat where cat_id=$id";
$res = mysqli_query($conn,$sql);
if(!$res){
die(mysqli_error($conn));
}else{
header("location:catlist.php");
}
?>
编辑栏目
*点击catlist.html编辑按钮,跳转至catadd.html页面(因为编辑页面与新增页面同一个页面,只不过是编辑时出现了栏目名称),先判断$_GET数组是否为空→判断cat_id是否为空→判断cat_id是否为整型int→判断cat_id是否存在→判断修改是否成功* **前端页面:catlist.html**同上:catlist.html
后台文件:catup.php
<?php
/**
*catup.php
*/
require("conn.php");
// 获取栏目id :cat_id
$id = $_GET['cat_id'];
// 获取检测是否有数据提交
if(empty($_POST)){
//从数据库中取出数据
$sql ="select * from cat where cat_id=$id";
$res = mysqli_query($conn,$sql);
$row = mysqli_fetch_assoc($res);
//把数据嵌套在html页面内
require './view/admin/catup.html';
exit();
}
// 检测栏目是否为空
$catname = trim($_POST['catname']);
if (empty($catname)){
echo '栏目名不能为空';
exit();
}
// SQL 查询语句,执行SQL语句
$sql = "select count(*) from cat where catname='$catname'";
$res = mysqli_query($conn,$sql);
// 检查栏目名称是否重复 PHP:mysqli_fetch_row()方法
$count = mysqli_fetch_row($res)[0];
if ($count>=1) {
echo '该栏目名已存在,请重新输入';
exit();
}
// 修改操作:sql语句
$sql ="update cat set catname='$catname' where cat_id =$id";
$res = mysqli_query($conn,$sql);
if (!$res) {
echo mysqli_error($conn);
} else {
// echo "栏目修改成功!";
// 修改成功 跳转至栏目列表页面
header("location:catlist.php");
}
?>
踩到的坑~
1、从数据库中查询cat_id(栏目id) >>> 找到栏目名称(cat_name)展示到前端时 怎么也展示不了,后来发现因为粗心大意,忘记**echo** 显示出来 **展示在前端php代码格式**// 格式:在html中使用 foreach循环 进行打印
<?php foreach(){?>
<td>我是测试1<?php echo $v['cat_id'];?></td>
<td>我是测试2<?php echo $v['cat_id'];?></td>
<td>我是测试3<?php echo $v['cat_id'];?></td>
<?php }?>
2、访问的时候 直接访问 localhost/blog/index.php,因为前端页面都放在了view>admin下,会有疑问,会不会出现访问不了的问题以及样式无法展示出来
解答:因为在后台相对应的 php文件中,已经 require 引进了前端文件,所以大家就可劲造叭~