开发blog笔记(更新中) - JunMo博客

JunMo的博客

2019
记录生活
首页 » 学习笔记 » 开发blog笔记(更新中)

开发blog笔记(更新中)

终于把数据库的增删改查学完了,现在跟着教程来开发blog(想想还有点小激动呢)。

需求分析的原则:

抽象到具体,

由文字到表格,

由表格到图片,

逐步细化而来.

包括下面要讲的功能结构,

原型建模,都属于功能分析的一部分

 

Blog功能结构图

 

 Blog页面原型图

Blog数据库建模

这边他视频里面有提供我就直接导入了

写代码之前要规范代码

 

代码规范的意义:

1-便于排查 [缩进规范]

2-减少沟通成本,便于团队合作 [命名规范] 不这样写也是可以的,不会报错 类大驼峰,函数小驼峰

小驼峰法(camel方法)变量一般用小驼峰法标识。

第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,

例如:myFirstName、myLastName

 

大驼峰法(Upper Camel Case)也称为:帕斯卡命名法:(pascal方法)常用于类名,函数名,属性,命名空间。

相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。例如:public class DataBaseUser

 

组织项目文件

项目的文件/目录清晰有条理,有助于提高开发效率并减少错误. 我们按如下格式组织项目 在blog下新建如下目录

/css # 放置css文件
/images # 图片
/lib # 底层库文件
/log # 系统日志
/upload # 上传文件
/view # 模板目录
/front
/admin
index.php # 用户直接访问的php文件
art.php 

将css文件和html模版文件放入指定的位置

blog/index.php

包含首页文件

<meta charset="utf8">
<?php
include('./view/front/index.html');
?>

blog/catadd.php

栏目的增删改查,先从增开始 如何增加一个栏目 html表单页面 -> 提交到php -> php接收post数据 -> insert 添加到数据库 -> 是否添加成功 ok 

<?php
if(empty($_POST))//判断是否有值
{
	require('./view/admin/catadd.html');//没有数据代表直接访问加载文件
}
else
{
	include('./conn.php');//连接数据库
	
	$cat['catname'] = trim($_POST['catname']);//把值接受去空格掉存放在数组里
	
	if(empty($cat['catname']))//判断是否为空
	{
		exit("栏目不能为空");
	}
	/*检测栏目是否存在*/
	$sql="select count(*) from cat where catname='$cat[catname]'";
	$rs=@mysql_query($sql,$conn);
	$row=mysql_fetch_row($rs);
	
	if($row[0]<1)
	{
		/*不存在就添加栏目*/
		$sql ="insert into cat (catname) values ('$cat[catname]')";
		if(!mysql_query($sql,$conn))
		{
			exit('栏目插入失败');
		}
		else
		{
			echo '添加成功';
		}
	}
	else
	{
		exit("栏目已存在");
	}

}

?>

blog/catlist.php

<?php

include('./conn.php');//连接数据库

$sql="select * from cat";

$rs=@mysql_query($sql,$conn);//查询所有

$cat=array();

while($row=@mysql_fetch_assoc($rs))
{
	$cat[]=$row;//获取结果保存到$cat这个数组里面
}
require('./view/admin/catlist.html');//包含模板

?>

catlist.html

 <div id="rside">
            <table>
                <tr>
                    <td>序号</td>
                    <td>栏目名称</td>
                    <td>xxx</td>
                    <td>操作</td>
                </tr>
				<?php foreach($cat as $v) {?>//遍历数组
				<tr>
					<td><?php echo $v['cat_id'];?></td>//因为返回的是二维数组所以遍历返回的每一个数组中的cat_id并输出
					<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>|
						<a href="catedit.php?cat_id=<?php echo $v['cat_id'];?>">编辑</a></td>
					</tr>
				<?php }?>
				
            </table>
        </div>
    </div>

catdel.php

<?php

include('./conn.php');//连接数据库

$cat_id = @$_GET['cat_id'];

if(empty($cat_id))
{
	exit('栏目不得为空');
}

if(!is_numeric($cat_id))//判断是否为数字
{
	exit('栏目错误');
}

//栏目有文章,不能删除
$sql="select count(*) from art where cat_id=$cat_id";

$rs=mysql_query($sql,$conn);

$row=mysql_fetch_row($rs);

if($row[0]>=1)
{
	exit('该栏目下有文章不可以删除');
}

//查询栏目是否存在
$sql="select count(*) from cat where cat_id=$cat_id";

$rs=mysql_query($sql,$conn);

$row=mysql_fetch_row($rs);

if($row[0]==0)
{
	exit('栏目不存在');
}

//删除

$sql="delete from cat where cat_id=$cat_id";

$rs=mysql_query($sql,$conn);

if(!$rs)
{
	exit('删除失败');
}
else
{
	echo '删除成功';
	header("location:./catlist.php");
}


?>

catedit.html于catadd.html一致

只不过 栏目框里 应该显示原来的栏目名

catedit.php

if POST 为空 {
检测cat_id是否为数字
模板中展示栏目的旧信息
} else {
查询新栏目名是否为空字符串
修改栏目为新的栏目名
} 
<?php

include('./conn.php');//连接数据库

$cat_id=@$_GET['cat_id'];//接受id值

if(empty($_POST))//为空就是没有提交要修改的值只是查看页面
{
	$sql="select catname from cat where cat_id=$cat_id";//根据id查出栏目名
	$rs=@mysql_query($sql,$conn);
	$row=@mysql_fetch_row($rs);
	include('./view/admin/catedit.html');//包含
}
else
{
	$catname=trim($_POST['catname']);//判断新栏目名是否为空格
	if(empty($catname))
	{
		exit('栏目名不得为空');
	}
	else
	{
		$sql="update cat set catname='$catname' where cat_id=$cat_id";//修改栏目名根据id
		$rs=mysql_query($sql,$conn);
		if(!$rs)
		{
			exit('修改失败');
		}
		else
		{
			header("location:./catlist.php");
		}
	}
}

