PHP常見面試題

【總結】PHP常見面試題彙總(三)

 
本文摘自網絡僅供本人學習之用

一、php如何在文章列表中任意位置或固定位置插入新的文章?好比:三、6位置
二、php如何刪除兩個數組中有交集的元素?
三、php如何在數組頭部和尾部及任意位置插入元素?
四、php如何將二位數組按某一個或多個字段值(升序/降序)排序?數字索引被重置,關聯索引保持不變
五、php如何實現APP版本號的比對?
六、php如何獲取視頻封面圖?
七、php中的六種加密解密算法
八、php如何方式SQL注入?
九、php如何將模板標籤替換爲指定內容?
十、php如何獲取當前頁面的完整url?
十一、php如何強制下載文件?
十二、php截取字符串長度(含中文)
1三、php如何獲取客戶端真實IP?
1四、php如何記錄日誌信息到文件中? 
1五、php如何防止重複提交表單?令牌方式javascript

一、如何在文章列表中任意位置或固定位置插入新的文章?好比:三、6位置php

  1. <?php  
  2.   
  3. /** 
  4.  * 需求以下: 
  5.  *  一、在文章列表中的第三、6位置插入新的文章 
  6.  *  二、插入的新文章不能出如今文章列表中的頭部和尾部 
  7.  *  三、文章列表中輪詢顯示最新發布的前10篇新文章(即:插入的新文章),每次顯示2篇 
  8.  *  四、若是新文章數量不小於10篇,那麼則輪詢顯示;反之則只顯示一遍 
  9.  * 
  10.  **/  
  11.   
  12. $pageNumber = $this->input->get_post("pageNumber",true);//上拉、下拉次數  
  13.   
  14. $contentList = $this->article_model->getArticleByCategory2($cateId, 0, $offset);//$offset=8  
  15. $contentList = $this->_getContentList($contentList);//文章列表  
  16.   
  17. $cache_num = 10;    //緩存最新的10條新文章到mc  
  18. $size = 2;          //每次從mc獲取2篇新文章  
  19. $max_times = $cache_num/$size;//5次取完  
  20.   
  21. if($pageNumber <= $max_times){//下拉上拉次數小於等於5的狀況,好比:"一、二、三、四、五、..."  
  22.     $offset_1 = ($pageNumber - 1) * $size;//查詢的開始位置,好比:"0、二、四、六、8"  
  23. }else{  
  24.     if($pageNumber % $max_times){//下拉上拉次數大於5而且不能被5整除的狀況,好比:"六、七、八、九、十一、..."  
  25.         $num = $this->article_model->getPublishCountArticleByCategory($cateId);//獲取mc中數據量  
  26.         if($num >= $cache_num){//mc中新文章大於等於10篇的狀況  
  27.             $offset_1 = ($pageNumber % $max_times - 1) * $size;//輪詢  
  28.         }else{//mc中新文章小於10篇的狀況  
  29.             $offset_1 = $max_times * 2;//不輪詢  
  30.         }  
  31.     }else{//下拉上拉次數大於5而且正好能被5整除的狀況,好比:"十、1五、20、2五、30、..."  
  32.         $num = $this->article_model->getPublishCountArticleByCategory($cateId);//獲取mc中數據量  
  33.         if($num >= $cache_num){//mc中新文章大於等於10篇的狀況  
  34.             $offset_1 = $cache_num - $size;//輪詢  
  35.         }else{//mc中新文章小於10篇的狀況  
  36.             $offset_1 = $max_times * 2;//不輪詢  
  37.         }  
  38.           
  39.     }  
  40. }  
  41.   
  42. $publishList = $this->article_model->getPublishArticleByCategory($cateId, $offset_1,$size,$cache_num);//隨機獲取兩條新文章  
  43. $publishList = $this->_getPublishList($publishList);//從mc中獲取2篇新文章插入到文章列表中  
  44. $content_count = count($contentlist);  
  45. $publish_count = count($publishlist);  
  46. if(!empty($publishList)){//三、6位置是預留位置  
  47.     if( ($content_count >= 3) && ($publish_count >= 1) ){  
  48.         $publishList_new[0] = $publishList[0];//組裝成一個二維數組  
  49.         array_splice($contentList,3-1,0,$publishList_new);//第3的位置(索引爲3-1)插入第1篇新文章  
  50.     }  
  51.   
  52.     if( ($content_count >= 6) && ($publish_count >= 2) ){  
  53.         $publishList_new[0] = $publishList[1];//組裝成一個二維數組  
  54.         array_splice($contentList,6-1,0,$publishList_new);//第6的位置(索引爲6-1)插入第2篇新文章  
  55.     }  
  56. }  
  57.   
  58. ?>  

 

 

