1.封装获取当前登录用户信息的函数
1.在根目录下写一个文件function.php
2.php中函数的命名
注意:定义函数时应注意:函数名与内置函数冲突的问题
<?php
/*
封装大家公用的函数
*/
session_start();
//定义函数时应注意:函数名与内置函数冲突的问题
//js中的判断对象类型方式:typeof fn === ‘function’
//php中判断函数是否定义的方式:function_exists('get_current_user')
//在cmd中用echo打印,若存在则输出为1
//换定义名,config文件中也需要改
function baixiu_get_current_user(){
if(empty($_SESSION['current_logged_user'])){
//没有当前登录用户信息,意味着没有登录
header('Location:/admin/login.php');
exit(); //没有必要执行后面的代码
}
return $_SESSION['current_logged_user'];
}
?>
2.封装函数的调用
1.调用函数的级别:文件夹地址为include引用的文件夹
2.物理路径: dirname(__FILE__).
方法
//因为这里sidebar.php是被index.php载入执行的
//所以这里的相对路径是相对于index.php
//如果希望解决这个问题,可以使用物理路径解决
// echo __FILE__;
//require_once dirname(__FILE__).'/../../functions.php';
require_once '../functions.php';
$current_user=baixiu_get_current_user();
3.封装数据库查询
function xiu_fetch($sql){
$conn = mysqli_connect(XIU_DB_HOST, XIU_DB_USER, XIU_DB_PASS, XIU_DB_NAME);
if(!$conn){
exit('数据库连接失败');
}
$query=mysqli_query($conn,$sql);
if(!$query){
exit('查询失败');
}
while($row=mysqli_fetch_assoc($query)){
$result[]=$row;
}
return $result;
}
4.数据库查询sql
$comments_count=xiu_fetch('select count(1) as num from comments;');
var_dump($comments_count[0]['num']);
//数组的第一个数
语法:SELECT 列名称 FROM 表名称
注意:count(1)、count(*
)与count(列名)的执行区别
count(*)与count(列名)需要扫描表里所有字段,所以效率低。count(1)不需要,所以效率高。
5.画饼图
饼图:chart和echarts
这里主要学习看API的能力
<script>
var ctx = document.getElementById('chart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'pie',
data: {
datasets: [
{
data: [<?php echo $posts_count ?>,<?php echo $categories_count ?>,<?php echo $comments_count ?>],
backgroudColor:[
'hotpink',
'pink',
'deeppink'
]
}
],
// These labels appear in the legend and in the tooltips when hovering different arcs
labels: [
'Red',
'Yellow',
'Blue'
]
}
});
6.分类列表数据呈现
学习:php中foreach方法
<?php foreach ($categories as $item):?>
<tr>
<td class="text-center"><input type="checkbox"></td>
<td><?php echo $item['name'];?></td>
<td><?php echo $item['slug'];?></td>
<td class="text-center">
<a href="javascript:;" class="btn btn-info btn-xs">编辑</a>
<a href="javascript:;" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
<?php endforeach?>
7.添加分类功能
(1)添加分类add_category()函数:
function add_category(){
if(empty($_POST['name'])||empty($_POST['slug'])){
$GLOBALS['massage']='请填写完整表单!';
$GLOBALS['success']=false;
return;
}
//接受并保存
$name=$_POST['name'];
$slug=$_POST['slug'];
//INSERT into categories VALUES(null,'slug','name');
//执行添加:引用function.php文件中封装增删改查操作
$rows=xiu_execute("INSERT into categories VALUES(null,'{$slug}','{$name}');");
//添加结束后弹出一个结果
$GLOBALS['success']=$rows>0;
$GLOBALS['massage']=$rows<=0?'添加失败!':'添加成功';
}
(2)在function.php文件中封装增删改查操作:mysqli_affected_rows()函数获取受影响行数
/*执行一个增删改语句获取受影响行数 */
function xiu_execute($sql){
$conn = mysqli_connect(XIU_DB_HOST, XIU_DB_USER, XIU_DB_PASS, XIU_DB_NAME);
if(!$conn){
exit('数据库连接失败');
}
$query=mysqli_query($conn,$sql);
if(!$query){
exit('查询失败');
}
//对于增删修改类的操作都是获取受影响行数
$affected_rows=mysqli_affected_rows($conn);
//断开连接
mysqli_close($conn);
return $affected_rows;
}
(3)修改操作结束后,进行查询
//如果修改与查询操作在一起,一定是先修改后查询
if($_SERVER['REQUEST_METHOD']==='POST'){
//一旦表单提交请求,就意味着要添加数据
add_category();
}
//查询所有分类数据
$categories=xiu_fetch_all('SELECT * from categories;');
(4)添加结束后弹出一个结果
有错误信息时展示alert-danger 展示为红色 、正常添加后展示alert-success 展示为绿色
<?php if(isset($success)):?>
<?php if($success):?>
<div class="alert alert-success">
<strong>成功!</strong> <?php echo $massage;?>
</div>
<?php else:?>
<div class="alert alert-danger">
<strong>错误!</strong> <?php echo $massage;?>
</div>
<?php endif?>
<?php endif?>
8.删除功能与防止sql恶意注入功能
(1)传递数据:将a标签中的链接指向删除文件category-delete.php,并向文件传一个参数id
<a href="category-delete.php?id=<?php echo $item['id'];?>" class="btn btn-danger btn-xs">删除</a>
(2)执行删除
<?php
/*根据客户端传过来的id删除对应的数据 */
require_once '../functions.php';
if(empty($_GET['id'])){
exit('缺少不必要的参数');
}
$id=(int)$_GET['id'];
//==>'1 or 1=1'
//sql注入 删除整行
//防止sql的恶意注入:int()函数转换成整形 举例:1 or 2=2 ===》输出结果为1
$row=xiu_execute("DELETE FROM categories WHERE id='{$id}'");
header('Location:/admin/categories.php');
(3)什么是SQL注入?
就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
举例:
DELETE FROM categories WHERE id=‘1 or1=1’
//导致列表中数据都被删
解决方法:
$id=(int)$_GET['id'];
//==>'1 or 1=1'
//sql注入 删除整行
//防止sql的恶意注入:int()函数转换成整形 举例:1 or 2=2 ===》输出结果为1
9.批量删除
两种方案:
方案1:每当change发生都要进行一次遍历,所以效率低
//当表格中任意一个Checkbox选中发生变化时
$tbodyCheckboxs.on('change',function () {
var flag=false;
$tbodyCheckboxs.each(function (i,item) {
if($(item).prop('checked')){
flag=true;
}
})
flag?$btnDelete.fadeIn():$btnDelete.fadeOut()
})
方案2:定义一个数组记录当前被选中的
var allCheckeds=[];
$tbodyCheckboxs.on('change',function(){
var id=$(this).data('id');
//根据有没有选中当前这个checkbox决定添加还是删除
if($(this).prop('checked')){
allCheckeds.push(id);
}else{
allCheckeds.spilce(allCheckeds.indexOf(id),1);
}
allCheckeds.length?$btnDelete.fadeIn():$btnDelete.fadeOut();
$btnDelete.prop('search','?id='+allCheckeds);
}
知识点
(1)attr和prop属性:checked使用prop属性
1.获取或者设置checked,selected,readonly,disabled等的时候使用prop效果更好,减少了访问dom属性节点的频率。
用attr来获取checked,选中状态获取attr(“checked”)为checked,没有选中则为undefined。而prop来获取的为,选中为true,没有选中为false。
2.用prop来设置属性名,html结构是不会发生变化的。而用attr来设置属性名,html结构是会发生变化的。
3.一般如果是标签自身自带的DOM属性,我们用prop方法来获取;如果是自定义的属性,我们用attr方法来获取。
4.attr访问的是元素的HTML属性(写在HTML标签中),prop访问的是元素对应的DOM属性
注意:console.dir();
可以获得所有的DOM属性
$tbodyCheckboxs.each(function (i,item) {
//attr和prop的区别:
//attr访问的是元素的HTML属性(写在HTML标签中)
//prop访问的是元素对应的DOM属性
//console.log($(item),prop('checked'));
(2)自定义属性:用attr方法来获取
1.H5中提供了data-xx属性,在DOM中创造了一个对象dataset用来存自定义的属性
<td class="text-center"><input type="checkbox" data-id="<?php echo $item['id'];?>"></td>
2.获取的三种方式
//三种获取id的方式
//1.原生DOM的方式
//this.data set['id']
//2.直接操作html中的属性
//console.log($(this).attr('data-id'));
//3.H5中提供了data-xx自定义属性,
//在DOM中创造了一个对象dataset用来存自定义的属性,jQuery中可以通过data()函数拿到
//console.log($(this).data('id'));
全选操作
知识点:trigger()方法触发被选元素的指定事件类型
//全选操作
$('thead input').on('change',function () {
//1.获取当前的状态
var checked=$(this).prop('checked')
//2.设置为选中每一个
//当一段代码执行后,trigger()方法表示触发一个事件
$tbodyCheckboxs.prop('checked',checked).trigger('change');
})
10.删除操作的服务端:字符串的拼接
由于客户端传来的是以数组,而数据库中的删除语句DELETE FROM categories WHERE id in {1,2,3};
//用.(含空格)表示连接
$row=xiu_execute('DELETE FROM categories WHERE id in (' . $id . ');');
字符串的拼接:
1.在php里声明一个字符串有2种方式,一种是用单引号,另一种是用双引号。2者最大的区别就是当字符串中包含变量时,单引号不能输出变量的值,而是直接输出变量名,双引号就可以输出变量的值。
<?php
$a = 'hello';
$b = 'world';
echo '$a $b'; //输出$a $b
echo "$a $b"; //输出hello world
?>
2.单引号里只能有2种转义字符,\'
(表示单引号)和\\
(表示反斜杠),双引号就没这个限制。
<?php
echo '\'hello\\world\''; //输出'hello\world'
echo "\thello\r\n"; //\t表示制表符,\r\n表示换行
?>
3.在php中字符串的拼接是用' . '
,输出字符串一般是用echo。
<?php
$a = 'hello';
$b = 'world';
echo $a . ' ' . $b;//输出hello world ( )表示空格
?>
3.也可以用大括号{$str}
在字符串里内嵌变量
<?php
$a = 'hello';
echo "qqq{$a}qq";//输出qqqhelloqqq
echo "qqq$aqqq";//输出的是qqq$aqqq,而不是qqqhelloqqq
echo "qqq$a qqq";//在$a后面加个空格也是可以得,输出qqq$a qqq
?>
11.编辑功能
注重逻辑:
get请求的情况是通过侧边栏进入页面