?>

将 mysql.php 用于我们的 catadd.php blog/catadd.php

<?php

if(empty($_POST))//判断是否有值
{
	require('./view/admin/catadd.html');//没有数据代表直接访问加载文件
}
else
{
	include('./conn.php');//连接数据库
	
	include('./lib/mysql.php');
	
	$cat['catname'] = trim($_POST['catname']);//把值接受去掉空格存放在数组里
	
	if(empty($cat['catname']))//判断是否为空
	{
		exit("栏目不能为空");
	}
	/*检测栏目是否存在*/
	$sql="select count(*) from cat where catname='$cat[catname]'";
	
	if(mGetOne($sql)<1)
	{
		/*不存在就添加栏目*/
		if(!mExec('cat',$cat))
		{
			exit('栏目插入失败');
		}
		else
		{
			echo '添加成功';
		}
	}
	else
	{
		exit("栏目已存在");
	}

}




?>

改底层的mysql.php显然是不妥的. 这些易于变动的参数,我们应该以一个变量,配置文件的形式存储起来 这种直接写死在库文件的写法,称之为 --> 硬编码 (不推荐) 我们应在做一个配置文件,就叫

config.php blog/lib/config.php

return array(
'host'=>'localhost',
'user'=>'root',
'password'=>'',
'db'=>'blog',
'charset'=>'utf8'
); 

将config.php 引入 mysql.php blog/lib/mysql.php