二、如何刪除兩個數組中有交集的元素?html

 
  1. foreach($content_list_temp_recommend as $k=>$v){  
  2.     $kk=array_search($v['aid'], $aid_arr_temp);//$v['aid']一定是$aid_arr_temp數組內元素之一的狀況  
  3.     $msg.=$aid_arr_temp[$kk].",";  
  4.     if($kk !== false){//只要不是false就是找到了  
  5.         unset($aid_arr_temp[$kk]);//刪除後,索引鍵保持不變  
  6.     }  
  7. }  
  8. $aid_arr=  array_values($aid_arr_temp);//通過array_values()函數處理事後,索引鍵從新分配。  

三、如何在數組頭部和尾部及任意位置插入元素?前端

 
  1. ①插入元素  
  2. array_unshift();//在數組頭部插入一個或多個元素    
  3. array_push();//在數組尾部插入一個或多個元素   
  4. array_splice($arr,$start,0,$arr1);//在數組的第$start+1個位置插入新元素(指的是頭部和中部任意位置,但不包括尾部),注意:參數3必定要是0  
  5. ②刪除元素  
  6. array_shift();//刪除數組中首個元素,並返回刪除後的值  
  7. array_pop();//刪除數組的最後一個元素(出棧),並返回刪除後的值  

 

 

四、如何將二位數組按某一個或多個字段值(升序/降序)排序?數字索引被重置,關聯索引保持不變java

 
  1. $arr=array(  
  2.     array('id'=>1,'name'=>'will','age'=>23),  
  3.     array('id'=>2,'name'=>'myth','age'=>32),  
  4.     array('id'=>3,'name'=>'allen','age'=>27),  
  5.     array('id'=>4,'name'=>'martin','age'=>23)  
  6. );  
  7.   
  8. foreach($arr as $k=>$v){  
  9.     $tag1[]=$v['age']; //age排序字段  
  10.     $tag2[]=$v['id'];  //id排序字段  
  11. }  
  12. //至關於 select * from $arr order by $tag1 DESC,$tag2 ASC;//特色:$tag一、$tag二、$arr數組的元素個數必需要一致  
  13. array_multisort($tag1,SORT_DESC,$tag2,SORT_ASC,$arr);//根據年齡從大到小排列,年齡相同則按id升序排列  
  14.   
  15. echo "<pre>";print_r($arr);exit;  
  16. ?>  

 

<?php  
  1. //php二維數組如何按照指定列進行排序?  
  2. function arrSortByField(&$list, $field, $call_func=NULL, $sort_type=SORT_ASC){//引用傳值  
  3.     $sort_filed = array();  
  4.     foreach ($list as $val) {  
  5.         if (!isset($val[$field])) return false;  
  6.         $sort_filed[] = is_null($call_func) ? $val[$field] : call_user_func($call_func,$val[$field]);  
  7.     }   
  8.     return array_multisort($sort_field,$sort_type,$list);//$list順序會隨$sort_field順序變化而變化  
  9. }  
  10.   
  11. $list= array(  
  12.     array('id' =>3, 'name' => 'asdfsdf'),  
  13.     array('id' =>1, 'name' => '12'),  
  14.     array('id' =>4, 'name' => '10sdf'),  
  15.     array('id' =>2, 'name' => 'ada'),  
  16.     array('id' =>5, 'name' => 'aasdfbc')  
  17. );  
  18.   
  19. arrSortByField($list,'name','strlen');//按照 "name" 列的值長度進行排序  
  20. echo "<pre>";print_r($list);  
  21. arrSortByField($list,'id');//按照 "id" 列的值大小進行排序  
  22. echo "<pre>";print_r($list);  
  23.   
  24.   
  25. ?>  

 

