1.封装数据库连接(connect.php):

<?php
// 封装数据库连接
// 设置页面编码声明
header("Content-type: text/html; charset=utf-8");
// $mysqli为连接标识符
$mysqli = new mysqli('127.0.0.1','root','','imoocComment');
// 通过判断是否存在错误码,进而判断是否连接成功
if($mysqli->errno){
// 输出报错信息,并结束程序
die('数据库连接失败:'.$mysqli->error);
}else{
// 设置字符集
$mysqli->set_charset('UTF8');
} ?>

2.封装类文件(comment.class.php):

<?php
// 定义类
class Comment {
// 定义私有变量,用于保存数据
private $data = array();
// 构造函数(当首次被调用时,自动执行)
function __construct($data){
// 初始化数据
$this->data = $data;
} /**
* 验证(validate)用户输入的数据
* @param(参数) array(数组类型) $arr
* return(返回值) boolean(布尔类型)
*/
public static function validate(&$arr){
// filter_input(输入类型,'要过滤的变量',过滤器的ID,包含标志/选项的数组) php过滤函数(内置过滤器)
// 验证邮箱
if(!($data['email'] = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL))){
// 将错误信息保存到$errors数组中
$errors['email'] = '请输入合法邮箱';
}
// 验证路径(个人博客)
if(!($data['url'] = filter_input(INPUT_POST,'url',FILTER_VALIDATE_URL))){
// 博客地址
$url = '';
}
// 验证内容
// 定义验证字符的静态方法: validate_str()
if(!($data['content'] = filter_input(INPUT_POST,'content',FILTER_CALLBACK,array('options'=>'Comment::validate_str')))){
$errors['content'] = '请输入合法内容';
}
// 验证用户名
if(!($data['username'] = filter_input(INPUT_POST,'username',FILTER_CALLBACK,array('options'=>'Comment::validate_str')))){
$errors['username'] = '请输入合法用户名';
}
// 设置img的value的最大值和最小值
$options = array(
'options'=>array(
'min_range'=>1,
'max_range'=>5
)
);
// 验证头像
if(!($data['face'] = filter_input(INPUT_POST,'face',FILTER_VALIDATE_INT,$options))){
$errors['face'] = '请选择合法头像';
}
// 判断$errors数组是否为空,进而判断是否输出错误提示
if(!empty($errors)){
$arr = $errors;
return false; // 禁止程序向下执行
}
// 没有错误的情况
$arr = $data;
// 过滤掉邮箱里的空格
// strtolower(str):把字符串转换为小写。
// trim(str):函数移除字符串两侧的空白字符 或 其他预定义字符。
$arr['email'] = strtolower(trim($arr['email']));
return true;
} /**
* 过滤用户输入的特殊字符
* @param(参数) string(字符串类型) $str
* return(返回值) boolean(布尔类型)|string(字符串类型)
*/
public static function validate_str($str){
// mb_strlen(str):mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算
if(mb_strlen($str,'UTF8')<1){
return false;
}
// nl2br(string):将换行(\n)转换成(<br/>)
// htmlspecialchars(string):过滤用户输入过程中的特殊字符,包括双引号(ENT_QUOTES)
$str = nl2br(htmlspecialchars($str,ENT_QUOTES));
return $str;
} /**
* 显示评论内容
* return(返回值) string(字符串类型)
*/
public function output(){
// 判断是否填写连接路径,如果填写,则拼接连接起始点的字符串
if($this->data['url']){
$link_start="<a href='".$this->data['url']."' target='_blank'>"; // 连接起始点的字符串
$link_end="</a>";
}
// 发布的时间戳
$dateStr = date("Y年m月d日 H:i:s",$this->data['pubTime']);
// 编写SQL语句
$res=<<<EOF
<div class='comment'>
<div class='face'>
{$link_start}
<img width='50' height='50' src="img/{$this->data['face']}.jpg" alt="" />
{$link_end}
</div> <div class='username'>
{$link_start}
{$this->data['username']}
{$link_end}
</div> <div class='date' title='发布于{$dateStr}'>
{$dateStr}
</div> <p>{$this->data['content']}</p>
</div>
EOF; return $res;
}
}
?>

3.调用文件(doAction.php):

<?php
// 设置编码格式
header('content-type:text/html;charset=utf-8');
// 导入连接数据库文件
require_once 'connect.php';
// 导入类文件
require_once 'comment.class.php'; $arr = array();
// 调用类方法
$res = Comment::validate($arr);
// 判断验证是否成功
if($res){
// 编辑SQL语句
$sql = "INSERT comments(username,email,url,face,content,pubTime) VALUES(?,?,?,?,?,?);";
// 预处理
$mysqli_stmt = $mysqli->prepare($sql);
// 当前的时间戳(实时时间)
$arr['pubTime'] = time();
// bind_param()
$mysqli_stmt->bind_param('sssssi',$arr['username'],$arr['email'],$arr['url'],$arr['face'],$arr['content'],$arr['pubTime']);
// 调用execute(),写进数据库
$mysqli_stmt->execute();
// 实例化类
$comment = new Comment($arr);
echo json_encode(array('status'=>1,'html'=>$comment->output()));
}else{
echo '{"status":0,"errors":'.json_encode($arr).'}';
} ?>

4.首页(index.php):