function mConn() {
//静态变量使得 mConn在同一个页面 数据库值只连接一次
static $conn = null;
if($conn === null) {
$cfg = include('./config.php');
$conn = mysql_connect($cfg['host'],$cfg['user'],$cfg['password']);
mysql_query('use '.$cfg['db'] , $conn);
mysql_query('set names '.$cfg['charset'] , $conn);
}
re

思考

catadd.php include(./lib/mysql.php) 而mysql.php 里面引入的是 ./config.php 我们运行 catadd.php 发现,找不到config.php 因为当前目录没有config.php 所以我们要将 mysql.php中 改为 include(./lib/config.php) 但是当我们网站很大,目录很多,层次很深,这样来回引入肯定出错 不要用相对路径,用绝对路径 --> 初始化文件 初始化文件: 初始化当前的环境信息,计算当前网站的据对路径在哪 blog/lib/init.php

魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的 只有在加载了这些扩展库时才会出现 或者动态加载后,或者在编译时已经包括进去了 有八个魔术常量它们的值随着它们在代码中的位置改变而改变。 例如 LINE 的值就依赖于它在脚本中所处的行来决定 这些特殊的常量不区分大小写 它的值,具体取决于就写在哪个文件里,它不会受包含影响 

初始化文件 blog/lib/init.php

<?php
header('Content-type:text/html;charset=utf8');

define('DIR',dirname(__DIR__));//定义绝对路径

require(DIR.'/lib/mysql.php');//包含Mysql函数

?>

将其他文件的路径修改成绝对路径

blog/catlist.php

<?php

include('./lib/init.php');

$sql="select * from cat";

$cat=array();

$cat=mGetAll($sql);

require(DIR.'/view/admin/catlist.html');//包含模板

?>

封装提示函数

当栏目发布成功或失败的时候,我们直接echo,风格过于简洁 用模版显示出来,更我们网站的风格更相似一些 info.html 我们根据if判断,看到底是显示成功还是失败 blog/lib/func.php 我们将提示函数放在func.php里面,因为它不是mysql系列函数,性质不同 我们再写一个函数库,跟mysql无关的函数放在这个里面,当然我们网站如果足够大,肯定会有多个这样的函数库

<?php

function succ($res)
{
	$result='succ';
	@require(DIR.'/view/admin/info.html');
	exit();
}

function error($res)
{
	$result='fail';
	@require(DIR.'/view/admin/info.html');
	exit();
}

?>
<div id="rside">
			<?php  if($result=='succ') {?>
            <div class="succ"><?php echo $res;?></div><?php } else if($result=='fail'){?>
            <div class="danger"><?php echo $res;?></div><?php }?>
        </div>

调试技巧

在php运行中,sql有时会出差,出错好办,只要我们能看到错误; 我们封装了大量函数,sql可以自动执行,我们眼睛不能直观看到执行的sql 写一个日志功能,记录我们的sql语句 正常sql只记录sql语句,出错的sql不仅记录sql还要记录出错的信息 所有的sql都是经过 mQuery($sql) 执行的 file_put_contents — 将一个字符串写入文件

function mQuery($sql)
{
	$rs=mysql_query($sql,mConn());
	
	if($rs)
	{
		mLog($sql);
	}
	else
	{
		mLog($sql."\r\n".mysql_errno());
	}
	return $rs;
}

function mLog($str)
{
	$filename=DIR.'/log/'.date('Ymd').'.txt';
	
	$log="----------------------------------
-----------\r\n".date('Y/m/d H:i:s')."\r\n".$str."\r\n".'----------------------------------
-----------'."\r\n\r\n";
	
	return file_put_contents($filename,$log,FILE_APPEND);
} 

 

输出的结果

---------------------------------------------
2019/06/20 08:44:42
select catname from cat where cat_id=8
--------------------------------------------- 

 

文章发布

blog/artadd.php

<?php
include('./lib/init.php');

$sql="select * from cat";
$cats=mGetAll($sql);

if(empty($_POST))
{
	require(DIR.'/view/admin/artadd.html');
}
else
{

	$art['title']=trim($_POST['title']);
	if(empty($art['title']))
	{
		error('标题不得为空');
	}
	
	$art['cat_id'] = $_POST['cat_id'];
	if(!is_numeric($art['cat_id'])) 
	{
	error('栏目不为数字');
	}

	$art['content']=trim($_POST['content']);
	if(empty($art['content']))
	{
		error('内容不得为空');
	}
	
	$art['pubtime']= time();

	if(!mExec('art',$art))
	{
		error('添加失败');
	}
	else
	{
		header('Location:artlist.php');
	}

}

?>

blog/artadd.html

 <select name="cat_id">
			<?php foreach($cats as $v) {?>
                                    <option value="<?php echo $v['cat_id'];?>"><?php echo $v['catname'];?></option>
			<?php }?>
	</select>

blog/artlist.php

<?php

require('/lib/init.php');

$sql="select art_id,art.cat_id,title,pubtime,comm,catname from art left join cat on art.cat_id=cat.cat_id";

$arts=mGetAll($sql);

include(DIR.'/view/admin/artlist.html');

?>

blog/artlist.html

 <?php foreach($arts as $v) {?>
                <tr>
                    <td><?php echo @$v['art_id'];?></td>
                    <td><?php echo date('Y/m/d',@$v['pubtime']);?></td>
                    <td><a href="#"><?php echo @$v['title'];?></a></td>
                    <td><?php echo @$v['catname'];?></td>
                    <td><span class="badge"><?php echo @$v['comm'];?></span></td>
                    <td>
						<a href='artedit.php?art_id=<?php echo $v['cat_id'];?>'>编辑</a>|
						<a href='artdel.php?art_id=<?php echo $v['cat_id'];?>'>删除</a>
						
					</td>
                </tr>
					<?php }?>

artdel.php

<?php

require('./lib/init.php');

$art_id=@$_GET['art_id'];

if(!is_numeric($art_id))//判断是否为数字
{
	error('参数错误');
	exit();
}


//查询是否存在该文章

$sql="select count(*) from art where art_id=$art_id";

if(mGetOne($sql)<=0)
{
	error('没有该文章');
	exit();
}
$sql="delete from art where art_id=$art_id";

if(!mQuery($sql))
{
	error("执行失败");
}
else
{
	succ('删除成功');
	header('Location:artlist.php');
}


?>

文章编辑功能

artedit.html

<label>标题:</label>
                    <p>
                        <input type="text" name="title" value='<?php echo $art['title'];?>'>
                    </p>
                </div>
                <div class="form-group">
                    <label>栏目:</label>
                    <p>
					      <select name="cat_id">
					<?php foreach($cats as $v) {?>
                            <option value="<?php echo $v['cat_id'];?>"
								<?php if($v['cat_id']==$art['cat_id']) {?>
								selected='selected'
								<?php }?>
								>	
								<?php echo $v['catname'];?>
							</option>
							<?php }?>
						</select>
                    </p>
                </div>
                <div class="form-group">
                    <label >内容:</label>
                    <p>
                        <textarea name="content"><?php echo $art['content'];?></textarea>
                    </p>
                </div>
                <div class="form-group">
                    <label>标签:</label>
                    <p>
                        <input type="text" name="tags" value='<?php echo $tags;?>'>
                    </p>
                </div>
                <div class="form-group">
                    <label>&nbsp;</label>
                    <p>
                        <button type="submit">提交</button>
                    </p>
                </div>

artedit.php

<?php

include('./lib/init.php');

$art_id=@$_GET['art_id'];

if(empty($_POST))
{

	if(!is_numeric($art_id))//判断是否为数字
	{
		error('参数错误');
		exit();
	}

	//查询是否存在该文章

	$sql="select count(*) from art where art_id=$art_id";

	if(mGetOne($sql)<=0)
	{
		error('没有该文章');
		exit();
	}

	$sql="select * from cat";

	$cats=mGetAll($sql);
	
	$sql="select * from art where art_id=$art_id";
	
	$art=mGetRow($sql);
	
	$sql="select tag from tag where art_id=$art_id";
		
	$tag = mGetAll($sql);
	
	$tags='';	
	
	foreach($tag as $t)
	{
		$tags .= $t['tag'].',';
	}
	
	$tags = rtrim($tags,',');
	
	print_r($tags);
	
	include(DIR.'/view/admin/artedit.html');
}
else
{	  // 检测art_id是否为数字
		if( !is_numeric($art_id) ) {
		error('参数有误');
		}
		//检测标题
		$art['title'] = trim($_POST['title']);
		if(empty($art['title'])) {
		error('标题不能为空');
		}
		//检测栏目
		$art['cat_id'] = $_POST['cat_id'];
		if(!is_numeric($art['cat_id'])) {
		error('栏目不为数字');
		}
		//检测内容
		$art['content'] = trim($_POST['content']);
		if(empty($art['content'])) {
		error('内容不能为空');
		}
		//查询是否有这篇文章
		$sql = 'select count(*) from art where art_id=' . $art_id;
		// 没这篇文章
		if(!mGetOne($sql)) {
		error(mysql_error());
		}
		$art['lastup'] = time();
		//发布文章
		if(!mExec('art',$art,'update','art_id='.$art_id)) {
		//echo mysql_error();
		error('文章修改失败');
		} else{
		succ('文章修改成功');
		}
}

?>

 首页开发

blog/index.php

<?php 

require('./lib/init.php');

$sql='select catname from cat';

$cats=mGetAll($sql);

$sql='select title,content,pubtime,comm,catname from art inner join cat on art.cat_id=cat.cat_id';

$arts=mGetAll($sql);

require('/view/front/index.html')

?>

index.html

?php foreach($arts as $k){?>
            <article>
                <h2><a href="#"><?php echo $k['title'];?></a></h2>
                <div class="entry_header">
                    <time><?php echo date('Y/m/d',$k['pubtime']);?></time>
                    by
                    <a href="#">十八</a>
                    <a class="catlink" href="#"><?php echo $k['catname'];?></a>
                    <a class="comment" href="#"><? echo $k['comm'];?>条评论</a>
                </div>
                <div class="entry_content">
                    <p><?php echo $k['content'];?>
                    </p>
                </div>
            </article>
			<?php }?>
    <aside>
                <h4>栏目列表</h4>
                <ul>
				<?php foreach($cats as $k) {?>
				
                    <li><a href=""><?php echo $k['catname']?></a></li>
					
						<?php }?>
                </ul>
            </aside>
            <aside>

文章页开发

查询文章 mGetRow 查询栏目 如果没有此文章 跳转首页

art.php

<?php
require('./lib/init.php');

$art_id=$_GET['art_id'];

	if(!is_numeric($art_id))
	{
		header('location: index.php');
	}

$sql="select count(*) from art where art_id=$art_id";

if(mGetOne($sql)==0)
{
	header('location: index.php');
}

$sql="select title,content,pubtime,catname,comm from art inner join cat on art.cat_id=cat.cat_id where art_id=$art_id";

$art=mGetRow($sql);

if(!empty($_POST))
{
	$comm['nick']=trim($_POST['nick']);

	$comm['email']=trim($_POST['email']);
		
	$comm['content']=trim($_POST['content']);

	$comm['art_id']=$art_id;
	
	$comm['pubtime']=time();
	
	$rs=mExec('comment',$comm);

	if($rs)
	{
		$ref=$_SERVER['HTTP_REFERER'];//获取上个页面
		header("Location: $ref");
	}

}

$sql="select * from comment where art_id=$art_id";

$comm=mGetAll($sql);

require(DIR.'/view/front/art.html');
?>

art.html

<article>
                <h2><a href="#">午后的街头</a></h2>
                <div class="entry_header">
                    <time><?php echo date('Y/m/d',$art['pubtime']);?></time>
                    by
                    <a href="#">十八</a>
                    <a class="catlink" href="#"><?php echo $art['catname'];?></a>
                    <a class="comment" href="#"><?php echo $art['comm'];?>条评论</a>
                </div>
                <div class="entry_content">
                    <p>
					   <?php echo $art['content'];?>
                    </p>
                </div>
            </article>
            <div id="comments">
				<?php foreach($comm as $k){?>
                <ol>
                    <li>
                        <img src="https://secure.gravatar.com/avatar/582b66ad5ae1b69c7601a990cb9a661a?s=50&d=identicon&r=pg" alt="">
                        <cite><a href="#"><?php echo $k['nick'];?></a></cite> <br>
                        <time><?php echo date('Y年m月d日 H时i分',$k['pubtime']);?></a></time>
                    </li> 
                    <li>
                        <?php echo $k['content'];?>
                    </li>
                </ol>
				<?php }?>
            </div>
            <div id="respond" class="comment-respond">
                <h3>Leave a Comment</h3>
				<?php if( isset($rs) && ($rs === false) ) {?>
					<h4 style="color:red;">评论失败</h4>
				<?php }?>

首页评论数优化及标签优化

artadd

<?php
include('./lib/init.php');

$sql="select * from cat";
$cats=mGetAll($sql);

if(empty($_POST))
{
	require(DIR.'/view/admin/artadd.html');
}
else
{

	$art['title']=trim($_POST['title']);
	if(empty($art['title']))
	{
		error('标题不得为空'); 
	}
	
	$art['cat_id'] = $_POST['cat_id'];
	if(!is_numeric($art['cat_id'])) 
	{
	error('栏目不为数字');
	}

	$art['content']=trim($_POST['content']);
	if(empty($art['content']))
	{
		error('内容不得为空');
	}
	
	$art['pubtime']= time();
	
	$art['arttag']=trim($_POST['tag']);

	if(!mExec('art',$art))
	{
		error('添加失败');
	}
	else
	{
		$art['tag']=trim($_POST['tag']);
		
		if($art['tag']=='')
		{
			$sql="update cat set num=num+1 where cat_id=$art[cat_id]";
			
			mQuery($sql);
			
			header('Location:artlist.php');//无标签文章添加成功跳转
		}
		else
		{
			$art_id=getLastId();//取上一次操作成功的id
			$sql="insert into tag(art_id,tag) values";
			$tag=explode(',',$art['tag']);
			
			foreach($tag as $v)
			{
				$sql.="(".$art_id.",'".$v."'),";
			}
			$sql=rtrim($sql,",");
			
			if(mQuery($sql))
			{
				header('Location:artlist.php');//添加成功跳转
				$sql="update cat set num=num+1 where cat_id=$art[cat_id]";
			
				mQuery($sql);
			}
			else
			{
				//标签添加失败删除文章输出添加失败
				$sql="delete from art where art_id=$art_id";
				
				if(mQuery($sql))
				{
					$sql="update cat set num=num+1 where cat_id=$art[cat_id]";
			
					mQuery($sql);
					error("文章添加失败");
				}
			}
		}
	}

}




?>

artedit.php

<?php

include('./lib/init.php');

$art_id=@$_GET['art_id'];

if(empty($_POST))
{

	if(!is_numeric($art_id))//判断是否为数字
	{
		error('参数错误');
		exit();
	}

	//查询是否存在该文章

	$sql="select count(*) from art where art_id=$art_id";

	if(mGetOne($sql)<=0)
	{
		error('没有该文章');
		exit();
	}

	$sql="select * from cat";

	$cats=mGetAll($sql);
	
	$sql="select * from art where art_id=$art_id";
	
	$art=mGetRow($sql);
	
	$sql="select tag from tag where art_id=$art_id";
		
	$tag = mGetAll($sql);
	
	$tags='';	
	
	foreach($tag as $t)
	{
		$tags .= $t['tag'].',';
	}
	
	$tags = rtrim($tags,',');
	
	include(DIR.'/view/admin/artedit.html');
}
else
{	  // 检测art_id是否为数字
		if( !is_numeric($art_id) ) {
		error('参数有误');
		}
		//检测标题
		$art['title'] = trim($_POST['title']);
		if(empty($art['title'])) {
		error('标题不能为空');
		}
		//检测栏目
		$art['cat_id'] = $_POST['cat_id'];
		if(!is_numeric($art['cat_id'])) {
		error('栏目不为数字');
		}
		//检测内容
		$art['content'] = trim($_POST['content']);
		if(empty($art['content'])) {
		error('内容不能为空');
		}
		//查询是否有这篇文章
		$sql = 'select count(*) from art where art_id=' . $art_id;
		// 没这篇文章
		if(!mGetOne($sql)) {
		error(mysql_error());
		}
		$art['lastup'] = time();
		//发布文章
		if(!mExec('art',$art,'update','art_id='.$art_id)) {
		//echo mysql_error();
		error('文章修改失败');
		} else{
			$tag=$_POST['tag'];
			if(empty($tag))
			{
				succ('文章修改成功');
			}
			else
			{
				$sql="delete from tag where art_id=$art_id";
				
				mQuery($sql);//删除原来的标签
				$tag = explode(',',$tag);
				$sql = "insert into tag (art_id,tag) values ";
				foreach ($tag as $v) 
				{
					$sql .= "(".$art_id . ",'".$v."'),";
				}
				$sql = rtrim($sql,',');
				
				if(mQuery($sql))
				{
					succ('文章修改成功');
				}

				
			}	
		
		}

	
}


?>

获取用户IP

function getIp()
{
	static $ip=null;//定义静态变量
	
	if($ip!==null)//防止反复调用
	{
		return $ip;
	}
	@$ip = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
	@$ip = ($ip) ? $ip : $_SERVER["REMOTE_ADDR"];
	
	return $ip;
}

ip2long — 将一个IPV4的字符串互联网协议转换成数字格式

打印sql发现IP变成了负数 php是有符号的,而数据库的IP是unsigned 无符号 使用spring转换成无符号

$comm['ip']=sprintf('%u',ip2long(getIP()));

 如何生成页码 limit 12345 23456 34567 当前页应该是居中的 假设当前页是 curr 一共显示5个页码 curr-2 curr-1 curr curr+1 curr+2 页码最大可以大到: 总文章数[$num]/每页显示数[$cnt] ceil — 进一法取整

func.php

/*
*生成页码
*@param int $num 文章总数
*@param int $curr 当前显示的页码数
*@param int $cnt 每页显示的条数
*/

function getPage($num,$curr,$cnt)
{
	$max=ceil($num/$cnt);//最大页码数,向上取整
	
	$left=max(1,$curr-2);//最左侧页码
	
	$right=min($left+4,$max);
	
	$left=max(1,$right-4);

	$page=array();

	for($i=$left;$i<=$right;$i++)
	{
		$_GET['page']=$i;
		$page[$i]=http_build_query($_GET);
	}
	return $page;
}

 index.php

<?php 

require('./lib/init.php');

//查询所有的栏目
$sql = "select cat_id,catname from cat";
$cats = mGetAll($sql);


//判断地址栏是否有cat_id
//$cat_id = isset($_GET['cat_id']) ? $_GET['cat_id'] : '';
if(isset($_GET['cat_id'])) {
	$where = " and art.cat_id=$_GET[cat_id]";
} else {
	$where = '';
}

//分页代码
$sql = "select count(*) from art where 1" . $where;//获取总的文章数
$num = mGetOne($sql);//总的文章数

$curr = isset($_GET['page']) ? $_GET['page'] : 1;//当前页码数
$cnt = 2;//每页显示条数
$page = getPage($num , $curr, $cnt);


//查询所有的文章
$sql = "select art_id,title,content,pubtime,comm,catname from art inner 
join cat on art.cat_id=cat.cat_id where 1" . $where . ' order by art_id desc limit ' . ($curr-1)*$cnt . ',' . $cnt;

$arts = mGetAll($sql);


require(DIR . '/view/front/index.html');


?>

评论列表

commlist.php

<?php

require('/lib/init.php');

$sql="select * from comment";

$comms=mGetAll($sql);

require(DIR.'/view/admin/commlist.html');

?>

commlist.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>content</td>
                    <td>IP</td>
					<td>操作</td>
                </tr>
                	<?php foreach($comms as $v) {?>
                <tr>
                    <td><?php echo @$v['comment_id'];?></td>
                    <td><?php echo date('Y/m/d',@$v['pubtime']);?></td>
                    <td><a href="#"><?php echo @$v['nick'];?></a></td>
                    <td><?php echo @$v['email'];?></td>
                    <td><span class="badge"><?php echo @$v['content'];?></span></td>
					 <td><?php echo @long2ip($a['ip'])?></td>
                    <td>
						<a href='commdel.php?comment_id=<?php echo $v['comment_id'];?>'>删除</a>
						
					</td>
                </tr>
					<?php }?>
            </table>
            <div id="pagebar">
                Pages:&nbsp;
                <a href="#">1</a>
                <a href="#">2</a>
                <a href="#">3</a>
                4
                <a href="#">5</a>
                <a href="#">6</a>
            </div>
        </div>
    </div>
    <footer>
        Copyright &copy; 2015 · GeneratePress · WordPress
    </footer>
</body>
</html>

commdel.php

<?php

require('/lib/init.php');

$comment_id=$_GET['comment_id'];

$sql = 'select art_id from comment where comment_id=' . $comment_id;
$art_id = mGetOne($sql);


if(empty($comment_id))
{
	error('comment_id不得为空');
}
else if(!is_numeric($comment_id))
{
	error('栏目错误');
}

$sql="select count(*) from comment where comment_id=$comment_id";

$rs=mGetOne($sql);

if($rs==0)
{
	error('评论不存在不存在');
}

$sql="delete from comment where comment_id=$comment_id";

if(mQuery($sql))
{
	if($art_id)
	{
		$sql = 'update art set comm=comm-1 where art_id=' . $art_id;
		mQuery($sql);
	}

	header('location: commlist.php');
}
else
{
	error('删除失败');
}



?>

文件上传讲解

文件上传的过程 PHP的上传非常简单,只需要写好表单并提交,则文件会"自动"传送到服务器上.

上传文件的相关信息存储在$_FILES超级全局数组里中. 因此,我们只需要从$_FILES中读出文件在哪儿,叫什么,

再把该文件移动到我们想要保存的位置,上传就完成了.

表单的写法 要注意3点 form的method要为post类型 form一定要加enctype=multipart/form-data input为file类型 下面是一个典型的上传表单 1.html

<form action="1.php" method="post" enctype="multipart/form-data">
<p><input type="file" name="pic" /></p>
<p><input type="submit" value="提交" /></p>
</form>

$_FILES数组讲解

临时文件,我们去找是找不到的,因为在我们php代码运行到最后一行,结束掉,这个文件就不存在了.所以我们需要在结束前,将这个文件
转移到别的地方去.
如何移动这个文件?
move_uploaded_file — 将上传的文件移动到新位置

move_uploaded_file($_FILES['pic']['tmp_name'],'./'.$_FILES['pic']['name']))?'ok':'fail';