五、APP版本號的比web

 
  1. <?php  
  2. header("content-type:text/html;charset=utf-8");  
  3. date_default_timezone_set('Asia/Shanghai');  
  4.   
  5. function _diffVersion($current,$update){  
  6.         if($current == "null"){  
  7.                 return false;  
  8.         }  
  9.   
  10.     $currentVersion = getVersion($current);  
  11.     $updateVersion = getVersion($update);  
  12.   
  13.     if($currentVersion['mainVersion'] < $updateVersion['mainVersion']){  
  14.         return true;  
  15.     }else if($currentVersion['mainVersion'] == $updateVersion['mainVersion']){  
  16.         if($currentVersion['minVersion'] < $updateVersion['minVersion']){  
  17.             return true;  
  18.         }else if($currentVersion['minVersion'] > $updateVersion['minVersion']){  
  19.             return false;  
  20.         }  
  21.   
  22.         if($currentVersion['fixVersion'] < $updateVersion['fixVersion']){  
  23.             return true;  
  24.         }  
  25.     }  
  26.   
  27.     return false;  
  28. }  
  29.   
  30. function getVersion($version){  
  31.     $result = array();  
  32.     if(strstr($version,".")){  
  33.         $data = explode(".",$version);  
  34.         $result['mainVersion'] = $data[0];  
  35.         if(isset($data[1])){  
  36.             $result['minVersion'] = $data[1];  
  37.         }else{  
  38.             $result['minVersion'] = 0;  
  39.         }  
  40.   
  41.         if(isset($data[2])){  
  42.             $result['fixVersion'] = $data[2];  
  43.         }else{  
  44.             $result['fixVersion'] = 0;  
  45.         }  
  46.     }  
  47.   
  48.     return $result;  
  49. }  
  50.   
  51.   
  52. echo "<pre>";print_r(_diffVersion("2.0.0","2.0.01"));//true-須要升級  false-不升級  
  53.   
  54. ?>  

六、獲取視頻封面圖面試

 
  1. <?php  
  2. header("content-type:text/html;charset=utf-8");  
  3. date_default_timezone_set('Asia/Shanghai');  
  4.   
  5. function getCoverImages($fileUrl){  
  6.         $result = array();  
  7.   
  8.         if(!empty($fileUrl)){  
  9.             $filePath = str_replace("http://img.baidu.cn/", "/data/images/", $fileUrl);  
  10.             if(is_file($filePath)){  
  11.                 $result = execCommandLine($filePath);  
  12.             }  
  13.         }  
  14.         return json_encode($result);  
  15.     }  
  16.   
  17.     function execCommandLine($file){  
  18.         $result = array();  
  19.   
  20.         $pathParts = pathinfo($file);  
  21.         $filename = $pathParts['dirname']."/".$pathParts['filename']."_";  
  22.   
  23.         $times = array(8,15,25);  
  24.         foreach ($times as $k => $v) {  
  25.             $destFilePath = $filename.$v.".jpg";  
  26.             $command = "/usr/bin/ffmpeg -i {$file} -y -f image2 -ss {$v} -vframes 1 -s 640x360 {$destFilePath}";  
  27.             exec($command);  
  28.             //chmod($filename.$v."jpg",0644);  
  29.             $destUrlPath = str_replace("/data/images/", "http://img.baidu.cn/", $destFilePath);  
  30.             $selected = $k == 0 ? "1" : "0";//默認將第一張圖片做爲封面圖  
  31.             array_push($result,array($destUrlPath,$selected));  
  32.         }  
  33.   
  34.         return $result;  
  35.     }  
  36.   
  37. $fileUrl="http://img.baidu.cn/14221916FLVSDT1.mp4"  
  38. getCoverImages($fileUrl);//截取第八、1五、25秒爲封面圖  
  39.   
  40. ?>  

七、php加密解密:php加密和解密函數一般能夠用來加密一些有用的字符串存放在數據庫裏或做爲各個子系統間同步登錄的令牌,而且經過解密算法解密字符串,該函數使用了base64和MD5加密和解密。算法