<?php
// 导入数据库连接文件
require_once 'connect.php';
// 导入类文件
require_once 'comment.class.php';
// 编写SQL语句
$sql="SELECT username,email,url,face,content,pubTime FROM comments";
// 执行SQL语句,并获取资源标识符(结果集)
$mysqli_result=$mysqli->query($sql);
// 判断结果集是否为空,且结果集是否取尽
if($mysqli_result&& $mysqli_result->num_rows>0){
// 通过while循环输出所有数据
while($row=$mysqli_result->fetch_assoc()){
// 定义$comments数组,保存数据
// 实例化类
$comments[]=new Comment($row);
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>评论系统</title>
<link rel="stylesheet" type="text/css" href="style/style.css" />
</head>
<body>
<h1>中广核评论系统</h1>
<div id='main'>
<?php
foreach($comments as $val){
echo $val->output();
}
?>
<div id='addCommentContainer'>
<form id="addCommentForm" method="post" action="">
<div>
<label for="username">昵称</label>
<input type="text" name="username" id="username" required='required' placeholder='请输入您的昵称'/> <label for="face">头像</label>
<div id='face'>
<input type="radio" name="face" checked='checked' value="1" /><img src="img/1.jpg" alt="" width='50' height='50' />   
<input type="radio" name="face" value="2" /><img src="img/2.jpg" alt="" width='50' height='50' />   
<input type="radio" name="face" value="3" /><img src="img/3.jpg" alt="" width='50' height='50' />   
<input type="radio" name="face" value="4" /><img src="img/4.jpg" alt="" width='50' height='50' />   
<input type="radio" name="face" value="5" /><img src="img/5.jpg" alt="" width='50' height='50' />   
</div>
<label for="email">邮箱</label>
<input type="email" name="email" id="email" required='required' placeholder='请输入合法邮箱'/> <label for="url">个人博客</label>
<input type="url" name="url" id="url" /> <label for="content">评论内容</label>
<textarea name="content" id="content" cols="20" rows="5" required='required' placeholder='请输入您的评论...'></textarea>
<input type="submit" id="submit" value="发布评论" />
</div>
</form>
</div>
</div>
<script type="text/javascript" src="script/jquery.min.js"></script>
<script type="text/javascript" src="script/comment.js"></script>
</body>
</html>

5.项目结构:

注:js中对于return用法的三种情况的总结如下:

retrun true; 返回正确的处理结果。

return false;返回错误的处理结果;终止处理;阻止提交表单;阻止执行默认的行为。

return;把控制权返回给页面。

mysqli 实例的更多相关文章

  1. php5.4以上 mysqli 实例操作mysql 增,删,改,查

    <?php //php5.4以上 mysqli 实例操作mysql header("Content-type:text/html;charset=utf8"); $conn ...

  2. Mysqli基础知识

    相信原来在开始学习php的时候,很多人使用的数据库首选MySQL,连接数据库的扩展首选mysql扩展,但随着php版本的提高,mysql扩展正逐渐被mysqli和PDO所取代.正如使用mysql函数时 ...

  3. php数据库编程---mysqli扩展库

    1,mysqli扩展库允许我们访问MySQL数据库,并对MySql数据库进行curd操作.Mysqli扩展库比mysql扩展库加强了. 2,mysqli扩展库和mysql扩展库的比较 (1) mysq ...

  4. PHP中的MySQLi扩展学习(三)mysqli的基本操作

    我们继续 MySQLi 扩展的学习,上篇文章中提到过,MySQLi 的扩展相对于 PDO 来说功能更加的丰富,所以我们依然还会在学习过程中穿插各种 MySQLi 中好玩的方法函数.不过,今天的主角是 ...

  5. mysql错误之2014

    error:2014 Commands out of sync; you can't run this command now 这个错误号我也真是醉了. 一直纠结于为什么存储过程执行完,commit操 ...

  6. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  7. php+Mysqli利用事务处理转账问题实例

    本文实例讲述了php+Mysqli利用事务处理转账问题的方法.分享给大家供大家参考 <?php /**php+Mysqli利用事务处理转账问题实例 * author http://www.lai ...

  8. php设计模式之单例模式实例(设计mysqli连接数据的数据处理类)

    一直在研究php的设计模式,但是没有亲历使用过,所以还是一知半解,通过几天的学习终于对php的单例设计模式稍稍的有些了解,特此写出一个数据库处理类(只涉及到简单的原理),以便自己以后方便查阅,至于其他 ...

  9. mysqli数据库操作简单实例

    mysqli数据库操作简单实例 代码 结果

随机推荐

  1. 深入理解Java的注解(Annotation):注解处理器(3)

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  2. hdu 1140(三维)

    War on Weather Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  3. 用LoopBack搭建RESTful 风格的API

    1.安装node.NPM 2.安装strongloop npm install -g --unsafe-perm install strongloop 3.创建工作目录并且配置loopback应用 m ...

  4. 【转】Python unittest数据驱动工具:DDT

    背景 python 的unittest 没有自带数据驱动功能. 所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成. DDT是 “Data-Driven Tests”的缩写 ...

  5. eclipse中的aptana插件的安装

    先下载 aptana插件包   我安装的eclipse版本是 indido版本号的. 三步骤: 1.将aptana解压到eclipse的目录下 2.打开eclipse目录下的dropins文件,新建一 ...

  6. (2)C# 创建ef oracle

    1.NUGet下载 2.下载  Oracle Developer Tools for Visual Studio https://www.oracle.com/technetwork/develope ...

  7. 并查集【p1197】[JSOI2008]星球大战

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...

  8. awk 精彩文章

    https://coolshell.cn/articles/9070.html 我从netstat命令中提取了如下信息作为用例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  9. luogu P1824 进击的奶牛

    题目描述 Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000 ...

  10. 【权值分块】bzoj3570 DZY Loves Physics I

    以下部分来自:http://www.cnblogs.com/zhuohan123/p/3726306.html 此证明有误. DZY系列. 这题首先是几个性质: 1.所有球质量相同,碰撞直接交换速度, ...