生成随机文件名并按日期存储

<?php

$fname=rand(10000,99999);//生成随机数

$ext=strrchr('.',$_FILES['pic']['name']);//获取文件后缀名

$path='./upload/'.date('Y/m/d');//日期拼接路径

if(!is_dir($path))//判断目录是否存在
{
	mkdir($path,0777,true);//创建目录
}

echo move_uploaded_file($_FILES['pic']['tmp_name'],$path.'/'.$fname.$ext)?ok:fill;


?>

文件上传应用于项目

substr — 返回字符串的子串

str_shuffle — 随机打乱一个字符串 封装函数

封装函数

func.php

/*
*生成随机字符串
*@param int $num 生成的字符串个数
*@return str 生成的字符串 
*/

function randStr($num=6)
{
	$str=str_shuffle('abcdefghijklmnopqrstupwvsyzABCDEFGHIJKLOMNIPQRSTUPWVSYZ0123456789');//打乱字符串
	return $str=substr($str,0,$num);
}

/*
创建连级目录,返回相对路径

*/

function createDir()
{
	$path = '/upload/'.date('Y/m/d');
	$abs = DIR . $path;
	if( is_dir($abs) || mkdir($abs , 0777 , true) ) 
	{
		return $path;
	} 
	else 
	{
		return false;
	}
}