①第一種加密解密算法sql

 

 
  1. <?php  
  2. function encryptDecrypt($key, $string, $decrypt){   
  3.     if($decrypt){   
  4.         $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");   
  5.         return $decrypted;   
  6.     }else{   
  7.         $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));   
  8.         return $encrypted;   
  9.     }   
  10. }   
  11.   
  12. //加密:"z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk="  
  13. echo encryptDecrypt('password', 'Helloweba歡迎您',0);   
  14. //解密:"Helloweba歡迎您"  
  15. echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1);  
  16. ?>  

②第二種加密解密算法:數據庫

 
  1. <?php  
  2. //加密函數  
  3. function lock_url($txt,$key='www.zhuoyuexiazai.com'){  
  4.     $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
  5.     $nh = rand(0,64);  
  6.     $ch = $chars[$nh];  
  7.     $mdKey = md5($key.$ch);  
  8.     $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
  9.     $txt = base64_encode($txt);  
  10.     $tmp = '';  
  11.     $i=0;$j=0;$k = 0;  
  12.     for ($i=0; $i<strlen($txt); $i++) {  
  13.         $k = $k == strlen($mdKey) ? 0 : $k;  
  14.         $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;  
  15.         $tmp .= $chars[$j];  
  16.     }  
  17.     return urlencode($ch.$tmp);  
  18. }  
  19. //解密函數  
  20. function unlock_url($txt,$key='www.zhuoyuexiazai.com'){  
  21.     $txt = urldecode($txt);  
  22.     $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
  23.     $ch = $txt[0];  
  24.     $nh = strpos($chars,$ch);  
  25.     $mdKey = md5($key.$ch);  
  26.     $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
  27.     $txt = substr($txt,1);  
  28.     $tmp = '';  
  29.     $i=0;$j=0; $k = 0;  
  30.     for ($i=0; $i<strlen($txt); $i++) {  
  31.         $k = $k == strlen($mdKey) ? 0 : $k;  
  32.         $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);  
  33.         while ($j<0) $j+=64;  
  34.         $tmp .= $chars[$j];  
  35.     }  
  36.     return base64_decode($tmp);  
  37. }  
  38. ?>  
③第三種加密解密算法:

 

 
  1. <?php  
  2.   
  3. //改進後的算法  
  4. //加密函數  
  5. function lock_url($txt,$key='zhuoyuexiazai'){  
  6.     $txt = $txt.$key;  
  7.     $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
  8.     $nh = rand(0,64);  
  9.     $ch = $chars[$nh];  
  10.     $mdKey = md5($key.$ch);  
  11.     $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
  12.     $txt = base64_encode($txt);  
  13.     $tmp = '';  
  14.     $i=0;$j=0;$k = 0;  
  15.     for ($i=0; $i<strlen($txt); $i++) {  
  16.         $k = $k == strlen($mdKey) ? 0 : $k;  
  17.         $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;  
  18.         $tmp .= $chars[$j];  
  19.     }  
  20.     return urlencode(base64_encode($ch.$tmp));  
  21. }  
  22. //解密函數  
  23. function unlock_url($txt,$key='zhuoyuexiazai'){  
  24.     $txt = base64_decode(urldecode($txt));  
  25.     $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
  26.     $ch = $txt[0];  
  27.     $nh = strpos($chars,$ch);  
  28.     $mdKey = md5($key.$ch);  
  29.     $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
  30.     $txt = substr($txt,1);  
  31.     $tmp = '';  
  32.     $i=0;$j=0; $k = 0;  
  33.     for ($i=0; $i<strlen($txt); $i++) {  
  34.         $k = $k == strlen($mdKey) ? 0 : $k;  
  35.         $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);  
  36.         while ($j<0) $j+=64;  
  37.         $tmp .= $chars[$j];  
  38.     }  
  39.     return trim(base64_decode($tmp),$key);  
  40. }  
  41.   
  42. ?>  
