以前自学留下来得问题集---你觉得如何呢!

1.在添加数据时,如何防止表单id被篡改?

答:为了防止篡改,需要更改模型的属性,增加允许提交的字段信息即可

2.在修改数据时,如果别人恶意修改隐藏里面的id,怎么处理?(篡改表单数据)

答:解决方案:数字签名技术(数据怎么去,还得怎么回)
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。

3.不做伪删除情况下,如果删除一条记录时,直接删掉的话,图片文件是没有删除,如果在删除记录之前?

答:unlink($imgPath) // unlink 可以删除图片 参数为图片的路径
代码应该写在删除的前缀钩子里面。就是在真正删除记录信息之前的操作。

4.更新图片时,需要把旧的图片删除,如何实现该功能?

答:要写在更新的save方法的前置钩子里面,需要先获取原图片的地址信息,将其删除之后,然后更新为新的上传图片地址。

5.当用户的鼠标失去焦点时候,也完成搜索功能,不需要手动的点击提交功能

答:
("input[type='text'].blur(function(event){("$#search").submit();
})")

6.使用Javascript的函数节流?

函数节流(throttle):是让一个函数无法在很短的时间间隔内连续调用,当上一次函数执行后过了规定的时间间隔,才能进行下一次该函数的调用。
函数去抖(debounce):让一个函数在一定间隔内没有被调用时,才开始执行被调用方法。

debounce
函数去抖的基本思想是:对需要去抖的函数做包装,使用闭包记录timeout,第一次回调给函数设置 setTimeout定时器,只要在wait时间内,后一次的回调会clearTimeout取消前一次回调的执行。

_.debounce = function(func, wait, immediate) {
    var timeout, result;
    return function() {
      var context = this, args = arguments;
      var later = function() {
        timeout = null;
        if (!immediate) result = func.apply(context, args);
      };
      var callNow = immediate && !timeout;
      clearTimeout(timeout);
      timeout = setTimeout(later, wait);
      if (callNow) result = func.apply(context, args);
      return result;
    };
  };

throttle
函数节流的基本思想是:无视浏览器的回调,自己按一定频率执行代码。

_.throttle = function(func, wait) {
    var context, args, timeout, result;
    var previous = 0;
    var later = function() {
      previous = new Date;
      timeout = null;
      result = func.apply(context, args);
    };
    return function() {
      var now = new Date;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0) {
        clearTimeout(timeout);
        timeout = null;
        previous = now;
        result = func.apply(context, args);
      } else if (!timeout) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };
  };

7. 在TP使用的时候为什么不建议使用标签语法?

答:1. 标签语法可控性不强
2. 从效率上来说,原生代码更快.

8.获取数据拼接html代码时,为什么要尽量不用php,要用JS做?

答:php在后台拼接数据很消耗服务器性能,用前台JS来做就不会.

9.PHP之写时复制(Copy On Write)简称COW

memory_get_usage()-获取PHP内存消耗
array_fill — 用给定的值填充数组
ref_count和is_ref是定义于zval结构体中
is_ref 标识是不是用户使用 & 的强制引用;
ref_count 是引用计数,用于标识此zval被多少个变量引用,即COW的自动引用,为0时会被销毁;
xdebug_debug_zval()是xdebug扩展中的一个函数,用于输出变量在zend内部的引用信息。 如果你没有安装xdebug扩展,也可以使用debug_zval_dump()来代替

10.$srt这值是多少?

11.什么是RBAC管理权限?

答:RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

12.长网址生成短网址实现思路?

答:其实很简单 ,系统把一个长的地址 如 http://www.xxx.com/ddd/xxx/a.html?dsada 首先用一个算法转换成 短地址 http://t.cn/Afafhe
然后把 Afafhe–>http://www.xxx.com/ddd/xxx/a.html?dsada 的关系保存到数据库中 当用户访问 http://t.cn/Afafhe网址时,系统到数据库找到对应的URL地址,实现跳转