/*
*获取文件后缀
*@param str $filename 文件名
*@return str 文件名的后缀带点
*/

function getExt($filename)
{
	return strrchr($filename,'.');
}

artadd.html

<form action="" method="post" enctype="multipart/form-data">
<div class="form-group">
<label>图片:</label>
<p>
<input type="file" name="pic">
</p>
</div>

我们上传了图片,也保存下来了,如何存到数据库中? 在我们移动图片的时候, 应该将图片的目录记录并保存在数据库中 给art表加一个pic字段来保存图片的路径

sql语句:

alter table art add pic varchar(100) not null default '' after content;

artadd.php

if(!empty($_FILES) && $_FILES['pic']['error'] == 0) 
	{
		$filename = createDir().'/'.randStr().getExt($_FILES['pic']['name']);
		move_uploaded_file($_FILES['pic']['tmp_name'] , DIR.$filename);
		$art['pic']=$filename;
	}

将图片显示在文章页面

art.html

<?php if(isset($art['pic'])){?>
					<img src="<?php echo './.'.$art['pic'];?>">
				<?php } ?>

引入GD库 注意: 在PHP中,有些功能是核心功能,如数组及数组函数,默认就有这些函数; 有一些功能则是扩展功能,需要引入扩展才能用,如mysql_*函数,pdo,gd 在windows下,扩展一般是.dll文件,linux下一般以.so文件 打开php包中ext目录,就可看见各种扩展