④第四種加密解密算法:

 

 
  1. <?php  
  2.   
  3. function passport_encrypt($txt, $key = 'www.zhuoyuexiazai.com') {   
  4.     srand((double)microtime() * 1000000);   
  5.     $encrypt_key = md5(rand(0, 32000));   
  6.     $ctr = 0;   
  7.     $tmp = '';   
  8.     for($i = 0;$i < strlen($txt); $i++) {   
  9.     $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;   
  10.     $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);   
  11.     }   
  12.     return urlencode(base64_encode(passport_key($tmp, $key)));   
  13. }   
  14.   
  15. function passport_decrypt($txt, $key = 'www.zhuoyuexiazai.com') {   
  16.     $txt = passport_key(base64_decode(urldecode($txt)), $key);   
  17.     $tmp = '';   
  18.     for($i = 0;$i < strlen($txt); $i++) {   
  19.     $md5 = $txt[$i];   
  20.     $tmp .= $txt[++$i] ^ $md5;   
  21.     }   
  22.     return $tmp;   
  23. }   
  24.   
  25. function passport_key($txt, $encrypt_key) {   
  26.     $encrypt_key = md5($encrypt_key);   
  27.     $ctr = 0;   
  28.     $tmp = '';   
  29.     for($i = 0; $i < strlen($txt); $i++) {   
  30.     $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;   
  31.     $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];   
  32.     }   
  33.     return $tmp;   
  34. }   
  35.    
  36.   
  37. $txt = "1";   
  38. $key = "testkey";   
  39. $encrypt = passport_encrypt($txt,$key);   
  40. $decrypt = passport_decrypt($encrypt,$key);   
  41.   
  42. echo $encrypt."<br>";   
  43. echo $decrypt."<br>";   
  44.   
  45. ?>   
⑤第五種加密解密算法:discuz中使用的加密解密算法

 

項目中有時咱們須要使用PHP將特定的信息進行加密,也就是經過加密算法生成一個加密字符串,這個加密後的字符串能夠經過解密算法進行解密,便於程序對解密後的信息進行處理。最多見的應用在用戶登陸以及一些API數據交換的場景。最多見的應用在用戶登陸以及一些API數據交換的場景。加密解密原理通常都是經過必定的加密解密算法,將密鑰加入到算法中,最終獲得加密解密結果。

 

 
  1. <?php  
  2. //很是給力的authcode加密函數,Discuz!經典代碼(帶詳解)  
  3. //函數authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。  
  4. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {     
  5.     // 動態密匙長度,相同的明文會生成不一樣密文就是依靠動態密匙     
  6.     $ckey_length = 4;     
  7.          
  8.     // 密匙     
  9.     $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);     
  10.          
  11.     // 密匙a會參與加解密     
  12.     $keya = md5(substr($key, 0, 16));     
  13.     // 密匙b會用來作數據完整性驗證     
  14.     $keyb = md5(substr($key, 16, 16));     
  15.     // 密匙c用於變化生成的密文     
  16.     $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';     
  17.     // 參與運算的密匙     
  18.     $cryptkey = $keya.md5($keya.$keyc);     
  19.     $key_length = strlen($cryptkey);     
  20.     // 明文,前10位用來保存時間戳,解密時驗證數據有效性,10到26位用來保存$keyb(密匙b),   
  21.     //解密時會經過這個密匙驗證數據完整性     
  22.     // 若是是解碼的話,會從第$ckey_length位開始,由於密文前$ckey_length位保存 動態密匙,以保證解密正確     
  23.     $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :  sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;     
  24.     $string_length = strlen($string);     
  25.     $result = '';     
  26.     $box = range(0, 255);     
  27.     $rndkey = array();     
  28.     // 產生密匙簿     
  29.     for($i = 0; $i <= 255; $i++) {     
  30.         $rndkey[$i] = ord($cryptkey[$i % $key_length]);     
  31.     }     
  32.     // 用固定的算法,打亂密匙簿,增長隨機性,好像很複雜,實際上對並不會增長密文的強度     
  33.     for($j = $i = 0; $i < 256; $i++) {     
  34.         $j = ($j + $box[$i] + $rndkey[$i]) % 256;     
  35.         $tmp = $box[$i];     
  36.         $box[$i] = $box[$j];     
  37.         $box[$j] = $tmp;     
  38.     }     
  39.     // 核心加解密部分     
  40.     for($a = $j = $i = 0; $i < $string_length; $i++) {     
  41.         $a = ($a + 1) % 256;     
  42.         $j = ($j + $box[$a]) % 256;     
  43.         $tmp = $box[$a];     
  44.         $box[$a] = $box[$j];     
  45.         $box[$j] = $tmp;     
  46.         // 從密匙簿得出密匙進行異或,再轉成字符     
  47.         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));     
  48.     }     
  49.     if($operation == 'DECODE') {    
  50.         // 驗證數據有效性,請看未加密明文的格式     
  51.         if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&  substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {     
  52.             return substr($result, 26);     
  53.         } else {     
  54.             return '';     
  55.         }     
  56.     } else {     
  57.         // 把動態密匙保存在密文裏,這也是爲何一樣的明文,生產不一樣密文後能解密的緣由     
  58.         // 由於加密後的密文多是一些特殊字符,複製過程可能會丟失,因此用base64編碼     
  59.         return $keyc.str_replace('=', '', base64_encode($result));     
  60.     }     
  61. }   
  62.   
  63. $str = 'abcdef';   
  64. $key = 'www.helloweba.com';   
  65. echo authcode($str,'ENCODE',$key,0); //加密   
  66. $str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';   
  67. echo authcode($str,'DECODE',$key,0); //解密   
  68.   
  69. ?>  
