以前自學留下來得問題集---你覺得如何呢!

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(arrayas v){
if(!in_array(v, temp)){
temp[]= v;
}
}

發佈了46 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章