打开该php.ini,搜索相应的dll,并取消行首的";" 例: ... ;extension=php_gd2.dll

;extension=php_gd2.dll

改为
extension=php_gd2.dll

4:重启apache

在GD库画图的时候,它的参数非常多,最多可达11个.所以,gd库千万不要死记硬背它的参数.要着重理解它的画图流程 知道大的流程,参数不会,我们可以翻手册查看 用windows画图板画图,体会画图步骤 1. 新建空白画布(指定宽高) 2. 创建颜料 3. 画图形(椭圆,矩形,直线等),或写字 4. 输出/保存图形 5. 销毁画布(关闭画板

<?php

//新建画布指定宽高
$pic=imagecreatetruecolor(200,300);

//创建颜料
$red=imagecolorallocate($pic,1,1,255);

//画椭圆
imageellipse($pic,100,150,200,300,$red);

//输出保存
imagepng($pic,'./2.png');

//销毁画布
imagedestroy($pic);

?>

观察思考(时间 20分钟,能找到相应函数即可):

1. 图片默认底色是什么颜色,如何填充背景色?

2. 如何在图片上文字,如何生成验证码?

3. 如何用现有的一张图做画布?

4. 如何生成缩略图?

5. 如何加水印

色彩填充

imagefill — 区域填充

填充区域颜色函数的特点

<?php

//新建画布指定宽高
$pic=imagecreatetruecolor(201,300);

//创建颜料
$red=imagecolorallocate($pic,1,1,255);
$bai=imagecolorallocate($pic,1,255,1);

//画椭圆
imageellipse($pic,100,150,200,300,$red);

//填充颜色
imagefill($pic,100,10,$bai);

//输出保存
imagepng($pic,'./2.png');

//销毁画布
imagedestroy($pic);

?>

验证码

验证码--其实就是制作一张有随机字母+数字的图片

准备工作:

生成随机字符串的函数randStr(); imagestring()函数 imagestring — 水平地画一行字符串

<?php

/*
*生成随机字符串
*@param int $num 生成的字符串个数
*@return str 生成的字符串 
*/

function randStr($num=6)
{
	$str=str_shuffle('abcdefghijklmnopqrstupwvsyzABCDEFGHIJKLOMNIPQRSTUPWVSYZ0123456789');//打乱字符串
	return $str=substr($str,0,$num);
}

//新建画布指定宽高
$pic=imagecreatetruecolor(80,50);

//创建颜料
$red=imagecolorallocate($pic,255,0,0);
$blue=imagecolorallocate($pic,127,127,127);

//填充画布
imagefill($pic,0,0,$red);

imagestring($pic,1,0,0,randStr(),$blue);

//输出图像
header('Content-type:image/png');
imagepng($pic);

/*输出保存
imagepng($pic,'./2.png');
*/


//销毁画布
imagedestroy($pic);



?>

缩略图与水印 原理: 把一张大画布复制到一块小画布上,水印有透明效果

函数: imagecreatefrompng — 由文件或URL创建一个新图象

imagecreatefromjpeg — 由文件或URL创建一个新图象

imagecopymerge — 拷贝并合并图像的一部分

1.分别将大,小图创建画布2个画布 2个参数

2.读取小画布,从一个确定点,截取一定的宽高 4个参数

3.将小图画布粘贴到大图的上,从一个确定点开始粘,小图粘贴后的透明度 3个参数

加水印代码

<?php

$big=imagecreatefromjpeg('./2.jpg');//通过jpg图片来创建画布大图
$small=imagecreatefrompng('./2.png');//通过png图片来创建画布小图

list($w,$h)=getimagesize('./2.png');//获取小图的宽高
list($w1,$h1)=getimagesize('./2.jpg');//获取大图的宽高

$w1=$w1-$w;//大图减小图得到右下角x位置
$h1=$h1-$h;//大图减小图得到右下角y位置

/*第一个参数为目标图,第二个为要移动的图,第三四个是移动到大图的哪一个位置,第五六个是从哪里开始移动小图,第七八个是移动大小第九个是透明度*/

imagecopymerge($big,$small,$w1,$h1,0,0,$w,$h,40);

imagepng($big,'t2.png');

imagedestroy($big);
imagedestroy($small);

?>

缩略图

将大图,设定一个原点,宽高裁剪,粘贴到小图上

从小图的原点,粘贴一定的宽高.大图会自适应放入小图的矩形中

imagecopyresampled — 重采样拷贝部分图像并调整大小

<?php

$pic=imagecreatefromjpeg('./2.jpg');//创建画布

list($w,$h)=getimagesize('./2.jpg');//获取宽高

$small=imagecreatetruecolor($w/2,$h/2);//把原来的大小除2
/*
imagecopyresampled(目标图,原图,目标图x,目标图y,原图x,原图y,目标图宽,目标图高,原图宽,原图高)
*/
imagecopyresampled($small,$pic,0,0,0,0,$w/2,$h/2,$w,$h);

imagepng($small,'./3.png');//输出保存

imagedestroy($pic);
imagedestroy($small);
?>

博文发布之缩略图

func.php

function makeThubm($oimg,$sw=200,$sh=200)
{
	//缩略图存放的路径和文件名称
	$simg=dirname($oimg).'/'.randStr().'.png';
	
	//获取大图和缩略图的绝对路径
	$opath=DIR.$oimg;//原
	$spath=DIR.$simg;//缩
	
	//创建小画布
	$spic=imagecreatetruecolor($sw,$sh);
	
	//创建白色
	$white=imagecolorallocate($spic,255,255,255);
	imagefill($spic,0,0,$white);
	
	//获取大图信息
	list($bw,$bh,$btype)=getimagesize($opath);
	
	$map = array
	(
		1=>'imagecreatefromgif ',
		2=>'imagecreatefromjpeg',
		3=>'imagecreatefrompng',
		6=>'imagecreatefromwbmp',
		15=>'imagecreatefromwbmp'
	);

	if(!isset($map[$btype]))
	{
		return false;
	}
	$opic=$map[$btype]($opath);//获取原图资源
	
	//计算缩略比
	$rate=min($sw/$bw,$sh/$bh);
	$zw=$bw*$rate;//最终返回的小图宽
	$zh=$bh*$rate;//最终 返回的小图高
	
	imagecopyresampled($spic,$opic,($sw-$zw)/2,($sh-$zh)/2,0,0,$zw,$zh,$bw,$bh);
	
	imagepng($spic,$spath);//把小图输出
	
	imagedestroy($spic);
	imagedestroy($opic);
	
	return $simg;//返回小图的相对路径
} 

art表添加缩略图字段

alter table art add thumb varchar(50) not null default '' after pic;

artadd.php

if(!empty($_FILES) && $_FILES['pic']['error'] == 0) 
	{
		$filename = createDir().'/'.randStr().getExt($_FILES['pic']['name']);
		move_uploaded_file($_FILES['pic']['tmp_name'] , DIR.$filename);
		$art['pic']=$filename;
		$art['thumb']=makeThubm($filename);
	}

index.html

<?php if($k['thumb']){?>
     <img src="<?php echo './'.$k['thumb'];?>">
<?php }?>

 cookie与session

无论是什么变量,在php中是无法跨越到另一个页面的 那如何像会员登录一样,每个页面都可以获取这个变量 需要用cookie cookie是浏览器在和它配合,共同达到这样一个效果 http原理的角度来说: 浏览器一敲回车,访问一个页面,这是个请求.且会带着一些我们人眼无法直观的东西去请求 网卡沿着网线连接到服务器的网卡上,打开了它的80端口,双方建立了一个这样的连接,就像一个通道一样 apache -> 开始相应,响应你登陆成功,同时会响应一些我们眼睛无法直观看到的东西,暗号,把admin这个暗号给了我们的浏览器. 浏览器拿到这个暗号,会将它存起来. 请求->相应 ,这次请求彻底结束,他俩的连接网卡就这样断开了,不再有任何关系 下次,浏览器再去请求其他的页面,此时,浏览器会带着暗号,admin过去连接apache

如何给浏览器一个暗号? setcookie

setcookie('user','lisi');

用firebug 查看5.php的网络(响应头信息,请求头信息)和cookies 6.php是一个空白的页面,同样用firebug查看网络和cookie 对比两个php页面的 -> 请求头信息 发现在6.php 里的请求头信息是带着 5.php的 cookie去请求的 就像吃饭时凭票取饭是一样的 那如何在6.php 取出它的cookie值? php会捕捉到你带过来的cookie值,把它放在一个cookie数组里 $_COOKIE 它是以个超全局变量,可以直接使用

cookie计数器

<?php

if(!isset($_COOKIE['num']))//判断是否有cookie
{
	$num=1; //因为这次设置的值要下次访问是才带入所以设置为1
	setcookie('num',$num);
}
else
{
	$num=$_COOKIE['num']+=1;
	
	setcookie('num',$num);
}

echo $num;

cookie详细操作语法

cookie的有效期,几秒后结束 setcookie的第3个参数,表示cookie的声明周期,需要用时间戳来表示

5.php

setcookie('sec' , '!!!' , time()+10);

cookie默认是在当前目录下有效,如果是这样,大型的网站无法做到全站登录

cookie,可以往下级目录识别,往上级目录跳没办法

5.php

setcookie('sec' , '!!!' , time()+60);
setcookie('test' , '888' );
setcookie('test2' , '666' , time()+60 , '/');

第5个参数,不常用,cookie是不能跨域的,可以在不同的子域名中生效

大的网站,往往有很多子域名,如果让cookie 在不同的子域名中生效

book.163.com mil.163.com lady.163.com 指定到确定的位置去取出cookie

setcookie('test2' , '666' , time()+60 , '/' , '163.com');

登陆与退出功能

登录 -> 验证用户名密码是否正确 -> 登陆后apache给浏览器一个唯一的cookie 从cookie的角度看 登录 -> 就是设置cookie的过程 退出 -> 就是销毁cookie的过程

表单 post-> 提交到php -> 查询用户名,密码是否正确 -> 正确则setcookie login.php

login.php

<?php

require('./lib/init.php');

if(empty($_POST))
{
	require(DIR.'/view/front/login.html');
}
else
{
	$user['name']=trim($_POST['username']);
	
	if(empty($user['name']))
	{
		error('用户名不得为空');
	}
	
	$user['password']=trim($_POST['password']);
	
	if(empty($user['password']))
	{
		error('密码不得为空');
	}
	
	$sql="select * from user where name='$user[name]' and password='$user[password]'";
	
	
	if(!mGetRow($sql))
	{
		error('账号或密码错误');
	}
	else
	{
		setcookie('name',$user['name']);
		header('Location:artlist.php');
	}
}

?>

func.php

/** * 检测是否登录 */

function acc()

{

return isset($_COOKIE['name']);

} 

在需要检测是否登录的页面加上检测 artlist.php

//检测是否登录
if( !acc() ) {
//如果没有登录,跳转到登录页面
header('Location:login.php');
exit();
}

退出也需要用到setcookie

不论是设置,修改,销毁cookie,

都需要用到setcookie

logout.php

setcookie('name' , null , 0);
header('Location: login.php');

artlist.php

<li><a href="logout.php">退出登陆</a></li>

session原理

cookie -> 服务器给浏览器的一个小票, 存储在浏览器中 那session是什么?

人去超市 -> 客户 超市的储物箱 -> 给人提供服务[存储物品给客户一个小票] 人拿箱子提供的小票 -> 取出箱子内的物品

session 开启的流程

session 读取流程

在这个过程中 1.重要的信息放在哪里?

服务器端

2.浏览器拿箱子的号,是用什么记住这个号的,每次来访问服务器用什么带着这个号来的?

cookie 所以说,cookie和session是有联系的

1.php

无论是设置,读取,销毁session,需要先开启session

session_start()

开启session之后,可以直接写session变量

$_SESSION['name']='名字';

$_SESSION['age']='年龄';

2.php

session_start();

print_r($_SESSION);

session语法细节

1.session无论是读取,修改,销毁 都要先session_start();

2.session的读取,修改,销毁,可以直接操作$_SESSION数组

3.session销毁

1)$_SESSION = array();