⑥第六種加密解密算法:

 

 
  1. <?php  
  2. //函數encrypt($string,$operation,$key)中$string:須要加密解密的字符串;$operation:判斷是加密仍是解密,E表示加密,D表示解密;$key:密匙。  
  3. function encrypt($string,$operation,$key=''){   
  4.     $key=md5($key);   
  5.     $key_length=strlen($key);   
  6.       $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;   
  7.     $string_length=strlen($string);   
  8.     $rndkey=$box=array();   
  9.     $result='';   
  10.     for($i=0;$i<=255;$i++){   
  11.            $rndkey[$i]=ord($key[$i%$key_length]);   
  12.         $box[$i]=$i;   
  13.     }   
  14.     for($j=$i=0;$i<256;$i++){   
  15.         $j=($j+$box[$i]+$rndkey[$i])%256;   
  16.         $tmp=$box[$i];   
  17.         $box[$i]=$box[$j];   
  18.         $box[$j]=$tmp;   
  19.     }   
  20.     for($a=$j=$i=0;$i<$string_length;$i++){   
  21.         $a=($a+1)%256;   
  22.         $j=($j+$box[$a])%256;   
  23.         $tmp=$box[$a];   
  24.         $box[$a]=$box[$j];   
  25.         $box[$j]=$tmp;   
  26.         $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));   
  27.     }   
  28.     if($operation=='D'){   
  29.         if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){   
  30.             return substr($result,8);   
  31.         }else{   
  32.             return'';   
  33.         }   
  34.     }else{   
  35.         return str_replace('=','',base64_encode($result));   
  36.     }   
  37. }   
  38.   
  39. $str = 'abc';   
  40. $key = 'www.helloweba.com';   
  41. $token = encrypt($str, 'E', $key);   
  42. echo '加密:'.encrypt($str, 'E', $key);   
  43. echo '解密:'.encrypt($str, 'D', $key);  
  44.   
  45. ?>  

 

八、php如何方式SQL注入?咱們在查詢數據庫時,出於安全考慮,須要過濾一些非法字符防止SQL惡意注入

 

 
  1. <?php  
  2. //咱們在查詢數據庫時,出於安全考慮,須要過濾一些非法字符防止SQL惡意注入  
  3. function injCheck($sql_str) {    
  4.     $check = preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/', $sql_str);   
  5.     if ($check) {   
  6.         echo '非法字符!!';   
  7.         exit;   
  8.     } else {   
  9.         return $sql_str;   
  10.     }   
  11. }  
  12.   
  13. echo injCheck('1 or 1=1');//提示:"非法字符!!"  
  14.   
  15. ?>  

九、php如何將模板標籤替換爲指定的內容?

 

 
  1. <?php  
  2.   
  3. //有時咱們須要將字符串、模板標籤替換成指定的內容,能夠用到下面的函數:  
  4. function stringParser($string,$replacer){   
  5.     $result = str_replace(array_keys($replacer), array_values($replacer),$string);   
  6.     return $result;   
  7. }   
  8.   
  9. $string = 'The {b}anchor text{/b} is the {b}actual word{/b} or words used {br}to describe the link {br}itself';   
  10. $replace_array = array('{b}' => '<b>','{/b}' => '</b>','{br}' => '<br />');   
  11.    
  12. echo stringParser($string,$replace_array);   
  13.   
  14. ?>  
