php+mysql留言板实现代码分享
date
Feb 7, 2018
slug
php-mysql-content
status
Published
tags
开发测试
summary
今天没什么想说的,直接上正文吧。。。。。。。。
type
Post
正文
在前几天学习的基础上,自己重新把功能实现一遍,并把自己的总结都写在代码的注释里面。。。
上次忘了的sql+PHP的查询总结
mysqli查询结果:
1.用它的mysqli_result类,文档是这样说的 “代表从一个数据库查询中获取的结果集” 。。。
query语句执行完以后一般是返回
true
跟false
,但如果执行的是select语句的话,返回的就是一个对象了,但是执行不成功肯定是false
,所以一般前面要先判断。。2.如果他是对象的话,那么就可以调用
mysqli_result
类下的fetch_array()
函数,这个函数是不可逆的,就是显示完以后重复加载该函数没用,要解决的这种情况我们可以用一个数组存储一下。。。
如果里面什么都不填的话他返回的数组里面即含有索引,又含有字段,详细可以自己用var_dump
函数测试一下。。。
所以可以用一个常量MYSQLI_ASSOC
,注意常量不需要引号,也不需要$
符登录功能
由于http是无记忆的,关闭网页后会消失数据,因此才要用数据库去存储数据
所以我们用session跟cookie来实现登录功能,我用的是session,因为session一般都在服务器端,比较安全
还有几点注意事项
1.Undefined index:的错误,这种错误我出现了很多次,主要是post或者get请求为空导致的,后来是在class类里面调用了isset函数解决的.....
2.代码中所有注释中的var_dump函数都是用做测试
3.还有就是html语句跟PHP语句的混写一定要小心,很容易就会写错
4.我用的是PHPstudy搭建的环境,数据库起名PHP10
下面就附上代码
1.book.php
<?php
/*
留言板首页
*/
session_start();
include ('connect.php');
include ('mysql.php');
//var_dump($_SESSION);
?>
<?php date_default_timezone_set("PRC"); //这句话解决的是It is not safe to rely on the system's timezone settings报错
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>留言板</title>
<style>
.wrap {
width:800px;
margin:0px auto;
}
.add {overflow: hidden;}
.add .content {
width: 798px;
margin: :0;
padding: 0;
}
.add .user{float: left;}
.add .btn{float: right;}
.msg{ margin:20px 0px;background: #ccc; padding:5px;}
.msg .info{overflow: hidden;}
.msg .user{float: left;color:blue;}
.msg .time{float:right;color:#999;}
.msg .content{width:100%padding:5px;}
</style>
</head>
<body>
<div class="wrap">
<!-- 发表留言 -->
<div class="add">
<form action='save.php' method='post' >
<textarea class="content" name='content' cols="50" rows="5"></textarea>
<input class="user" type="text" name='user' />
<input class="btn" type="submit" value="发表留言"/>
<a class='btn' href='login.php'>登录</a>
</form>
</div>
<?php
foreach ($d as $row ) {
?>
<!--查看留言 -->
<div class='msg'>
<div class='info'>
<span class='user'><?php echo $row['user'] ;?></span>
<span class ='time'><?php echo date("Y-m-d H:i:s",$row['intime']);?> <!--用了date函数改变一下格式-->
<?php if(isset($_SESSION['username']) == true) {?>
<a onclick="return confirm('你确定要删除吗?')" href="delete.php?id=<?php echo $row['id'];?>">删除</a></span>
<!--这里用onclick去写js-->
<?php }?>
</div>
<div class='content'>
<?php echo $row['content'] ;?>
</div>
</div>
<?php
}
?>
</div>
</body>
</html>
2.save.php
<?php
/*
此处是完成留言板的增加留言的功能
无论你是否是管理员都可以发表留言
*/
include ('connect.php');
include('test3.php');
$n = new input();
$flag = $n->post('content');
if($flag === false)
{
die("输入内容不能为空!!");
}
$content = $flag;
$flag = $n->post('user');
if( $flag == false )
{
die("输入名字违规!!");
}
$user = $flag;
// var_dump($n->post($user));
$time = time(); //time函数是用来表示时间戳,从1970年开始,也就是1970之前不能表示
$sql = "insert into msg(content,user,intime) values('{$content}','{$user}','{$time}')";
/*
这里用花括号是因为你在单引号里面不知道这个$后面跟着的是变量还是字符串
*/
//echo $sql;
$db->query("SET NAMES UTF8");
//确保数据传输也是UTF-8,防止出现乱码,可能会出现这种情况,但我发现我删除之后没影响,最好还是些写写吧,小心是UTF8,没有横线
$flag = $db->query($sql);
if($flag == true)
{
header("location:book.php");//重定向
}
else
{
echo '操作失败!';
}
//header("location:book.php");
?>
3.connect.php
<?php
/*
此处是数据库连接的关键文件
每次执行sql都需要连接数据库
单独写进一个文件在用文件包含比较方便
*/
$host = '127.0.0.1';
$dbuser = 'root';
$pwd = 'root';
$dbname = 'php10';
$db = new mysqli($host,$dbuser,$pwd,$dbname);
$db->query('SET NAMES UTF8');
if($db->connect_errno !=0)
{
die('连接失败!');
}
?>
4.test3.php
<?php
/*
此处是用于输入的判断,这里的试isset函数帮我解决了那个Undefined index:的错误
这里也让我明白了这个PHP函数可以随意返回东西,不想C++那样只能返回对应函数类型的值
*/
class input{
function post($key)
{
if(isset($_POST[$key]) === false)
{
return false;
}
//禁止使用的用户名,代码恶意过滤
$n = ['张三','李四','王五'];
foreach( $n as $name)
{
if($key == $name)
{
return false;
}
}
$val = $_POST[$key];
return $val;
}
function get($key)
{
if(isset($_GET[$key]) === false)
{
return false;
}
//禁止使用的用户名,代码恶意过滤
$val = $_GET[$key];
return $val;
}
}
?>
5.mysql.php
<?php
/*
此处是留言板颜面查询功能的实现
*/
include ('connect.php');
$sql = "select * from msg order by id DESC";
//执行SQL语句
$mysqli_result = $db->query($sql);
if($mysqli_result === false)
{
echo '操作失败!';
exit;
}
/*
fetch_array首次调用显示最新的一条记录
重复调用,依次显示后面的记录
如果没记录可显示,就返回NULL
*/
// echo $c['id'];
// echo $c['content'];
// echo $c['user'];
// echo $c['intime']; //测试部分。。这里的$符号忘记了写,找了很久才找得到,原谅新手O(∩_∩)O
$d = [];
while($c = $mysqli_result->fetch_array(MYSQLI_ASSOC)) //这里的$c变量运用了类型转换
{
$d[] = $c;
/*
这里的[]可以天可以不填,不填的话,就会自动索引从0开始,并且是个二维数组,一维对应的字段键值,如果自己想定义可以这样$d[$c['id']] = $c;这是以id为键值
*/
}
?>
6.login.php
<?php
/*
登录功能的实现
*/
session_start(); //session的用法其实就是相当与一个数组,可跨网页使用
include ('test3.php');
$input = new input();
include ('connect.php');
$act = $input->get('act');
//var_dump($act);
if($act !== false)
{
$username = $input->post('username');
$password = $input->post('password');
//var_dump($username,$password);
/*
把下面这一段代码放在外面的话,一直会爆未定义变量的错误,找了很久才发现因该在里面写
请原谅新手。。。。
*/
$sql = "select * from ada where username='{$username}' and password='{$password}'";
$mysqli_result = $db->query($sql);
if($row = $mysqli_result->fetch_array(MYSQLI_ASSOC))
{
$_SESSION['username'] = $row['username'];
header("Location:book.php");
}
else
{
echo"登陆失败!";
exit;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>管理员登陆</title>
</head>
<body>
<form action = 'login.php?act=chk' method="post"> <!--get方法的变量只需要在这个action里面定义即可-->
<input type="text" name='username'/>
<input type='password' name= 'password' /> <!--type改成password可以隐藏明文-->
<input type='submit' value='点击登录'/>
</form>
</body>
</html>
7.delete.php
<?php
/*
删除功能的实现
*/
session_start();
if(isset($_SESSION['username']) ==false)
{
echo "需要管理员权限!!";
exit;
}
include ('test3.php');
$input = new input();
$id = $input->get('id');
include('connect.php');
$sql = "delete from msg where id='{$id}'";
$is = $db->query($sql);
if($is == true)
{
header("Location:book.php");
}
else
echo "删除失败!!";
?>