2)session_destroy()

销毁更彻底,彻底删除session文件

session的配置

在php.ini搜索"session",可找到相关配置项

;session的存储路径

session.save_path = "c:/wamp/tmp"

; 是否使用cookie(来传递session_id)

; http://php.net/session.use-cookies
session.use_cookies = 1

; 是否强制只用cookie来传递session_id

; http://php.net/session.use-only-cookies
session.use_only_cookies = 1

; session_id的cookie名称

; http://php.net/session.name
session.name = PHPSESSID

; 是否自动session_star

; http://php.net/session.auto-start
session.auto_start = 0

; session_id的生命周期

; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0

; 传递session_id的cookie的有效路径.

; http://php.net/session.cookie-path
session.cookie_path = /

; 是否通过URL传递session_id

; http://php.net/session.use-trans-sid
session.use_trans_sid = 0

过期session文件被清理的概率

; http://php.net/session.gc-divisor
session.gc_divisor = 1000

; 多少秒没更新的session文件,将被视为"可回收"

; http://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 14

 cookie与session的比较

特点 cookie sesion
存储地址 客户 服务器端
存储类型 字符串,数字 字符串,数字,数组,对象
创建方式 setcookie 直接操作$_SESSION
读取 $_COOKIE $_SESSION
销毁 setcookie(key,'',0) unset(),session_destroy()

 

文章如无特别注明均为原创!
本文作者: JunMo
转载或复制请带上本文地址 http://mo60.cn/post-3.html
并注明出处 JunMo博客
原文地址《 开发blog笔记(更新中)
发布于2019-6-27
收录状态: [百度未收录][360未收录]

分享到:


打赏

评论

游客

看不清楚?点图切换

切换注册

登录

您也可以使用第三方帐号快捷登录

切换登录

注册