上一篇我们说到前端的代码.在后台代码中我include了一些代码,下面先讲一下这些代码的用处.
include('conn.php');//数据库连接
include('lib.php');//库函数,包括了一些常用函数和常量
include('ChromePhp.php');//chrome调试工具
conn.php(注意连接数据库的用户密码自己填写)
<?php
//连接数据库
$con=mysql_connect("localhost", "root", "");
if(!$con)
{
die("Could not connect: " .mysql_error());
}
//设定字符集
mysql_query("set character set 'utf8'");//读库
mysql_query("set names 'utf8'");//写库
//选择数据库
$db_selected = mysql_select_db("bidoubbs", $con);
if (!$db_selected)
{
die ("Can\'t use bidoubbs : " . mysql_error());
}
?>
上面是连接数据库的操作,每个函数都是php里面内置的,不懂直接google.因为每个函数的解释都比较长,我不可能一个个解释.基本的解释我写在注释里了.
lib.php
<?php
//定义常量.规定每页显示的帖子条数
$pagesize=3;
//默认头像路径
$default_cover='upload/07/21/2b5mpj.jpg';
// 显示时间格式化
function showtime($db_time)
{
$diftime = time() - $db_time;
if($diftime < 31536000)
{
// 小于1年如下显示
if($diftime>=86400)
{
return round($diftime/86400,1).'天前';
}else if($diftime>=3600)
{
return round($diftime/3600,1).'小时前';
}else if($diftime>=60)
{
return round($diftime/60,1).'分钟前';
}else
{
return ($diftime+1).'秒钟前';
}
}
else{
// 大于一年
return gmdate("Y-m-d H:i:s", $db_time);
}
}
//对表单输入数据进行处理
function format($data)
{
$data = trim($data);
$data = addslashes($data);
return $data;
}
//根据月日分计算并创建目录
function mk_dir()
{
$dir = date('m/d', time());
if(is_dir('upload/' .$dir)){
ChromePhp::log("目录存在");
return $dir;
}else{
mkdir('upload/'.$dir,0777,true);
ChromePhp::log($dir);
return $dir;
}
}
//获取文件后缀
function getExt($file)
{
$tmp = explode('.',$file);
return end($tmp);
}
//随机生成移动后的文件名
function randName()
{
$str = 'abcdefghijkmnpqrstwxyz23456789';
return substr(str_shuffle($str),0,6);
}
?>
定义常量和一些函数操作,具体作用见注释.
ChromePhp.php是Chrome Logger的使用时的引用文件,在代码里面直接调用Chromephp::log($var);就可以在安装了Chrome Logger的chrome浏览器的开发者控制台上看到输出的$var的值,是一个挺有用的调试工具.由于网页调试不同于软件调试,一般都是采用在页面上用print_r输出,但是这个用法会影响页面排版,所以chrome Logger算是一个比较好的调试方案.具体用法自行google.
最后我把创建帖子的后台操作代码附上,并且把解释放在代码中,请耐心点看.里面涉及到登陆验证的session和cookie,其实我是在最后才把登陆验证加上去的.不过最后的代码是要包括的,所以下一篇还是先讲一下登陆注册模块.
<?php
include('conn.php');//数据库连接
include('lib.php');//库函数,包括了一些常用函数和常量
include('ChromePhp.php');//chrome调试工具
//获取分类目录
session_start();
// Chromephp::log($_SESSION['uid']);
// Chromephp::log($_SESSION['name']);
//如果会话没有被设置,查看是否设置了cookie
$error="";
if(!isset($_SESSION['uid']))
{
if(isset($_COOKIE['uid'])&&isset($_COOKIE['name']))
{
//用cookie给session赋值
$_SESSION['uid']=$_COOKIE['uid'];
$_SESSION['name']=$_COOKIE['name'];
}
else
{
header("Location: login.php");
exit();
}
}
//处理浏览器的get请求
if($_SERVER['REQUEST_METHOD'] == 'GET')
{
//获取目录分类
$sql="select id, name from categories";
$query=mysql_query($sql);
while ($node=mysql_fetch_assoc($query)) {
$category[$node['id']]=$node['name'];
}
//释放变量内存
unset($node);
mysql_free_result($query);
//引入前端代码,显示页面
include("templates/create.php");
}
//点击提交按钮时对浏览器传过来的数据进行处理
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//farmat函数对用户输入进行处理.为了安全考虑
$title=format($_POST['title']);
$content=format($_POST['content']);
$classic=format($_POST['classic']);
//ChromePhp::log($classic);
//更新分类文章数量
if(empty($title) || empty($content) || empty($classic))
{
$sql="select id, name from categories";
$query=mysql_query($sql);
while ($node=mysql_fetch_assoc($query)) {
$category[$node['id']]=$node['name'];
}
unset($node);
mysql_free_result($query);
$error="请把信息补充完整.";
include("templates/create.php");
exit();
}
//更新该目录下文章的数量
$sql="update categories set articles = articles+1 where name = '$classic'";
$query=mysql_query($sql);
//ChromePhp::log($query);
$time=time();
$uid=$_SESSION['uid'];
//上传图片
//限制图片上传类型
if ($_FILES['img']['error'] ==0 && ($_FILES['img']['type']=="image/gif"
|| $_FILES['img']['type']=="image/jpeg" || $_FILES['img']['type']=="image/pjpeg"
|| $_FILES['img']['type']=="image/png"
))
{
//判断错误代码,=0则上传成功,!=0则上传失败
//处理上传过程
// ChromePhp::log("开始上传");
$img = $_FILES['img'];
//header("Location: templates/error.php") ;
//exit;
//拼接文件路径
$path ='upload/'.mk_dir().'/'.randName(). '.' .getExt($img['name']);
// ChromePhp::log($path);
//移动
if(move_uploaded_file($img['tmp_name'],$path)) {
//数据库插入帖子信息
mysql_query("INSERT INTO articles (uid,title, content, category, addtime, edittime, img_path)
VALUES ('$uid', '$title', '$content', '$classic', '$time', '$time', '$path')");
//获取帖子id
$query=mysql_query("select id from articles where title = '$title'");
$result=mysql_fetch_array($query);
$aid=$result['id'];
//跳转到帖子页面
header("Location: view.php?a=".$aid);
// ChromePhp::log($title);
//注意header之后要用exit()退出脚本,因为header之后的代码还会继续执行
exit();
} else{
// ChromePhp::log("上传失败");
}
}else
{
//如果帖子没有图片.
mysql_query("INSERT INTO articles (uid, title, content, category, addtime, edittime)
VALUES ('$uid','$title', '$content', '$classic', '$time', '$time')");
// $url = "http://blog.csdn.net/abandonship";
// echo "<script type='text/javascript'>";
// echo "window.location.href='$url'";
// echo "</script>";
$query=mysql_query("select id from articles where title = '$title'");
$result=mysql_fetch_array($query);
$aid=$result['id'];
header("Location: view.php?a=".$aid);
exit();
// ChromePhp::log($_FILES['img']['error']);
}
}
?>
上面代码的主要思路是
根据session获取用户信息->如果是get请求就引入前端代码->如果是post请求,就对数据进行处理,插入数据库,并且跳转到帖子页面.
注意:上面的代码并没有进行严格的安全验证.更多的关于后台代码的安全性请自行google.另外,现在我也挺理解为什么别人有些文章里面有些东西没有讲清楚,因为每个小的知识点都展开的话,估计可以写一本书了.所以我只提供一个总体的思路,具体的某些函数用法还是要自己google.