十、php如何獲取當前頁面的url?如:"https://www.baidu.com/index.php?username=xiaoqiang"
 
  1. <?php  
  2. //如下函數能夠獲取當前頁面的URL,不論是http仍是https  
  3. function curPageURL() {   
  4.     $pageURL = 'http';   
  5.     if (!empty($_SERVER['HTTPS'])) {$pageURL .= "s";}   
  6.     $pageURL .= "://";   
  7.     if ($_SERVER["SERVER_PORT"] != "80") {   
  8.         $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];   
  9.     } else {   
  10.         $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];   
  11.     }   
  12.     return $pageURL;   
  13. }   
  14.   
  15. echo curPageURL();   
  16.   
  17. ?>  
十一、php如何強制下載文件?

 

 
  1. <?php  
  2. //有時咱們不想讓瀏覽器直接打開文件,如PDF文件,而是要直接下載文件,那麼如下函數能夠強制下載文件,函數中使用了application/octet-stream頭類型  
  3. function download($filename){   
  4.     if ((isset($filename))&&(file_exists($filename))){   
  5.        header("Content-length: ".filesize($filename));   
  6.        header('Content-Type: application/octet-stream');   
  7.        header('Content-Disposition: attachment; filename="' . $filename . '"');   
  8.        readfile("$filename");   
  9.     } else {   
  10.        echo "Looks like file does not exist!";   
  11.     }   
  12. }   
  13.   
  14. download('/down/test_45f73e852.zip');  
  15.   
  16. ?>  

十二、php截取字符串長度(含中文)

 

 
  1. <?php  
  2.   
  3. //咱們常常會遇到須要截取字符串(含中文漢字)長度的狀況,好比標題顯示不能超過多少字符,超出的長度用...表示,如下函數能夠知足你的需求  
  4. /*  
  5.  Utf-八、gb2312都支持的漢字截取函數  
  6.  cut_str(字符串, 截取長度, 開始長度, 編碼);  
  7.  編碼默認爲 utf-8  
  8.  開始長度默認爲 0  
  9. */   
  10. function cutStr($string, $sublen, $start = 0, $code = 'UTF-8'){   
  11.     if($code == 'UTF-8'){   
  12.         $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/";   
  13.         preg_match_all($pa, $string, $t_string);   
  14.    
  15.         if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."...";   
  16.         return join('', array_slice($t_string[0], $start, $sublen));   
  17.     }else{   
  18.         $start = $start*2;   
  19.         $sublen = $sublen*2;   
  20.         $strlen = strlen($string);   
  21.         $tmpstr = '';   
  22.    
  23.         for($i=0; $i<$strlen; $i++){   
  24.             if($i>=$start && $i<($start+$sublen)){   
  25.                 if(ord(substr($string, $i, 1))>129){   
  26.                     $tmpstr.= substr($string, $i, 2);   
  27.                 }else{   
  28.                     $tmpstr.= substr($string, $i, 1);   
  29.                 }   
  30.             }   
  31.             if(ord(substr($string, $i, 1))>129) $i++;   
  32.         }   
  33.         if(strlen($tmpstr)<$strlen ) $tmpstr.= "...";   
  34.         return $tmpstr;   
  35.     }   
  36. }   
  37.   
  38. $str = "jQuery插件實現的加載圖片和頁面效果";   
  39. echo cutStr($str,16);//結果:jQuery插件實現的加載圖片和...  
  40.   
  41. ?>  
1三、php如何獲取客戶端真實IP?

 

 
  1. <?php  
  2.   
  3. //咱們常常要用數據庫記錄用戶的IP,如下代碼能夠獲取客戶端真實的IP:  
  4. //獲取用戶真實IP   
  5. function getIp() {   
  6.     if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))   
  7.         $ip = getenv("HTTP_CLIENT_IP");   
  8.     else   
  9.         if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))   
  10.             $ip = getenv("HTTP_X_FORWARDED_FOR");   
  11.         else   
  12.             if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))   
  13.                 $ip = getenv("REMOTE_ADDR");   
  14.             else   
  15.                 if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))   
  16.                     $ip = $_SERVER['REMOTE_ADDR'];   
  17.                 else   
  18.                     $ip = "unknown";   
  19.     return ($ip);   
  20. }   
  21.   
  22. echo getIp();//結果:您的IP是:221.223.234.138  
  23.   
  24. ?>  
