阿里百秀项目第五弹

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 . '&nbsp;' . $b;//输出hello world    (&nbsp;)表示空格
 ?>

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请求的情况是通过侧边栏进入页面
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值