13.如果在做无限极分类的时候,如果递归层数过大,出现性能问题,如何优化?

答:一般网站在做栏目显示的时候,最多也就三层.不用递归方式进行无限极分类

function noLimitedCategory(cat,exclude=0,parentid=0,level = 0) {

$stack = array($parent_id); //把父id放在数组里,$stack数组
$child = array();  //以父id为键名,子id为值得数组
$added = array();  //记录已插入的布尔值,以id为键值
$options = array();//最终返回的结果集
$obj = array();//把所在id的记录信息以id为键值保存为一个数组
$loop = 0;   //死循环跳出的初始值

foreach($cat as $node) {  //$node
    $pid = $node['parent_id'];  //父id值
    if(!isset($child[$pid])) {
        $child[$pid] = array();
    }
    array_push($child[$pid], $node['id']);

//将一个或多个单元压入数组的末尾
        $obj[$node['id']] = $node;//把所在id的记录信息以id为键值保存为一个数组
    }


    while (count($stack) > 0) //当$stack数组为空时退出循环
    {    
        $id = $stack[0];//父id
        $flag = false; //对子id的层级是否+1判断
        $node = isset($obj[$id]) ? $obj[$id] : null; //有的话就把整个id的记录数组传给$node没有的话给null
        if($exclude){
        if($exclude == $id){  //把这个节点及其后所有的节点都排除
          $child[$id]=null;
         if($node) {
                for ($i = count($child[$node['parent_id']]) - 1; $i >= 0; $i--) {
                    if ($child[$node['parent_id']][$i] == $id) {
                        array_splice($child[$node['parent_id']], $i, 1);//把数组中的一部分去掉并用其它值取代 
                        break;
                    }
                } 
        if(count($child[$node['parent_id']]) == 0) {
                    $child[$node['parent_id']] = null;//把空数组变成null值
                    $level--;//回走上级做减一操作
                }
            } 
            array_shift($stack);
          continue;
            }
            }


        if (isset($child[$id])) //判断此id是否有子id,没有子id就不会执行
        {
            for($i = count($child[$id]) - 1; $i >= 0; $i--) {
                array_unshift($stack, $child[$id][$i]);//在数组开头插入一个或多个单元,插入形成一个有fid的数组
            }
            $flag = true;//对子id的层级是否+1判断
        }


        if ($id != $parent_id && $node && !isset($added[$id])) {
            $node['level'] = $level;  //添加子id层级参数
            $options[] = $node;   //对该id的数组记录进行插入到结果集
            $added[$id] = true; //往回走这部时,标记这数组已经插入,不再重复插入
        }
        if($flag == true){
            $level++;   //这代表有子id,对id层数+1操作
        } else //如果没有子id就会进入这一步
        {
            if($node) {
                for ($i = count($child[$node['parent_id']]) - 1; $i >= 0; $i--) {
                    if ($child[$node['parent_id']][$i] == $id) {
                        array_splice($child[$node['parent_id']], $i, 1);//把数组中的一部分去掉并用其它值取代 
                        break;
                    }
                } 
        if(count($child[$node['parent_id']]) == 0) {
                    $child[$node['parent_id']] = null;//把空数组变成null值
                    $level--;//回走上级做减一操作
                }
            } 
            array_shift($stack);//将数组开头的单元移出数组
        }
        $loop++; //循环次数加一操作
        if($loop > 5000) return $options; //当出现死循环跳出

    }

    unset($child);//销毁的变量
    unset($obj); //同上
    return $options;//返回最终结果集
}

14.请解释一下该正则表达式:

    (\w)((?=\1\1\1)(\1))+ 

15.去掉数组中重复的方法?

array=array(1,1,1,2,3,3);//temp=array();
foreach(arrayasv){
if(!in_array(v,temp)){
temp[]=v;
}
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fa_Ker/article/details/51914172
个人分类: 文章
上一篇以前自学留下来得问题集---你觉得如何呢!
下一篇Linux从不懂得到熟练之路(二)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