网站开发-php开发手机论坛(5)-创建帖子(2)

上一篇我们说到前端的代码.在后台代码中我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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值