1四、php如何記錄日誌信息到文件中?

 

 
  1. <?php  
  2.   
  3. //咱們在測試代碼的時候,須要瞭解代碼執行狀況,而這中執行時在後臺運行的,前臺沒法知道是否運行正常,在這種狀況下,咱們通常用寫日誌的形式來調試代碼。  
  4. function logResult($str='') {   
  5.     $fp = fopen("log.txt","a");   
  6.     flock($fp, LOCK_EX) ;   
  7.     fwrite($fp,"執行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$str."\n");   
  8.     flock($fp, LOCK_UN);   
  9.     fclose($fp);   
  10. }   
  11.   
  12. //函數logResult()記錄執行時間,參數$str自定義,執行時會將運行日誌寫入到log.txt文件中,注意log.txt要有寫權限。好比咱們想知道支付接口返回的數據信息,能夠這樣調用:  
  13. logResult('獲取數據reselt=xxx');  
  14.   
  15. ?>  

1五、php如何防止重複提交表單?

咱們提交表單的時候,不能忽視的一個限制是防止用戶重複提交表單,由於有可能用戶連續點擊了提交按鈕或者是攻擊者惡意提交數據,那麼咱們在提交數據後的處理如修改或添加數據到數據庫時就會惹上麻煩。

那麼如何規避這中重複提交表單的現象出現呢?咱們能夠從不少方面入手,首先從前端作限制。前端JavaScript在按鈕被點擊一次後禁用,即disabled,這個方法簡單的防止了屢次點擊提交按鈕,可是缺點是若是用戶禁用了javascript腳本則失效。第二,咱們能夠在提交後作redirect頁面重定向,即提交後跳轉到新的頁面,主要避免F5重複提交,可是也有不足之處。第三,就是數據庫作惟一索引約束。第四,就是作session令牌驗證。

咱們如今來了解下簡單的利用session token來防止表單重複提交的方法。

咱們在表單中加一個input隱藏域,即type="hidden",其value值用來保存token值,當頁面刷新的時候這個token值會變化,提交後判斷token值是否正確,若是前臺提交的token與後臺不匹配,則認爲是重複提交。

 

 
  1. <?php   
  2.   
  3. /*  
  4. * PHP簡單利用token防止表單重複提交  
  5. */   
  6. session_start();   
  7. header("Content-Type: text/html;charset=utf-8");   
  8. function set_token() {   
  9.     $_SESSION['token'] = md5(microtime(true));   
  10. }   
  11.    
  12. function valid_token() {   
  13.     $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;   
  14.     set_token();   
  15.     return $return;   
  16. }   
  17.    
  18. //若是token爲空則生成一個token   
  19. if(!isset($_SESSION['token']) || $_SESSION['token']=='') {   
  20.     set_token();   
  21. }   
  22.    
  23. if(isset($_POST['web'])){   
  24.     if(!valid_token()){   
  25.         echo "token error,請不要重複提交!";   
  26.     }else{   
  27.         echo '成功提交,Value:'.$_POST['web'];   
  28.     }   
  29. }else{   
  30. ?>   
  31.     <form method="post" action="">     
  32.         <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">     
  33.         <input type="text" class="input" name="web" value="www.helloweba.com">     
  34.         <input type="submit" class="btn" value="提交" />     
  35.     </form>   
  36. <?php       
  37. }   
  38. ?>   
以上是一個簡單的防止重複提交表單的例子,僅供參考。那麼實際項目開發中,會對錶單token作更復雜的處理,即咱們說的令牌驗證。可能要作的處理有:驗證來源域,即來路,是否爲外部提交;匹配要執行的動做,是添加、修改or刪除;其次最重要的是構建token,token能夠採用可逆的加密算法,儘量複雜,由於明文仍是不安全的。令牌驗證的具體算法能夠參考各大PHP框架,如ThinkPHP提供了很好的令牌驗證功能。
相關文章
相關標籤/搜索